Cześć w dzisiejszym wpisie podzielę się moimi notatkami z instalacji klastra Kubernetes na systemie Debian (chciałem na Ubuntu, ale było za ciężko ;-(…). Jako instalator Kubernetesa wybrałem Kubeadm, głównie ze względu na dużą liczbę materiałów w sieci jak i to, że idealnie poradzi sobie na serwerach bare-metal.
Przygotowanie systemu i instalacja
Zaczniemy od wyłączenia domyślnego SWAPU (Kubernetes sam musi zarządzać przestrzenią wymiany). Musimy w tym celu zakomentować odpowiedni UUID w naszym pliku z punktami montowań.
swapoff -a
nano /etc/fstab
Kolejny krok to instalacja składników sieciowych i konfiguracja zapory sieciowej w /etc/sysctl.conf.
apt-get install ebtables ethtool
cat <<EOF > /etc/sysctl.conf
net/bridge/bridge-nf-call-ip6tables = 1
net/bridge/bridge-nf-call-iptables = 1
net/bridge/bridge-nf-call-arptables = 1
EOF
Pozostaje nam zainstalowanie dockera (jeśli go jeszcze nie mamy), dodanie klucza i repozytorium do składników Kubernetes i wreszcie ich sama instalacja.
apt-get install -y docker.io apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
Tworzenie klastra
Sam proces jest dosyć prosty, ale jeśli macie tak jak ja kilka kart sieciowych w serwerze, który chcecie by stał się tak zwanym “master” to musicie przemyśleć adresacje ip. Jest tak ponieważ pody potrzebują komunikować się w swojej własnej przestrzeni adresowej, inna podsieć ip będzie użyta do komunikacji między węzłami a jeszcze inna może być użyte do sieci WAN. W przykładzie poniżej sieć 10.0.0.0/8 jest siecią węzłów a 192.168.1.0/16 siecią podów.
kubeadm init --pod-network-cidr=192.168.1.0/16 --apiserver-advertise-address 10.0.0.1
Gdy klaster zostanie zainstalowany otrzymamy na konsoli dalsze instrukcje. Trzeba będzie zainicjalizować konfigurację dla programu kubectl w zależności czy jesteśmy użytkownikiem root czy nie. Dla użytkownika bez superuprawnień wygląda to tak
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kolejny istotny punkt to instalacja sterownika sieci dla naszych podów. Dla mnie był to najbardziej denerwujący moment w trakcie całej instalacji. Po nieowocnych bitwach z próbą instalacji sterownika Calico a potem jeszcze większym zmarnowaniem czasu z Weave, polecam Flannel – zadziałał niemalże out of the box.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Można sprawdzić czy sieć i pozostałe komponenty klastra zainstalowały się poprawnie poprzez wydanie komendy listującej nam wszystkie pody (w tym także właśnie te administracyjne):
kubectl get pods --all-namespaces
Pozostaje nam odblokowanie planisty
kubectl taint nodes --all node-role.kubernetes.io/master-
Dodanie węzłów do naszego klastra, przy użyciu wygenerowanego tokena (na etapie kubeadm init). Oczywiście robimy to na każdym serwerze typu węzeł oddzielnie, dla przykładu:
kubeadm join --token 354502.d6a9a425d5fa8f2e 10.0.0.1:6443 --discovery-token-ca-cert-hash sha256:ad7c5e8a0c909eda6a87452e65fa44b1c2a9729cef7285eb5C1e2f126a1d6a54
Jeśli zgubiliśmy token, możemy go pobrać wydając komendę
kubeadm token list
Finalnie całość funkcjonowania systemu możemy sprawdzić poprzez
kubectl get cs
Przydatne do debugowania mogą być dla nas również poniższe komendy
kubectl get deployments
kubectl get nodes
kubectl get pods --selector app=demo [-A dla wszystkich namespace)
kubectl describe pod
kubectl logs -n nazwa poda?? np. weave-net-67x28 lub -c by określić container
kubectl logs pod -n kube-system (jako namespace) --tail 100 (daj mi 100 logów ostatnich)
kubectl top nodes
uff..jeśli dotarłeś do tego miejsca, to możesz już śmiało dodawać swoje pierwsze pody na Twój klaster Kubernetes 😉