Создание кластера

Материал из megapuper
Перейти к: навигация, поиск

Создание Kubernetes-кластера на Debian 11


В кластере будет три хоста

kuber-master01  192.168.150.60
kuber-node01    192.168.150.61
kuber-node02    192.168.150.62


Пропишем на всех хостах должна быть запись в /etc/hosts

127.0.0.1   localhost


Устанавливаем Docker

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo 
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install docker-ce docker-ce-cli containerd.io


Поправим конфиг caontainerd, иначе не взлетит(можно нагуглить, что-то поменяли в Debian 11 в плане SystemCgroup)

containerd config default | sudo tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
service containerd restart


Изменяем cgroup driver для Docker на systemd:

nano /etc/docker/daemon.json
    {
        "exec-opts": ["native.cgroupdriver=systemd"]
    }


Устанавливаем Kubernetes

mkdir -p /etc/apt/keyrings/
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
mkdir /root/.kube


Изменяем cgroup driver Kubernetes на systemd:

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf(добавим в конец строки параметр --cgroup-driver)
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --cgroup-driver=systemd

Чтобы использовать статический IP адрес добавим параметр --node-ip в конец строки

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --cgroup-driver=systemd --node-ip=192.168.150.60


Автоматическое дополнение в shell

kubectl completion bash > ~/.kube/completion.bash.inc
printf "\n# Kubectl shell completion\nsource '$HOME/.kube/completion.bash.inc'\n" >> $HOME/.bashrc
source $HOME/.bashrc

Ребутимся для проверки, что всё взлетит


Настраиваем кластер

Инициализируем master узел

kubeadm init --v=5 --apiserver-advertise-address=192.168.150.60 --pod-network-cidr=20.20.0.0/16 > ~/.kube/kubeadm-join.sh

Получим файлик kubeadm-join.sh, в нём будет команда для подключения нод к кластеру

kubeadm join 192.168.150.60:6443 --v=5 --token od2m0g.uem7qt3f24tc3zlo --discovery-token-ca-cert-hash sha256:a506eeab120c4d623cbb5bc69ca89e06df98e1297cdcee8e3c8233b4edbf38e5

Время жизни токена ограничено 24 часами. Поэтому если между развёртыванием первого master-узла и worker-узла пройдёт более 24 часов, надо повторно сгенерировать этот токен на мастере.

kubeadm token create --print-join-command

Err: connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused https://stackoverflow.com/questions/55571566/unable-to-bring-up-kubernetes-api-server

containerd config default | tee /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml service containerd restart service kubelet restart



если вываливается с ошибкой [ERROR CRI]: container runtime is not running: output: time="2023-03-11T00:17:03+03:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"

лечим так mv /etc/containerd/config.toml /etc/containerd/config.toml.bk systemctl restart containerd


Раскидываем конфиг на все ноды

cp /etc/kubernetes/admin.conf /root/.kube/config
scp /root/.kube/config root@192.168.150.6X:/root/.kube/


Проверяем статус нод, все NotReady

kubectl get nodes -o wide

Смотрим список подов(-A во всех неймспейсах). Видим, что некоторые Pending

kubectl get pods -A


Чтобы всё пришло в нормальный вид, ставим сетевой плагин для сетевого взаимодействия между контейнерами, в данном случае flannel

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

открываем файл и находим там следующий кусок:
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

Прописываем там свою сеть 20.20.0.0/16

Устанавливаем

kubectl apply -f kube-flannel.yml


настроим haproxy на случай выхода из строя одного мастера(если их больше одного) ---cut--- frontend k8s-api bind ${thisIP}:6443 bind 127.0.0.1:6443 mode tcp option tcplog default_backend k8s-api

backend k8s-api mode tcp option tcplog option tcp-check balance roundrobin default-server port 6443 inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100

       server apiserver1 master01:6443 check
       server apiserver2 master02:6443 check
       server apiserver3 master03:6443 check

---cut---


веб консоль K8S https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

на мастере качаем файлик для настройки ресурсов UI wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

Настроим ресурс Service. Добавляем type: NodePort и указываем любой порт nodePort в диапазоне 30000-32767. kind: Service apiVersion: v1 metadata:

 labels:
   k8s-app: kubernetes-dashboard
 name: kubernetes-dashboard
 namespace: kubernetes-dashboard

spec:

 type: NodePort
 ports:
   - port: 443
     targetPort: 8443
     nodePort: 30555
 selector:
   k8s-app: kubernetes-dashboard

применяем kubectl apply -f recommended.yaml

проверяем что создалась служба(Service) с типом NodePort kubectl get svc -n kubernetes-dashboard

смотрим на какой ноде развернулся pod для UI kubectl get pods -o wide -n kubernetes-dashboard

идем в браузер и проверяем https://192.168.150.X:30555

создаём админскую учётку admin-user.yaml 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

применяем kubectl apply -f admin-user.yaml

на мастере создаём токен с помощью которого логинимся в UI, копируем его и заходим в админку kubectl -n kubernetes-dashboard create token admin-user