Es werden ein paar Instanzen gebraucht, 3 Manager und 2 Nodes sind kein schlechter Start. Diese können quasi überall laufen. Hetzner Cloud ist günstig und eignet sich gut für diese Zwecke.
3 Manager vorbereiten:
apt update && apt upgrade -y reboot curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main" apt install docker.io kubeadm -y swapoff -a systemctl enable docker
Zur Vorbereitung der Nodes (später) die gleichen Kommandos verwenden
ACHTUNG Wenn zu einem späteren Zeitpunkt Nodes hinzugefügt werden sollen, mit kubectl get nodes prüfen welche Version installiert ist und auf den neuen Nodes die passenden Versionen installieren, bspw. mit: apt install kubeadm=1.14.2-00 kubelet=1.14.2-00 kubectl=1.14.2-00
Verfügbare Version kann mit apt-cache policy kubectl abgefragt werden.
Falls kein aktueller Token mehr zur Verfügung steht (kubeadm token list) einen neuen erzeugen: kubeadm token create –print-join-command
Load Balancer (haproxy) auf eigener Maschine aufsetzen:
apt update && apt upgrade -y reboot apt install haproxy -y vi /etc/haproxy/haproxy.cfg
Unterhalb von default anhängen, IPs anpassen:
frontend kubernetes bind 95.216.160.18:6443 option tcplog mode tcp default_backend kubernetes-master-nodes backend kubernetes-master-nodes mode tcp balance roundrobin option tcp-check server k8s-master-0 116.203.181.115:6443 check fall 3 rise 2 server k8s-master-1 116.203.181.114:6443 check fall 3 rise 2 server k8s-master-2 116.203.181.111:6443 check fall 3 rise 2
Check vom ersten Master, ob haproxy funktioniert:
nc -v 95.216.160.18 6443
Auf erstem Master k8s-config.yml erstrellen:
vi k8s-config.yml apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable controlPlaneEndpoint: "95.216.160.18:6443" networking: podSubnet: 10.143.0.0/16
IP und podSubnet anpassen!
K8s initiieren:
kubeadm init --config=k8s-config.yml --experimental-upload-certs
Rückgabe beachten!
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 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/ You can now join any number of the control-plane node running the following command on each as root: kubeadm join 95.216.160.18:6443 --token j7oge2.kfwxc8qpjiv2s8vz \ --discovery-token-ca-cert-hash sha256:9bd7783eae8bf5ec566ef6bd2f9deeeb9e53e519bc3017cd662dcac162c7b342 \ --experimental-control-plane --certificate-key 4e70eb5f5741c7cb9cd0fe97571da4d66a839c9447685b488eeca76c5c3ad4ae Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use "kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join 95.216.160.18:6443 --token j7oge2.kfwxc8qpjiv2s8vz \ --discovery-token-ca-cert-hash sha256:9bd7783eae8bf5ec566ef6bd2f9deeeb9e53e519bc3017cd662dcac162c7b342
Zusätzliche Master (Control-Plane Nodes) nacheinander mit ausgegebenem Befehl aufnehmen.
Am besten auf allen Mastern noch:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
Nodes vorbereiten (s.o.) und aufnehmen:
kubeadm join 95.216.160.18:6443 --token j7oge2.kfwxc8qpjiv2s8vz \ --discovery-token-ca-cert-hash sha256:9bd7783eae8bf5ec566ef6bd2f9deeeb9e53e519bc3017cd662dcac162c7b342
K8s Status checken, Machinen sollten da sein, aber noch nicht bereit (Netzwerk fehlt noch):
kubectl get nodes NAME STATUS ROLES AGE VERSION mgr1 NotReady master 5m31s v1.14.2 mgr2 NotReady master 3m55s v1.14.2 mgr3 NotReady master 2m19s v1.14.2 node1 NotReady <none> 93s v1.14.2 node2 NotReady <none> 58s v1.14.2
Netzwerk einbauen (in diesem Fall flannel):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
K8s Nodes / Status sollte jetzt besser aussehen:
kubectl get nodes NAME STATUS ROLES AGE VERSION mgr1 Ready master 10m v1.14.2 mgr2 Ready master 8m37s v1.14.2 mgr3 Ready master 7m1s v1.14.2 node1 Ready <none> 6m15s v1.14.2 node2 Ready <none> 5m40s v1.14.2
Quellen:
https://kubernetes.io/docs/setup/independent/high-availability/
https://blog.inkubate.io/install-and-configure-a-multi-master-kubernetes-cluster-with-kubeadm/