====== 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
pod/helm-install-traefik-wpp59 0/1 Completed 0 22h 10.42.0.2 athos
pod/svclb-traefik-482cr 2/2 Running 8 22h 10.42.0.13 athos
pod/svclb-traefik-jnqzj 2/2 Running 8 22h 10.42.1.11 aramis
pod/svclb-traefik-zsscj 2/2 Running 8 22h 10.42.2.6 porthos
pod/tiller-deploy-7d776455bf-n9f5s 1/1 Running 0 9m11s 10.42.2.7 porthos
pod/traefik-5c79b789c5-zjjbn 1/1 Running 4 22h 10.42.1.10 aramis
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kube-dns ClusterIP 10.43.0.10 53/UDP,53/TCP,9153/TCP 22h k8s-app=kube-dns
service/tiller-deploy ClusterIP 10.43.235.0 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 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.