Kubernetes na Debian, szybkie wprowadzenie

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 😉