Setup Kubernetes Cluster Using Kubeadm: Difference between revisions

From wiki.baghirzade.pro
Jump to navigation Jump to search
No edit summary
No edit summary
 
Line 75: Line 75:


* для containerd 2'''.x''':
* для containerd 2'''.x''':
<syntaxhighlight lang="bash">
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
  SystemdCgroup = true
</syntaxhighlight>(это требование и примеры прямо в доках Kubernetes
Также убедись, что '''CRI не отключен''': в <code>disabled_plugins</code> не должно быть <code>"cri"</code>
Перезапусти:<syntaxhighlight lang="bash">
sudo systemctl restart containerd
sudo systemctl enable containerd
</syntaxhighlight>Проверка сокета:<syntaxhighlight lang="bash">
ls -l /run/containerd/containerd.sock
</syntaxhighlight>4) Установка kubeadm/kubelet/kubectl (на ВСЕХ нодах)
Ставим '''Kubernetes v1.35 (актуальная ветка в доке)''' из '''pkgs.k8s.io'''<syntaxhighlight lang="bash">
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
</syntaxhighlight>Ключ:<syntaxhighlight lang="bash">
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
</syntaxhighlight>Репо:<syntaxhighlight lang="bash">
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
</syntaxhighlight>Установка и “hold”:<syntaxhighlight lang="bash">
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
</syntaxhighlight>Включи kubelet:<syntaxhighlight lang="bash">
sudo systemctl enable --now kubelet
</syntaxhighlight>(эти команды и repo-URL — из официальной страницы установки kubeadm
5) Инициализация control-plane (ТОЛЬКО на cp1 = 172.16.221.10)
5.1 kubeadm init
Я использую pod CIDR '''192.168.0.0/16''' (дефолт под Calico). Calico это любит, а документация Calico для kubeadm прямо его упоминает
На '''cp1''':<syntaxhighlight lang="bash">
sudo kubeadm init \
  --apiserver-advertise-address=172.16.221.10 \
  --pod-network-cidr=192.168.0.0/16
</syntaxhighlight>После успеха kubeadm покажет '''kubeadm join ...''' — '''сохрани его''' (для worker-нод).
5.2 Настрой kubectl для твоего пользователя
На cp1 (под обычным юзером, не root):<syntaxhighlight lang="bash">
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
</syntaxhighlight>Проверка:<syntaxhighlight lang="bash">
kubectl get nodes
</syntaxhighlight>На этом этапе cp1 будет <code>NotReady</code> — это нормально, пока не поставим CNI (Calico).
6) Установка Calico (на cp1)
Чтобы '''не ловить проблемы с operator-crds/annotations''', я даю '''manifest-вариант''' (самый прямой и обычно “без сюрпризов” для учебных кластеров).
На '''cp1''':<syntaxhighlight lang="bash">
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/calico.yaml
kubectl apply -f calico.yaml
</syntaxhighlight>(официальная дока Calico для on-prem/kubeadm: скачать <code>calico.yaml</code> и применить
Подожди, пока поднимется:<syntaxhighlight lang="bash">
kubectl get pods -n kube-system -w
</syntaxhighlight>Проверка, что ноды стали Ready:<syntaxhighlight lang="bash">
kubectl get nodes -o wide
</syntaxhighlight>7) Подключение worker-нод (на worker1/2/3)
На '''каждой''' worker-ноде выполни команду, которую показал <code>kubeadm init</code> на cp1, вида:<syntaxhighlight lang="bash">
sudo kubeadm join 172.16.221.10:6443 --token <TOKEN> \
  --discovery-token-ca-cert-hash sha256:<HASH>
</syntaxhighlight>После подключения всех:<syntaxhighlight lang="bash">
kubectl get nodes -o wide
</syntaxhighlight>8) Быстрые проверки “всё ок”
8.1 Системные поды<syntaxhighlight lang="bash">
kubectl -n kube-system get pods -o wide
</syntaxhighlight>8.2 CoreDNS должен быть Running<syntaxhighlight lang="bash">
kubectl -n kube-system get deploy coredns
</syntaxhighlight>9) Частые проблемы и как чинить (коротко)
1) Node NotReady после Calico
смотри:<syntaxhighlight lang="bash">
kubectl -n kube-system get pods -o wide
kubectl -n kube-system describe pod <calico-node-...>
</syntaxhighlight>проверь sysctl/модули (<code>br_netfilter</code>, <code>ip_forward=1</code>)
2) kubelet ругается на cgroup
* 99%: не включил <code>SystemdCgroup = true</code> в containerd или CRI отключен Kubernetes
* после правки:
<syntaxhighlight lang="bash">
sudo systemctl restart containerd kubelet
</syntaxhighlight>3) Token протух
На cp1 сгенерь новый join:<syntaxhighlight lang="bash">
kubeadm token create --print-join-command
</syntaxhighlight>

Latest revision as of 13:51, 7 January 2026

На каждую VM:

  • CPU: 2+ vCPU (control-plane лучше 2–4)
  • RAM: min 2GB, лучше 4GB (control-plane 4–8GB)
  • Disk: 20GB+
  • Сеть: все VM в одной L2 сети, чтобы они пинговались по 172.16.221.0/24.

