Kubernetes
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>