Met K8s de docker containers voor EJBCA beheren
Kan het doen met kubeadm aan de hand van installing kubeadm. Eerst een /etc/yum.repos.d/kubernetes.repo toevoegen met de tekst:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
Dan installeren met sudo dnf install kubeadm --disableexcludes=kubernetes. Hierna moet je k8s initialiseren, hiervoor moet je wel wat instellingen verandern. Ten eerste kube-apiserver als service en 10250/tcp toevoegen aan firewalld. Docker werkt niet meer standaard met k8s sinds 2020, dus moet je cri-docker installeren aan de hand van de rpm-package. Ook moet je de systemd cri-docker.service en cri-docker.socket enablen, de socket moet je ook starten. Ook moet je dat k8s doorgeven dat je docker gebruikt en gaat het zeuren dat swap aan staat. Dat moet je allebei instellen. Maak daarvoor een config.yaml-bestand met deze inhoud:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false
En doe sudo kubeadm init --config config.yaml, daarna geeft het dit bericht:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join <IP van machine>:6443 --token <token.token> \
--discovery-token-ca-cert-hash sha256:<sha256 hash>
Het bovenstaande verwacht dat je k8s kan installeren op de pods. Dat is bij de EJBCA docker containers niet (makkelijk) mogelijk.
Aan de hand van deze vergelijking is het waarschijnlijk makkelijker om Kubespray te gebruiken, zie daarvoor deze tutorial. Dat gebruikt o.a. ansible playbooks om het installeren. Dus dat maar proberen.
Als je de inventory file wil maken, eerst de Github repo clonen. In de geclone repo gaan met cd en aan de hand van deze stappen de inventory maken. Hiervoor doe je de volgende basiscommando's:
cp -r inventory/sample inventory/mycluster
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Als de inventory gemaakt is en je gekeken hebt of inventory/mycluster/group_vars/all/all.yml en inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml juist zijn doe je dit commando, hiervoor moet sshd op poort 22 staan en moet je private-key geen wachtwoord hebben/in ssh-agent staan:
ansible-playbook -i inventory/mycluster/hosts.yml cluster.yml -b -v -K --private-key=~/.ssh/private_key
Het vraagt hierbij om het sudo wachtwoord van de hosts. Dan doet het totdat het gaat pingen, maar dat werkt niet. Het verwacht dat je nodes en master op verschillende IP's staan, dat zou kunnen, maar dan moet je een extra VM maken. Toch niet zo handig.
Met minikube proberen, installeren met de rpm-package op de get started pagina, dan starten met minikube start --driver=docker. Het kan zijn dat er iets fout gaat met iptables/docker network, dan moet je de docker.service en/of docker.socket herstarten met systemctl restart. Daarna testen met minikube kubectl -- get po -A, je kan het makkelijker maken door alias kubectl="minikube kubectl -- " toe te voegen aan de bashrc/zshrc enz. Daarna kun je de dashboard aanzetten met minikube dashboard.
Om bij de dashboard te komen kun je gebruik maken van deze tutorial met aanpassingen van deze site. Eerst met kubectl --namespace kubernetes-dashboard edit service kubernetes-dashboard "type: ClusterIP" veranderen in "type: Nodeport". Daarna de kubernetes-dashboard pod verwijderen zodat het opnieuw opstart. Daarna een serviceaccount maken met kubectl create serviceaccount dashboard -n kubernetes-dashboard en de bijbehorende token met kubectl create token dashboard -n kubernetes dashboard. De token gebruik je om in te loggen bij de dashboard. Daarna een clusterrolebinding regel maken zodat je de rechten hebt: kubectl create clusterrolebinding dashboard-admin -n kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=default:dashboard. Daarna kun je bij de dashboard komen door naar https://IP van service:NodePort/#/login te gaan.
Ik snap niet precies hoe het netwerk van minikube werkt. De poorten die je krijgt met kubectl get services -A of vergelijkbaar staan niet bij docker ps. Misschien moet het daarvoor met "Ingress" gedaan worden, zie voor de verschillen tussen ClusterIP, NodePort en Ingress deze site. Voor het port forwarden van het dashboard moet het waarschijnlijk van de "docker" zone naar de "public" of andere default zone gaan. Zie daarvoor firewalld policy.
Het is sowieso beter kubernetes de containers/pods te laten genereren. Daarom moet je opnieuw EJBCA installeren aan de hand van Deploy EJBCA container in MicroK8s. Deze tutorial is gemaakt voor MicroK8s, het verschil is dat je gelijk commando's kan uitvoeren en niet hoeft te ssh-en naar de MicroK8s server. Dit betekent wel dat ook FreeIPA opnieuw ingesteld moet worden.
Bij kubeadm of kubespray installatie moet je om vanaf de laptop bij de web ui te komen de dashboard plugin installeren en waarschijnlijk een certificate installeren. Het heeft het over Jenkins, maar ik weet niet of dat nog actueel is. Zie ook RBAC authorization.