{"id":13580,"url":"\/distributions\/13580\/click?bit=1&hash=749a7bd0e59410ef196f6ff51feb6b4c9f7e6897e3051412b19b72ce9b7d4eab","title":"\u0413\u0434\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u0434\u0435\u0438 \u0434\u043b\u044f \u0440\u0435\u0434\u0438\u0437\u0430\u0439\u043d\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"edca0fea-02f8-5eb8-ae8c-3678b2acc040","isPaidAndBannersEnabled":false}
Iuri Cuznetov

Установка k8s на кластер из Debian 11

Доброго времени суток.

Данный блог пишется неизвестно зачем, но может кому-то он пригодится.

Исходные данные: имеется несколько компьютеров со свежеустановленным Debian 11 и следующая статья

Тут сразу надо сказать что основная проблема таких установок это свежесть статей их описывающих. До этого была испробована статья 2020 года и ничего не получилось. Одна из причин - использование dockershim, от которого в k8s отказались начиная с версии 1.24. Подробнее можно узнать здесь:

Ну чтож, начнём пожалуй.

Первые шаги установки, в статье, описаны достаточно правильно. Сначала нужно установить containerd. Выполняем следующие команды на всех нодах, включая будущего мастера:

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
sudo modprobe overlay sudo modprobe br_netfilter
cat <<EOF | sudo 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
sudo sysctl --system sudo apt-get update sudo apt-get -y install containerd

После установки настраиваем конфигурационный файл

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

Указываем cgroupdriver для systemd. Для этого открываем конфигурационный файл:

sudo nano /etc/containerd/config.toml

В файле находим строчку: [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
Сразу под ней нам нужно будет добавить строку
SystemdCgroup = true
То есть в итоге у нас должно получится так:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true

Далее нам нужно перезапустить containerd и проверить что он запустился:

sudo systemctl restart containerd ps -ef | grep containerd

Вывод должен выглядеть вот так:

root 1864 1 0 июл19 ? 00:01:41 /usr/bin/containerd user 75682 75626 0 15:04 pts/0 00:00:00 grep containerd

Далее устанавливаем сам k8s. Эти действия надо воспроизвести на всех нодах.

Устанавливаем curl и добавляем ключ Kubernetes

sudo apt-get install curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

Добавляем репозиторий

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF

Устанавливаем модули Kubernetes

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

Далее на всех нодах нам нужно добавить одинаковые имена хостов, чтоб они могли видеть друг-друга по имени. В статье автор предлагает много танцев с бубном. Мой способ это скопировать в буфер информацию с IP и именами хостов и потом вручную по ssh добавить их в файл hosts на каждой ноде.

sudo nano /etc/hosts

Добавляем в любое место в файле hosts что-то типа с вашими IP:

192.168.250.1 master-node 192.168.250.2 worker-node

Дальше автор предлагает сконфигурировать файерволл, но в Debian, по умолчанию, не установлен ufw. Зато при установке модулей Kubernetes, все нужные правила прописываются в iptables и устанавливать ufw нужно только в случае если вам нужна высокая степень безопасности. Мой кластер был развёрнут в отдельном сегменте сети под защитой корпоративного файерволла, так что для меня и, возможно, для вас, шаг с настройкой ufw будет лишним. Проверить правила iptables можно следующим образом:

sudo iptables -L

Выключаем swap

sudo swapoof -a

На всех нодах запускаем службу kubelet:

sudo systemctl enable kubelet

Далее автор статьи предлагает нам инициализировать кластер и тут нас поджидает засада.

Дело в том, что дальше по статье автор предлагает развёртывать сеть pods при помощи Flannel. НО. При дальнейшей инициализации нод выдаётся ошибка. Дело в том что Flannel рассчитан на подсеть 10.244.0.0/16, поэтому инициализировать кластер надо следующей командой:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Эта подсеть прописана в kube-flannel.yml и в сети есть много описаний как настроить другую подсеть. Но буду честен: меня 10.244.0.0/16 вполне устраивает, так что копать дальше у меня не было необходимости.

После инициализации кластера будет вывод типа этого:

Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.250.1:6443 --token l5hlte.jvsh7jdrp278lqlr \ --discovery-token-ca-cert-hash sha256:07a3716ea4082fe158dce5943c7152df332376b39ea5e470e52664a54644e00a

Нас тут интересует 2 вещи. Первая это создание конфигурационного файла. Для этого копируем из вывода и выполняем следующие команды:

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

Прошу обратить внимание на ремарку если вы производите установку под пользователем root

Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf

И конечно же нас интересует команда для добавления pod в кластер:

kubeadm join 192.168.250.1:6443 --token l5hlte.jvsh7jdrp278lqlr \ --discovery-token-ca-cert-hash sha256:07a3716ea4082fe158dce5943c7152df332376b39ea5e470e52664a54644e00a

Тут нужно добавить что добавление нодов у меня получилось только через sudo. То есть:

sudo kubeadm join 192.168.250.1:6443 --token l5hlte.jvsh7jdrp278lqlr \ --discovery-token-ca-cert-hash sha256:07a3716ea4082fe158dce5943c7152df332376b39ea5e470e52664a54644e00a

Если вы не успели или забыли сохранить команду добавления в кластер, то её можно получить следующим образом:

sudo kubeadm token create --print-join-command

Начинаем разворачивать сеть наших pods. Для этого применяем kube-flannel.yml

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Вывод должен быть типа такого:

podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created

Далее проверяем ноды. У автора данная команда выполняется с sudo, но у меня получилось только от имени пользователя:

kubectl get nodes # возможно команда сработает только с sudo # sudo kubectl get nodes

Вывод должен быть типа такого:

NAME STATUS ROLES AGE VERSION master-node Ready control-plane 3h9m v1.24.3

Добавляем ноды в кластер. На каждой ноде выполняем:

sudo kubeadm join 192.168.250.1:6443 --token l5hlte.jvsh7jdrp278lqlr \ --discovery-token-ca-cert-hash sha256:07a3716ea4082fe158dce5943c7152df332376b39ea5e470e52664a54644e00a

Вывод команды должен быть типа такого:

This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Далее проверяем добавилась нода в кластер или нет и на мастере запускаем команду:

kubectl get nodes

Вывод должен быть таким:

NAME STATUS ROLES AGE VERSION master-node Ready control-plane,master 3m40s v1.24.3 worker-node Ready 83s v1.24.3

Как мы видим у worker-node нет роли. Роль worker можно присвоить следующей командой:

sudo kubectl label node worker-node node-role.kubernetes.io/worker=worker

И тогда вывод команды kubectl get nodes будет следующим:

NAME STATUS ROLES AGE VERSION master-node Ready control-plane,master 3m54s v1.24.3 worker-node Ready worker 97s v1.24.3

Повторяем действия по добавлению нодов на каждом из них. Также, состояние всех работающих нодов можно проверить командой:

kubectl get pods --all-namespaces

Вывод будет примерно таким:

NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-8t7xh 1/1 Running 0 135m kube-flannel kube-flannel-ds-bc5gh 1/1 Running 0 3h23m kube-flannel kube-flannel-ds-f6pzq 1/1 Running 0 140m kube-flannel kube-flannel-ds-hmnh7 1/1 Running 0 136m kube-system coredns-6d4b75cb6d-4tzgv 1/1 Running 0 3h23m kube-system coredns-6d4b75cb6d-mgc8k 1/1 Running 0 3h23m kube-system etcd-master-node 1/1 Running 1 3h24m kube-system kube-apiserver-master-node 1/1 Running 1 3h24m kube-system kube-controller-manager-master-node 1/1 Running 0 3h24m kube-system kube-proxy-6s8rd 1/1 Running 0 3h23m kube-system kube-proxy-774bc 1/1 Running 0 140m kube-system kube-proxy-b4dfk 1/1 Running 0 136m kube-system kube-proxy-nlwvh 1/1 Running 0 135m kube-system kube-scheduler-master-node 1/1 Running 1 3h24m
0
Комментарии
Читать все 0 комментариев
null