Важно для клонов VM:

  • у каждой ноды должны быть уникальные hostname, MAC и product_uuid (kubeadm ругается если одинаковые). Проверка:
hostname
ip link | grep link/
sudo cat /sys/class/dmi/id/product_uuid

(уникальность прямо указана в kubeadm prerequisites

1) Присвой имена и пропиши hosts (на ВСЕХ нодах)

На каждой ноде задай hostname:

cp1:

sudo hostnamectl set-hostname cp1

worker1:

sudo hostnamectl set-hostname worker1

worker2:

sudo hostnamectl set-hostname worker2

worker3:

sudo hostnamectl set-hostname worker3

На всех нодах добавь в /etc/hosts:

sudo tee -a /etc/hosts >/dev/null <<'EOF'
172.16.221.10 cp1
172.16.221.11 worker1
172.16.221.12 worker2
172.16.221.13 worker3
EOF

2) Базовая подготовка ОС (на ВСЕХ нодах) 2.1 Отключи swap (обязательно)

sudo swapoff -a
sudo sed -i '/\sswap\s/s/^/#/' /etc/fstab

2.2 Включи нужные модули + sysctl

sudo modprobe overlay
sudo modprobe br_netfilter

sudo tee /etc/modules-load.d/k8s.conf >/dev/null <<'EOF'
overlay
br_netfilter
EOF

Sysctl:

sudo tee /etc/sysctl.d/k8s.conf >/dev/null <<'EOF'
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

Проверка (ip_forward должен быть 1)

sysctl net.ipv4.ip_forward

3) Установка containerd (на ВСЕХ нодах) 3.1 Поставь containerd

sudo apt-get update
sudo apt-get install -y containerd

3.2 Сгенерируй конфиг и включи SystemdCgroup

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null

Открой файл:

sudo nano /etc/containerd/config.toml

Найди секцию runc options и поставь:

  • для containerd 1.x:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
  • для containerd 2.x:
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
  SystemdCgroup = true

(это требование и примеры прямо в доках Kubernetes

Также убедись, что CRI не отключен: в disabled_plugins не должно быть "cri"

Перезапусти:

sudo systemctl restart containerd
sudo systemctl enable containerd

Проверка сокета:

ls -l /run/containerd/containerd.sock

4) Установка kubeadm/kubelet/kubectl (на ВСЕХ нодах) Ставим Kubernetes v1.35 (актуальная ветка в доке) из pkgs.k8s.io

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

Ключ:

sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

Репо:

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

Установка и “hold”:

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Включи kubelet:

sudo systemctl enable --now kubelet

(эти команды и repo-URL — из официальной страницы установки kubeadm

5) Инициализация control-plane (ТОЛЬКО на cp1 = 172.16.221.10)

5.1 kubeadm init

Я использую pod CIDR 192.168.0.0/16 (дефолт под Calico). Calico это любит, а документация Calico для kubeadm прямо его упоминает

На cp1:

sudo kubeadm init \
  --apiserver-advertise-address=172.16.221.10 \
  --pod-network-cidr=192.168.0.0/16

После успеха kubeadm покажет kubeadm join ...сохрани его (для worker-нод).

5.2 Настрой kubectl для твоего пользователя

На cp1 (под обычным юзером, не root):

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Проверка:

kubectl get nodes

На этом этапе cp1 будет NotReady — это нормально, пока не поставим CNI (Calico).

6) Установка Calico (на cp1)

Чтобы не ловить проблемы с operator-crds/annotations, я даю manifest-вариант (самый прямой и обычно “без сюрпризов” для учебных кластеров).

На cp1:

curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/calico.yaml
kubectl apply -f calico.yaml

(официальная дока Calico для on-prem/kubeadm: скачать calico.yaml и применить Подожди, пока поднимется:

kubectl get pods -n kube-system -w

Проверка, что ноды стали Ready:

kubectl get nodes -o wide

7) Подключение worker-нод (на worker1/2/3) На каждой worker-ноде выполни команду, которую показал kubeadm init на cp1, вида:

sudo kubeadm join 172.16.221.10:6443 --token <TOKEN> \
  --discovery-token-ca-cert-hash sha256:<HASH>

После подключения всех:

kubectl get nodes -o wide

8) Быстрые проверки “всё ок” 8.1 Системные поды

kubectl -n kube-system get pods -o wide

8.2 CoreDNS должен быть Running

kubectl -n kube-system get deploy coredns

9) Частые проблемы и как чинить (коротко)

1) Node NotReady после Calico

смотри:

kubectl -n kube-system get pods -o wide
kubectl -n kube-system describe pod <calico-node-...>

проверь sysctl/модули (br_netfilter, ip_forward=1)

2) kubelet ругается на cgroup

  • 99%: не включил SystemdCgroup = true в containerd или CRI отключен Kubernetes
  • после правки:
sudo systemctl restart containerd kubelet

3) Token протух На cp1 сгенерь новый join:

kubeadm token create --print-join-command