Kubernetes

Utilisation

Démarrer l’écriture d’un fichier YAML

Repartir d’un fichier existant :

kubectl get deployment my-cool-app -o yaml --export

Création de fichiers de templates :

kubectl run nginx --image=nginx -o yaml --dry-run
kubectl create service nodeport demo --tcp 80 -o yaml --dry-run

Ressources bloquées en suppression

Supprimer un pod qui ne veut pas se supprimer normalement :

kubectl delete --force --grace-period=0 pod my-blocked-pod

Déploiement

Par où commencer ?

Tester rapidement le cluster

kubectl run nginx --image=nginx --port=80 --replicas=3
kubectl expose deployment nginx --type NodePort
curl "$(kubectl get svc nginx -o jsonpath='{ .spec.clusterIP }')"

Intégration avec OpenStack

Il faut créer un fichier /etc/kubernetes/cloud_config :

[Global]
auth-url=http://openstack.example:35357/v3
username=kubernetes
password=password
region=RegionOne
tenant-id=kubernetes-tenant-id
domain-name=Default

Apports :

  • Création de volume persitants avec Cinder

kube-router

kube-router permet une gestion unifié du réseau dans Kubernetes :

  • Gestion des NetworkPolicies
  • Exposition de services (remplace kube-proxy)
  • Routage du traffic des pods avec BGP (routage global des IPs des pods)
  • Routage des ClusterIPs et des ExternalIPs des services avec BGP

Le déploiement de kube-router peut se faire de plusieurs manières. Voici les options pour le lancer en mode agent en activant le peering BGP :

# kube-router \
    --master=http://127.0.0.1:8080/ \
    --run-firewall=true \
    --run-service-proxy=true \
    --run-router=true \
    --cluster-asn=65001 \
    --peer-router-ips=192.168.8.11 \
    --peer-router-asns=64512 \
    --advertise-external-ip \
    --advertise-cluster-ip

Deux options doivent être ajoutées au controller-manager pour fonctionner :

  • --allocate-node-cidrs=true
  • --cluster-cidr=10.1.0.0/16

kube-router utilise le CNI bridge pour fonctionner. Il faut que le fichier /etc/cni/net.d/10-kuberouter.conf soit présent sur la machine :

# cat > /etc/cni/net.d/10-kuberouter.conf <<EOF
{
    "name":"mynet",
    "type":"bridge",
    "bridge":"kube-bridge",
    "isDefaultGateway":true,
    "ipam": {
        "type":"host-local"
     }
}
EOF

Intégration avec Hashicorp Vault

Vault permet de s’authentifier grâce au service account de Kubernetes.

Création d’un service account :

$ kubectl create serviceaccount vault-token-reviewer
$ kubectl get sa vault-token-reviewer -o jsonpath='{ .secrets[0].name }'
vault-token-reviewer-token-xxxxx

Récupérer les informations d’authentification :

$ kubectl get secret -o jsonpath='{ .data.token }' vault-token-reviewer-token-xxxxx | base64 -d > token
$ kubectl get secret -o jsonpath='{ .data.ca\.crt }' vault-token-reviewer-token-xxxxx | base64 -d > ca.crt

Configuration de vault :

$ vault auth enable kubernetes
$ vault write auth/kubernetes/config \
    token_reviewer_jwt=@token \
    kubernetes_host=https://192.168.99.100:8443 \
    kubernetes_ca_cert=@ca.crt

Création d’un compte de démo :

$ export VAULT_ADDR=http://127.0.0.1:8200
$ kubectl create serviceaccount vault-demo
$ vault write auth/kubernetes/role/demo \
      bound_service_account_names=vault-demo \
      bound_service_account_namespaces=default \
      policies=default \
      ttl=1h
$ vault write auth/kubernetes/login role=demo jwt=$SERVICE_ACCOUNT_TOKEN

Persistent local volume

Création du StorageClass :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

On crée un dossier sur l’hôte qu’on associe à un PV :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-001
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/kubernetes/pv-001
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values: [node-1]

On crée un PVC associé au PV :

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local-storage

Applications et plugins

Dashboard :

Stockage :

Réseau :

Monitoring :

Authentification :

Opérateurs :

CI/CD :

  • kubeval : validation de manifests kubernetes

Documentation

Générale

Développement