Dane wejściowe:
- system operacyjny: Debian 9,
- użytkownik: root.
Do instalacji klastra Kubernetes użyjemy oprogramowania kubeadm. Nim je zainstalujemy upewnijmy się, że system obsługuje w odpowiedni sposób ruch sieciowy.
Ładowanie modułu br_netfilter podczas ładowania systemu:
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
Ustaw opcję "net.bridge.bridge-nf-call-iptables" na 1:
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
Partycja wymiana musi być wyłączona. Najpierw sprawdźmy czy jest dostępna:
swapon --show
Jeżeli nic się nie pojawi to nie mamy partycji wymiany. W innym wypadku musimy ją wyłączyć:
swapoff -a
Nasz serwer musi zezwalać na ruch wchodzący dla następujących portów po protokole TCP:
- 6443, serwer API Kubernetesa,
- 2379-2380, API klienta do serwera etcd,
- 10250, kubelet API,
- 10251, kube-scheduler,
- 10252, kube-controller-manager.
- Docker,
- containerd,
- CRI-O.
cat <<EOF | tee /etc/modules-load.d/containerd.confoverlaybr_netfilterEOF
modprobe overlay
modprobe br_netfilter
Parametry sysctl:
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl --system
I na koniec dla containerd:
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
systemctl restart containerd
Dodatkowo musimy użyć sterownika systemd dla cgroup. W tym celu edytujemy plik "/etc/containerd/config.toml" i szukamy sekcji
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
i dodajemy pod nią
SystemdCgroup = true
Na koniec restartujemy demona:
systemctl restart containerd
I wreszcie przyszła pora na instalację kubeadm (inicjalizacja klastra), kubelet (uruchamianie Podów, znajduje się na wszystkich maszynach klastra) oraz kubectl (komunikacja z K8s):
apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
Ostatnia komenda sprawi, że apt nie będzie aktualizował podanych pakietów.
Wykonajmy zatem wreszcie inicjalizację klastra:
kubeadm init --apiserver-advertise-address=92.222.79.22 --pod-network-cidr=10.244.0.0/16
Jako argumenty podajemy odpowiednio adres IP, do którego mają się podłączać nasze węzły w klastrze oraz CIDR sieci Kubernetes.
Uzyskajmy dostęp poprzez kubectl:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
Poleceniem "kubectl get nodes" możemy sprawdzić czy mamy połączenie z klastrem.
Przyszła pora na zainstalowanie wtyczki sieciowej. My wybierzemy Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Z powodów bezpieczeństwa nie można uruchamiać Podów na głównym węźle więc zmieńmy to:
kubectl taint nodes --all node-role.kubernetes.io/master-
Sprawdźmy czy działa ścieżką szczęścia:
kubectl run bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080