Создание кластера — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показано 14 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
Создание Kubernetes-кластера на Debian 11
 
Создание Kubernetes-кластера на Debian 11
 +
 +
 +
Перед настройкой рекомендуется отключить swap
 +
 +
Так же пропишем на всех хостах в /etc/hosts
 +
127.0.0.1  localhost
  
  
Строка 6: Строка 12:
 
  kuber-node01    192.168.150.61
 
  kuber-node01    192.168.150.61
 
  kuber-node02    192.168.150.62
 
  kuber-node02    192.168.150.62
 
 
Пропишем на всех хостах должна быть запись в /etc/hosts
 
127.0.0.1  localhost
 
  
  
Строка 18: Строка 20:
 
  apt update
 
  apt update
 
  apt install docker-ce docker-ce-cli containerd.io
 
  apt install docker-ce docker-ce-cli containerd.io
 
 
Поправим конфиг caontainerd, иначе не взлетит(можно нагуглить, что-то поменяли в Debian 11 в плане SystemCgroup)
 
containerd config default | sudo tee /etc/containerd/config.tomlфЬ_2642893
 
 
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
 
service containerd restart
 
  
  
Строка 34: Строка 29:
  
  
Устанавливаем Kubernetes
+
Поправим конфиг containerd, иначе не взлетит(можно нагуглить, что-то поменяли в 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
 +
 
 +
 
 +
Устанавливаем компоненты Kubernetes
 
  mkdir -p /etc/apt/keyrings/
 
  mkdir -p /etc/apt/keyrings/
 
  curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
 
  curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
Строка 47: Строка 48:
 
  /etc/systemd/system/kubelet.service.d/10-kubeadm.conf(добавим в конец строки параметр --cgroup-driver)
 
  /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
 
     ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --cgroup-driver=systemd
 +
  
 
Чтобы использовать статический IP адрес добавим параметр --node-ip в конец строки
 
Чтобы использовать статический IP адрес добавим параметр --node-ip в конец строки
Строка 57: Строка 59:
 
  printf "\n# Kubectl shell completion\nsource '$HOME/.kube/completion.bash.inc'\n" >> $HOME/.bashrc
 
  printf "\n# Kubectl shell completion\nsource '$HOME/.kube/completion.bash.inc'\n" >> $HOME/.bashrc
 
  source $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
  
инициализируем 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.sh, внизу, будет команда для подключения нод к кластеру. Выполняем на нодах кластера
kubeadm join 192.168.150.60:6443 --v=5 --token od2m0g.uem7qt3f24tc3zlo --discovery-token-ca-cert-hash sha256:a506eeab120c4d623cbb5bc69ca89e06df98e1297cdcee8e3c8233b4edbf38e5
+
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
 
  
----
+
Время жизни токена ограничено 24 часами. Поэтому если между развёртыванием первого master-узла и worker-узла пройдёт более 24 часов, надо повторно сгенерировать этот токен на мастере.
Err: connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused
+
kubeadm token create --print-join-command
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
 
----
 
  
----
+
Раскидываем конфиг на все ноды
если вываливается с ошибкой
+
cp /etc/kubernetes/admin.conf /root/.kube/config
[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"
+
scp /root/.kube/config root@192.168.150.6X:/root/.kube/
  
лечим так
 
mv /etc/containerd/config.toml /etc/containerd/config.toml.bk
 
systemctl restart containerd
 
----
 
  
раскидываем конфиг на все ноды
+
Проверяем статус нод, все NotReady
mkdir /root/.kube
+
kubectl get nodes -o wide
cp /etc/kubernetes/admin.conf /root/.kube/config
 
scp /root/.kube/config root@192.168.150.6X:/root/.kube/
 
  
проверяем статус нод, все NotReady
+
Смотрим список подов(-A во всех неймспейсах). Видим, что некоторые Pending
kubectl get nodes -o wide
+
kubectl get pods -A
  
смотрим список подов(-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. Никто не обязывает этого делать, можно использовать дефолтную сеть flannel
  
чтобы всё пришло в нормальный вид, ставим сетевой плагин для сетевого взаимодействия между контейнерами, в данном случае flannel
+
Применяем
скачиваем
+
kubectl apply -f kube-flannel.yml
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
+
Кусок конфига для haproxy для балансировки мастеров(если их больше одного)
 +
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
  
устанавливаем
 
kubectl apply -f kube-flannel.yml
 
  
 +
Установим web-консоль K8S
 +
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
  
настроим 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
+
На мастере качаем файлик для настройки ресурсов UI
mode tcp
+
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
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
+
Настроим ресурс Service. Добавляем type: NodePort и указываем любой порт nodePort в диапазоне 30000-32767.
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
+
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
  
на мастере качаем файлик для настройки ресурсов UI
+
Применяем
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
+
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
  
Настроим ресурс 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
+
На мастере создаём токен с помощью которого логинимся в UI,  копируем его и заходим в админку
kubectl get svc -n kubernetes-dashboard
+
kubectl -n kubernetes-dashboard create token admin-user
  
смотрим на какой ноде развернулся pod для UI
 
kubectl get pods -o wide -n kubernetes-dashboard
 
  
идем в браузер и проверяем https://192.168.150.X:30555
+
Всяческие ошибки
 +
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
  
создаём админскую учётку 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, копируем его и заходим в админку
+
  [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
kubectl -n kubernetes-dashboard create token admin-user
+
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

Текущая версия на 16:38, 31 мая 2023

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


Перед настройкой рекомендуется отключить swap

Так же пропишем на всех хостах в /etc/hosts

127.0.0.1   localhost


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

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


Устанавливаем 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


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

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


Поправим конфиг containerd, иначе не взлетит(можно нагуглить, что-то поменяли в 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


Устанавливаем компоненты 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


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

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. Никто не обязывает этого делать, можно использовать дефолтную сеть flannel

Применяем

kubectl apply -f kube-flannel.yml


Кусок конфига для haproxy для балансировки мастеров(если их больше одного)

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


Установим web-консоль 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


Всяческие ошибки

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