В этой записи мы рассмотрим как быстро поднять кластер Kubernetes на Debian 11. Кластер будет включать в себя 3 хоста: 1 мастер (control plane) и 2 воркера (workers). Хосты развернуты в гипервизоре, установлена минимальная версия Debian 11 с SSH.
Предупреждение: эта инструкция не включает в себя все рекомендации по безопасности и лучшим практикам (best practices).
Полезные материалы:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
Имена хостов:
c1-control-plane
c1-worker-1
c1-worker-2
Отредактируем на каждом хосте файл hosts и добавим строки, которые указаны ниже
vim /etc/hosts
192.168.254.10 c1-control-plane 192.168.254.11 c1-worker-1 192.168.254.12 c1-worker-2
Нам необходимо загрузить два модуля в ядро:
overlay необходимо для overlayfs, https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html
br_netfilter чтобы iptables корректно работал с трафиков бриджей (bridges), http://ebtables.netfilter.org/documentation/bridge-nf.html
cat << EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
cat << EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
Отключаем swap, так как kubelet требует этого
sed -i '/swap/d' /etc/fstab
Применим настройки выше, чтобы не перезагружать хосты:
modprobe overlay
modprobe br_netfilter
sysctl --system
swapoff -a
Установим NTP server взамен etcd
apt install -y chrony
Установим containerd
apt install -y curl gpg lsb-release apparmor apparmor-utils
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/debian $(lsb_release -cs) stable" |
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt-get install -y containerd.io
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
Отредактируем конфигурацию containerd и перезапустим службу
vim /etc/containerd/config.toml
Было:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
Стало:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true
Параметр SystemdCgroup уже может быть, но со значением false, поэтому надо будет просто изменить на true.
systemctl restart containerd
Установим kubernetes инструменты, в моем случае это версия 1.21.0.
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 install iptables libiptc0/stable libxtables12/stable
apt-get install -y kubelet=1.21.0-00 kubeadm=1.21.0-00 kubectl=1.21.0-00
apt-mark hold kubelet kubeadm kubectl
Осталось запустить кластер. Следующие команды выполняем только на мастере (control plane)!
kubeadm init --pod-network-cidr 172.20.0.0/16 --kubernetes-version 1.21.0
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
С мастера вы можете проверить статус кластера и нод. Наша нода c1-control-plane в статусе NotReady потому что мы еще не донастроили сеть.
kubectl get nodes
NAME STATUS ROLES AGE VERSION c1-control-plane NotReady control-plane,master 3m49s v1.21.0
Установим сеть с помощью calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
После окончания разворачивания статус ноды должен измениться на Ready.
Добавим остальные ноды (воркеры) в кластер. Следующие команды выполняем только на воркерах (workers)!
По окончанию выполнения команды “kubeadmin init …” мы видимо подобную строку, она необходима для ввода нод в кластер:
kubeadm join 192.168.254.10:6443 --token oxaul0.24g50wlwsp4ktiqs --discovery-token-ca-cert-hash sha256:74746c748be5fef131d9c91a591c053591b6ce1e274396bcb7c48b6e6664bded
Если вы ее потеряли, то можно ее получить с помощью команды:
kubeadm token create --print-join-command
Выполняем команды “kubeadm join…” на воркерах, ждем окончания выполнения и смотрим на главной ноде статус.
kubectl get nodes
NAME STATUS ROLES AGE VERSION c1-control-plane Ready control-plane,master 5m52s v1.21.0 c1-worker-1 Ready 2m10s v1.21.0 c1-worker-2 Ready 66s v1.21.0
kubectl get pods -A
kube-system calico-kube-controllers-78d6f96c7b-9q4lq 1/1 Running 0 9h kube-system calico-node-4mq7p 1/1 Running 0 9h kube-system calico-node-8km7w 1/1 Running 0 9h kube-system calico-node-sjzs4 1/1 Running 0 9h kube-system coredns-558bd4d5db-7pbjx 1/1 Running 0 9h kube-system coredns-558bd4d5db-ptn59 1/1 Running 0 9h kube-system etcd-c1-control-plane 1/1 Running 1 9h kube-system kube-apiserver-c1-control-plane 1/1 Running 0 9h kube-system kube-controller-manager-c1-control-plane 1/1 Running 0 9h kube-system kube-proxy-ls768 1/1 Running 0 9h kube-system kube-proxy-mk98k 1/1 Running 0 9h kube-system kube-proxy-qbxwb 1/1 Running 0 9h kube-system kube-scheduler-c1-control-plane 1/1 Running 0 9h
СПАСИБО!!! СПАСИБИЩЕ!!! Прекрасная, чёткая подача материала!
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
404 error
Тут написано https://docs.tigera.io/calico/latest/getting-started/kubernetes/k3s/quickstart, что теперь надо выпонить «kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml«