veilletechno:kubernetes:k3s

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.

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

Ne nécessite plus tiller. Il suffit de récuperer le binaire et de le déposer dans /usr/local/bin/

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:~#

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"}}}'

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.

  • veilletechno/kubernetes/k3s.txt
  • Dernière modification : 2022/01/15 22:12
  • de madko