Apprendre à utiliser Kubernetes


C'est un logiciel gérant des conteneurs de plusieurs type dont par défaut Docker. Sa force réside sur la méthode de communication via le protocole HTTP. Il est écrit en GO facilitant ainsi son déploiement vu qu'il embarque déjà toutes les dépendances dont-il a besoin.

C'est un outil que je suis découvre.

Mes tests sont effectué sur un hyperviseur KVM dont le dashboard, pourra se faire avec la commande suivante :

sudo ssh -L 127.0.0.1:80:192.168.42.37:30000 virt@192.168.2.25

192.168.42.37 étant l'adresse de l'instance. Ainsi, on pourra s'y rendre en local avec un navigateur http://127.0.0.1

Documentations :

Installation

Tout en quelques commandes :

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

Si on l'utilise comme supervisuer avec virtualbox, il n'y a rien d'autre à faire.

Sinon, si l'on souhaite utiliser KVM, alors c'est un peu plus compliqué :

apt install libvirt-clients libvirt-daemon-system
usermod -a -G libvirt $(whoami)
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && chmod +x docker-machine-driver-kvm2 && sudo mv docker-machine-driver-kvm2 /usr/local/bin/

Enfin on pourra lancer la machine virtuelle avec la commande ci-dessous :

minikube start --vm-driver kvm2

Terminologies

  • Pod : ensemble de conteneurs disponible sur une machine ?
  • Service : ensemble de conteneur délivrant le même service

Aspects

  1. Il est important dans un 1er temps de passer par l'étape du 'deploiement' puis de la mise en place du conteneur.
  2. Les logs se situe dans /var/log/libvirt/qemu/minikube.log
  3. Fichiers de configuration :
    • .minikube/profiles/minikube/config.json

Liste de commandes

  • Démarrer l'instance
minikube start --vm-driver=virtualbox
minikube start --vm-driver=kvm2
  • Infos
kubectl get nodes
kubectl get deployments
kubectl get service
kubectl get pods
kubectl get all
kubectl describe pod mon-pod
kubectl config view
kubectl cluster-info dump
kubectl get pods -all-namespaces
  • Déployer
kubectl run hello-minikube --image=objectiflibre/nginx-demo:blue --port=80
kubectl run my-shell --rm -i --tty --image ubuntu -- bash
kubectl apply -f nginx-deployment.yml
  • Update
kubectl set image deployment/nginx-deployment  nginx=objectiflibre/nginx-demo:blue
kubectl get rs -w
  • Undo
kubectl rollout undo deployment/nginx-deployment
  • Intéractions
kubectl exec -it shell-demo -- /bin/bash
kubectl expose deployment hello-minikube --type=NodePort
kubectl port-forward my-pod 5000:6000
kubectl edit -f deploy.yaml
kubectl scale deployment nginx-deployment --replicas=5
./minikube ssh
  • Suppressions
kubectl delete deployment hello-minikube
kubectl delete pods --all
kubectl delete pods --all --grace-period=0 --force
kubectl delete pods <pod> --grace-period=0 --force
minikube stop
minikube delete

scripts

  • Déployer un service
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
  externalIPs:
  - 80.11.12.10

Cliquez pour afficher ⇲

Cliquez pour masquer ⇱

Point de montage en local :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 100Gi
  # volumeMode field requires BlockVolume Alpha feature gate to be enabled.
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/ssd1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - example-node

Point de montage NFS :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: 172.17.0.2
apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  # These containers are run during pod initialization
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://kubernetes.io
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}