Создание кластера — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 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 | ||
− | |||
− | |||
− | |||
− | |||
Строка 18: | Строка 20: | ||
apt update | apt update | ||
apt install docker-ce docker-ce-cli containerd.io | apt install docker-ce docker-ce-cli containerd.io | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Строка 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 | ||
− | |||
− | |||
− | + | В полученном файле 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 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Раскидываем конфиг на все ноды | |
− | + | 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 | + | 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 | + | 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 |
Текущая версия на 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