K3s
K3s par Rancher Labs est une version allégée de Kubernetes. Toutes les API/ressources ancestrales, ou les trucs expérimentaux, ne sont pas inclus. L'ensemble s'appuie sur des conteneurs gérés par containerd et non pas docker. Résultat, 512Mo de RAM sont seulement nécessaires.
J'ai donc monté un labo avec 3 raspberry pi 4, chacun disposant de 4Go de RAM. Largement suffisant.
Installation
Les 3 rpi tournent sous Raspbian. Il est vivement recommandé de couper l'ipv6, et d'avoir un bon fichier /etc/hosts et/ou DNS.
Il suffit ensuite de suivre la documentation K3s pour initiliser le master. Un token sera généré pour permettre l'initilisation des workers.
Il vaut mieux, pour éviter certaines erreurs ou d'avoir à préciser à chaque fois le fichier de conf de k3s, copier la conf k3s dans le fichier /root/.kube/config
Helm v3
Ne nécessite plus tiller. Il suffit de récuperer le binaire et de le déposer dans /usr/local/bin/
Helm v2 (deprecated)
Récupération de helm:
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get> install-helm.sh sh install-helm.sh
Le binaire helm devrait être installé. On prépare les comptes et ACL:
kubectl -n kube-system create serviceaccount tiller kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
Pour tiller, c'est un poil plus compliqué, car l'image par défaut est en x86, et pas pour ARM. Heureusement quelqu'un (merci Jesse Stuart) maintient des images ARM pour nous.
helm init --service-account tiller --tiller-image=jessestuart/tiller
Voilà !
root@athos:~# kubectl get all -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/coredns-b7464766c-njpv7 1/1 Running 4 22h 10.42.0.14 athos <none> <none> pod/helm-install-traefik-wpp59 0/1 Completed 0 22h 10.42.0.2 athos <none> <none> pod/svclb-traefik-482cr 2/2 Running 8 22h 10.42.0.13 athos <none> <none> pod/svclb-traefik-jnqzj 2/2 Running 8 22h 10.42.1.11 aramis <none> <none> pod/svclb-traefik-zsscj 2/2 Running 8 22h 10.42.2.6 porthos <none> <none> pod/tiller-deploy-7d776455bf-n9f5s 1/1 Running 0 9m11s 10.42.2.7 porthos <none> <none> pod/traefik-5c79b789c5-zjjbn 1/1 Running 4 22h 10.42.1.10 aramis <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 22h k8s-app=kube-dns service/tiller-deploy ClusterIP 10.43.235.0 <none> 44134/TCP 9m11s app=helm,name=tiller service/traefik LoadBalancer 10.43.211.106 192.168.2.105,192.168.2.142,192.168.2.189 80:32259/TCP,443:32497/TCP 22h app=traefik,release=traefik NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR daemonset.apps/svclb-traefik 3 3 3 3 3 <none> 22h lb-port-80,lb-port-443 rancher/klipper-lb:v0.1.1,rancher/klipper-lb:v0.1.1 app=svclb-traefik NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.apps/coredns 1/1 1 1 22h coredns coredns/coredns:1.3.0 k8s-app=kube-dns deployment.apps/tiller-deploy 1/1 1 1 9m11s tiller jessestuart/tiller app=helm,name=tiller deployment.apps/traefik 1/1 1 1 22h traefik traefik:1.7.12 app=traefik,release=traefik NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset.apps/coredns-b7464766c 1 1 1 22h coredns coredns/coredns:1.3.0 k8s-app=kube-dns,pod-template-hash=b7464766c replicaset.apps/tiller-deploy-7d776455bf 1 1 1 9m11s tiller jessestuart/tiller app=helm,name=tiller,pod-template-hash=7d776455bf replicaset.apps/traefik-5c79b789c5 1 1 1 22h traefik traefik:1.7.12 app=traefik,pod-template-hash=5c79b789c5,release=traefik NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR job.batch/helm-install-traefik 1/1 49s 22h helm rancher/klipper-helm:v0.1.5 controller-uid=af9453d7-d655-11e9-a0cb-dca632043ab1 root@athos:~#
NFS
Ajout du repo :
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
Deployement du nfs-subdir-external-provisioner :
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.3.127 --set nfs.path=/volume1/kubernetes
Pour définir la classe nfs-client comme storage class par défaut :
kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
NFS (obsolete)
Le nfs-client-provisioner est disponible dans le dépôt stable:
helm repo add stable https://charts.helm.sh/stable
Pour des tests, utilisation d'une classe de stockage utilisant un export NFS (depuis un NAS Synology).
helm install nfs --set nfs.server=192.168.2.127 --set nfs.path=/volume1/kubernetes --set image.repository=quay.io/external_storage/nfs-client-provisioner-arm stable/nfs-client-provisioner
Pour le fournisseur NFS (DEPRECATED) :
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nfs-client-provisioner spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner-arm:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: exaforge.com/whale - name: NFS_SERVER value: 192.168.2.127 - name: NFS_PATH value: /volume1/kubernetes volumes: - name: nfs-client-root nfs: server: 192.168.2.127 path: /volume1/kubernetes
Pour définir la classe de stockage NFS (DEPRECATED?) :
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" name: managed-nfs-storage provisioner: exaforge.com/whale reclaimPolicy: Delete volumeBindingMode: Immediate
Attention, k3s fournit une classe de stockage par défaut dite “local-path”. Il faut avoir qu'une seule classe par défaut :
sudo kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' sudo kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Pour valider :
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim annotations: volume.beta.kubernetes.io/storage-class: "nfs-client" spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi
Mise à jour
Il suffit de relancer le script d'installation.