Setup Kubernetes Cluster Using Kubeadm: Difference between revisions
Created page with "== Kubeadm Setup Prerequisites == Following are the prerequisites for '''Kubeadm Kubernetes cluster setup'''. # Minimum two '''Ubuntu nodes''' [One master and one worker node]. You can have more worker nodes as per your requirement. # The master node should have a minimum of '''2 vCPU and 2GB RAM'''. # For the worker nodes, a minimum of 1vCPU and 2 GB RAM is recommended. # '''10.X.X.X/X''' network range with static IPs for master and worker nodes. We will be using the '..." |
No edit summary |
||
| (11 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
На каждую VM: | |||
* CPU: '''2+ vCPU''' (control-plane лучше 2–4) | |||
* RAM: '''min 2GB''', лучше '''4GB''' (control-plane 4–8GB) | |||
* Disk: '''20GB+''' | |||
* Сеть: все VM '''в одной L2 сети''', чтобы они пинговались по <code>172.16.221.0/24</code>. | |||
Важно для клонов VM: | |||
''' | * у каждой ноды должны быть '''уникальные hostname, MAC и product_uuid''' (kubeadm ругается если одинаковые). Проверка: | ||
<syntaxhighlight lang="bash"> | |||
hostname | |||
ip link | grep link/ | |||
sudo cat /sys/class/dmi/id/product_uuid | |||
sudo | |||
</syntaxhighlight>(уникальность прямо указана в kubeadm prerequisites | |||
== 1) Присвой имена и пропиши hosts (на ВСЕХ нодах) == | |||
На каждой ноде задай hostname: | |||
''' | '''cp1:'''<syntaxhighlight lang="bash"> | ||
sudo hostnamectl set-hostname cp1 | |||
</syntaxhighlight>'''worker1:'''<syntaxhighlight lang="bash"> | |||
sudo hostnamectl set-hostname worker1 | |||
</syntaxhighlight>'''worker2:'''<syntaxhighlight lang="bash"> | |||
sudo hostnamectl set-hostname worker2 | |||
</syntaxhighlight>'''worker3:'''<syntaxhighlight lang="bash"> | |||
sudo hostnamectl set-hostname worker3 | |||
</syntaxhighlight>На '''всех''' нодах добавь в <code>/etc/hosts</code>:<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight>2) Базовая подготовка ОС (на ВСЕХ нодах) | |||
2.1 Отключи swap (обязательно)<syntaxhighlight lang="bash"> | |||
sudo swapoff -a | sudo swapoff -a | ||
sudo sed -i '/ | sudo sed -i '/\sswap\s/s/^/#/' /etc/fstab | ||
</ | </syntaxhighlight>2.2 Включи нужные модули + sysctl<syntaxhighlight lang="bash"> | ||
sudo modprobe overlay | |||
sudo modprobe br_netfilter | |||
sudo tee /etc/modules-load.d/k8s.conf >/dev/null <<'EOF' | |||
overlay | overlay | ||
br_netfilter | br_netfilter | ||
EOF | EOF | ||
</syntaxhighlight>Sysctl:<syntaxhighlight lang="bash"> | |||
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 | net.bridge.bridge-nf-call-ip6tables = 1 | ||
EOF | EOF | ||
sudo sysctl --system | sudo sysctl --system | ||
</ | </syntaxhighlight>Проверка (ip_forward должен быть 1) <syntaxhighlight lang="bash"> | ||
sysctl net.ipv4.ip_forward | |||
</syntaxhighlight>3) Установка containerd (на ВСЕХ нодах) | |||
'''1. | 3.1 Поставь containerd<syntaxhighlight lang="bash"> | ||
sudo apt-get update | |||
sudo apt-get install -y containerd | |||
</syntaxhighlight>3.2 Сгенерируй конфиг и включи SystemdCgroup<syntaxhighlight lang="bash"> | |||
sudo mkdir -p /etc/containerd | |||
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null | |||
</syntaxhighlight>Открой файл:<syntaxhighlight lang="bash"> | |||
sudo nano /etc/containerd/config.toml | |||
</syntaxhighlight>Найди секцию runc options и поставь: | |||
* для containerd '''1.x''': | |||
<syntaxhighlight lang="bash"> | |||
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] | |||
SystemdCgroup = true | |||
</syntaxhighlight> | |||
* для 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 restart containerd | ||
sudo systemctl enable 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 update | ||
sudo apt-get install -y apt-transport-https ca-certificates curl gpg | sudo apt-get install -y apt-transport-https ca-certificates curl gpg | ||
</ | </syntaxhighlight>Ключ:<syntaxhighlight lang="bash"> | ||
sudo mkdir -p -m 755 /etc/apt/keyrings | 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 | |||
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1. | </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"> | ||
echo | |||
</ | |||
sudo apt-get update | sudo apt-get update | ||
sudo apt-get install -y kubelet kubeadm kubectl | sudo apt-get install -y kubelet kubeadm kubectl | ||
sudo apt-mark hold kubelet kubeadm kubectl | sudo apt-mark hold kubelet kubeadm kubectl | ||
</ | </syntaxhighlight>Включи kubelet:<syntaxhighlight lang="bash"> | ||
sudo systemctl enable --now kubelet | 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) | |||
На <code> | Чтобы '''не ловить проблемы с operator-crds/annotations''', я даю '''manifest-вариант''' (самый прямой и обычно “без сюрпризов” для учебных кластеров). | ||
sudo | |||
</ | На '''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