Если ты админ, DevOps или просто интересуешься современными технологиями — важно понимать: Kubernetes — это не просто "модная штука". Это инструмент, который решает реальные задачи, с которыми сталкиваются все, у кого сервисы выходят за рамки одного сервера.
У тебя есть веб-приложение (сайт, API, бэкенд). Оно работает на одном сервере. Всё хорошо, пока:
Вот тут и приходит Kubernetes.
Он превращает несколько серверов в единый "суперкомпьютер", который умеет:
Простой пример: У тебя магазин. Без кластера — один кассир. Когда очередь — все стоят. С кластером — как в супермаркете: открыли 5 касс, пока очередь большая. Потом закрыли. Всё автоматически.
Даже если у тебя небольшой сервис — знание Kubernetes даёт тебе:
Кластер Kubernetes — это не про "много серверов". Это про надёжность, автоматизацию и готовность к росту.
В этом руководстве мы создадим 3-нодный кластер Kubernetes вручную на Ubuntu Server: один мастер (control-plane) и два рабочих узла (workers). Это отличная практика для понимания внутреннего устройства K8s.
Мы используем актуальные версии и учтём, что старые репозитории Kubernetes больше не работают.
Все действия выполняются на всех узлах: k8s-master1.kubecluster.local
, k8s-worker1.kubecluster.local
, k8s-worker2.kubecluster.local
.
product_uuid
# На master:
sudo hostnamectl set-hostname k8s-master1.kubecluster.local
# На worker1:
sudo hostnamectl set-hostname k8s-worker1.kubecluster.local
# На worker2:
sudo hostnamectl set-hostname k8s-worker2.kubecluster.local
Добавь записи в /etc/hosts
на всех узлах:
sudo vi /etc/hosts
# Добавь:
192.168.0.15 k8s-master1.kubecluster.local k8s-master1
192.168.0.20 k8s-worker1.kubecluster.local k8s-worker1
192.168.0.25 k8s-worker2.kubecluster.local k8s-worker2
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https git net-tools
Кубернетес не рекомендует использовать swap. Это может вызвать нестабильность.
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF
sudo modprobe br_netfilter
sudo modprobe overlay
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
Контейнерный runtime обязателен. Мы используем Docker с containerd
.
sudo apt install -y docker.io
sudo systemctl enable docker
sudo usermod -aG docker $USER
Настройка cgroupdriver=systemd
— критично для стабильной работы!
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl restart docker
apt.kubernetes.io
и packages.cloud.google.com
удалены с 4 марта 2024 года. Используйте только новые репозитории pkgs.k8s.io
.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key
echo 'deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Проверка версии:
kubectl version --client --short
Выполняется только на k8s-master1
.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
После успешного завершения, выполни команды из вывода, чтобы настроить kubectl
:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Без CNI узлы останутся в статусе NotReady
.
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Сгенерируй команду на мастере:
kubeadm token create --print-join-command
Выполни полученную команду на каждом воркере (с правами root).
kubectl get nodes
Ожидаемый вывод:
NAME STATUS ROLES AGE VERSION
k8s-master1.kubecluster.local Ready control-plane 5m v1.30.0
k8s-worker1.kubecluster.local Ready 2m v1.30.0
k8s-worker2.kubecluster.local Ready 1m v1.30.0
kubectl run nginx --image=nginx:alpine --port=80
kubectl port-forward pod/nginx --address 0.0.0.0 8080:80
kubectl create deploy myapp --image=httpd:alpine
kubectl scale deploy/myapp --replicas=3
kubectl autoscale deploy/myapp --min=2 --max=5 --cpu-percent=70
# ClusterIP (внутри кластера)
kubectl expose deploy/myapp --port=80
# NodePort (доступ снаружи)
kubectl expose deploy/myapp --type=NodePort --port=80
Проверка:
kubectl get svc
Contour — лёгкий и надёжный Ingress-контроллер на базе Envoy.
kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
kubectl -n kubernetes-dashboard create token admin-user
Измени тип сервиса:
kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
Найди порт:
kubectl get svc -n kubernetes-dashboard
Перейди по https://
и войди по токену.
# На мастере:
kubectl drain k8s-worker2.kubecluster.local --ignore-daemonsets --delete-emptydir-data
kubectl delete node k8s-worker2.kubecluster.local
# На самой ноде:
sudo kubeadm reset
Теперь у тебя есть полностью рабочий 3-нодный кластер Kubernetes на Ubuntu с CNI, Ingress и веб-интерфейсом.
Это отличная основа для изучения K8s, CI/CD, Helm, GitOps и других технологий.
Не забывай про обновления безопасности и мониторинг в продакшене!
Инструкция основана на официальной документации Kubernetes и адаптирована под современные реалии.
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!