Kubernetes

chmux
30 avril 2021

Kubernetes est un système open source qui vise à fournir une « plate-forme permettant d’automatiser le déploiement, la montée en charge et la mise en œuvre de conteneurs d’application sur des clusters de serveurs ».

Exemple de déploiement d’une application web (wordpress) avec Kub à l’aide de manifest (nommé deployment_wordpress.yml) :

### Volume Front wordpress ###
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wordpress-front-pv
  namespace: wordpress
  labels:
    app: wordpress
    tier: front
    type: local
spec:
  storageClassName: wordpress-front-storageclassname
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/pi/kubernetes/wordpress/data_front"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-front-pvc
  namespace: wordpress
  labels:
    app: wordpress
    tier: front
spec:
  storageClassName: wordpress-front-storageclassname
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
### Volume DB wordpress ###
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wordpress-db-pv
  namespace: wordpress
  labels:
    app: wordpress
    tier: db
    type: local
spec:
  storageClassName: wordpress-db-storageclassname
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/pi/kubernetes/wordpress/data_db"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-db-pvc
  namespace: wordpress
  labels:
    app: wordpress
    tier: db
spec:
  storageClassName: wordpress-db-storageclassname
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
### Service Front wordpress ###
apiVersion: v1
kind: Service
metadata:
  name: wordpress-front
  namespace: wordpress
  labels:
    app: wordpress
    tier: front
spec:
  ports:
  - nodePort: 33380
    port: 80
  selector:
    app: wordpress
    tier: front
  type: NodePort
---
### Service DB wordpress ###
apiVersion: v1
kind: Service
metadata:
  name: wordpress-db
  namespace: wordpress
  labels:
    app: wordpress
    tier: db
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: db
  clusterIP: None
---
### Deployment Front wordpress ###
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-front
  namespace: wordpress
  labels:
    app: wordpress
    tier: front
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
      tier: front
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: front
    spec:
      containers:
      - image: wordpress:5
        name: wordpress-front
        volumeMounts:
        - mountPath: "/var/www/html"
          name: front-persistent-storage
        ports:
        - containerPort: 80
          name: http
      volumes:
      - name: front-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-front-pvc
---
### Deployment DB wordpress ###
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-db
  namespace: wordpress
  labels:
    app: wordpress
    tier: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
      tier: db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: db
    spec:
      containers:
      - image: linuxserver/mariadb:110.4.18mariabionic-ls15
        name: wordpress-db
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: secret-wordpress-db
              key: password
        volumeMounts:
        - mountPath: "/config/databases"
          name: db-persistent-storage
        ports:
        - containerPort: 3306
          name: mysql
      volumes:
      - name: db-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-db-pvc

Ce fichier permet de créer en totalité l’application (les volumes/services/déploiements).

On va créer un context pour ne pas avoir à spécifier le namespace par la suite :

pi@raspberrypi:~/kubernetes/wordpress $ kubectl config set-context wordpress --cluster=minikube --user=minikube
--namespace=wordpress
Context "wordpress" created.
pi@raspberrypi:~/kubernetes/wordpress $ kubectl config use-context wordpress
Switched to context "wordpress".
pi@raspberrypi:~/kubernetes/wordpress $ kubectl config get-contexts
CURRENT   NAME        CLUSTER    AUTHINFO   NAMESPACE
          minecraft   minikube   minikube   minecraft
          minikube    minikube   minikube   default
          tools       minikube   minikube   tools
*         wordpress   minikube   minikube   wordpress

Notre application utilise un mdp stocké dans un « Secret », il faut donc le créer d’abord (attention le mdp stocké dans le fichier doit être encodé en base64, pour se faire « echo leMDP | base64 ») :

pi@raspberrypi:~ $ kubectl create secret generic secret-wordpress-db --from-file=./password.txt
secret/secret-wordpress-db created

pi@raspberrypi:~ $ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-j5wvl   kubernetes.io/service-account-token   3      40d
secret-wordpress-db   Opaque                                1      6d23h

On applique la conf via « kubectl create -f deployment_wordpress.yml » (on peut utiliser « apply » dans le cas d’une modif de ce fichier ou « delete » pour supprimer la conf), on vérifie :

pi@raspberrypi:~/kubernetes/wordpress $ kubectl get all
NAME                                   READY   STATUS    RESTARTS   AGE
pod/wordpress-db-585474854-grfh2       1/1     Running   0          6d23h
pod/wordpress-front-6c69d6c6cd-bdmkb   1/1     Running   0          6d22h

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/wordpress-db      ClusterIP   None            <none>        3306/TCP       6d23h
service/wordpress-front   NodePort    10.109.226.76   <none>        80:33380/TCP   6d23h

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress-db      1/1     1            1           6d23h
deployment.apps/wordpress-front   1/1     1            1           6d23h

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/wordpress-db-585474854       1         1         1       6d23h
replicaset.apps/wordpress-front-6c69d6c6cd   1         1         1       6d23h

pi@raspberrypi:~/kubernetes/wordpress $ kubectl get persistentvolume
NAME                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                           STORAGECLASS                       REASON   AGE
wordpress-db-pv      1Gi        RWO            Retain           Bound    wordpress/wordpress-db-pvc      wordpress-db-storageclassname               6d23h
wordpress-front-pv   1Gi        RWO            Retain           Bound    wordpress/wordpress-front-pvc   wordpress-front-storageclassname            6d23h

pi@raspberrypi:~/kubernetes/wordpress $ kubectl get persistentvolumeclaims
NAME                  STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS                       AGE
wordpress-db-pvc      Bound    wordpress-db-pv      1Gi        RWO            wordpress-db-storageclassname      6d23h
wordpress-front-pvc   Bound    wordpress-front-pv   1Gi        RWO            wordpress-front-storageclassname   6d23h

Pour avoir plus de détails, on peut utiliser « escribe », exemple :

pi@raspberrypi:~/kubernetes/wordpress $ kubectl describe deployments wordpress-front
Name:               wordpress-front
Namespace:          wordpress
CreationTimestamp:  Fri, 23 Apr 2021 20:56:33 +0200
Labels:             app=wordpress
                    tier=front
Annotations:        deployment.kubernetes.io/revision: 1
Selector:           app=wordpress,tier=front
Replicas:           1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:       Recreate
MinReadySeconds:    0
Pod Template:
  Labels:  app=wordpress
           tier=front
  Containers:
   wordpress-front:
    Image:        wordpress:5
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /var/www/html from front-persistent-storage (rw)
  Volumes:
   front-persistent-storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  wordpress-front-pvc
    ReadOnly:   false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   wordpress-front-6c69d6c6cd (1/1 replicas created)
Events:          <none>