Установка кластера kubernetes в закрытом контуре
Важно
Перед установкой кластера Kubernetes выполните Подготовку внутренней инфраструктуры. Установку необходимо выполнить на каждом из серверов, выделенных под кластера Kubernetes.
Примечание
Настройки используемые в запросах:
<nexus_registry> — внутренний репозиторий (пакеты, докер образы).
Для установки кластера Kubernetes в ручном режиме выполните действия:
Войдите на сервер Kubernetes под суперпользователем root для выполнения установки
Отключите swap для исключения использования жесткого диска в случае нехватки оперативной памяти (ОЗУ) и закомментируйте его в fstab, чтобы при перезагрузке swap не включался.
1# swapoff -a 2# nano /etc/fstab
Примечание
Проверить, что swap отключен можно командой free -g. В результате должны получить, что swap равен нулю. Если swap не равен нулю, повторите отключение swap.
Включите переадресацию для разрешения перенаправления пакетов с хоста в docker-контейнеры и из контейнеров в сеть. Чтобы при перезагрузке переадресация включалась автоматически, выполните команду:
1# echo 1 > /proc/sys/net/ipv4/ip_forward 2# echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
Загрузите сетевые модули в ядро ОС.
1# modprobe br_netfilter 2# modprobe overlay
Закомментируйте все установленные репозитории для исключения обращения с настраиваемых хостов к внешним репозиториям (т.к. контур закрытый).
1# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
Настройте внутренний репозиторий и установите пакеты.
1# curl http://<nexus_registry>/gpg | sudo apt-key add - 2# sudo add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main" 3# apt update 4# apt upgrade 5# apt install conntrack iptables containerd socat
Установите плагин CNI. Плагин CNI нужен для организации сетевого взаимодействия контейнеров внутри кластера Kubernetes.
1# mkdir -p /opt/cni/bin 2# curl -L "http://<nexus_registry>:8081/repository/test-RAW/cni/cni-plugins-linux-amd64-v1.4.0.tgz" | tar -C /opt/cni/bin -xz
Установите среду исполнения контейнера crictl.
1# DOWNLOAD_DIR="/usr/local/bin" 2# ARCH="amd64" 3# CRICTL_VERSION="v1.29.0" 4# K8S_RELEASE="v1.29.2" 5# mkdir -p "$DOWNLOAD_DIR" 6# curl -L "http://<nexus_registry>:8081/repository/test-RAW/crictl/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | tar -C $DOWNLOAD_DIR -xz
Добавьте настройки в конфиг crictl, для отключения предупреждений при выполнении команд, связанных с crictl:
1#nano /etc/crictl.yaml 2runtime-endpoint: "unix:///run/containerd/containerd.sock" 3image-endpoint: "unix:///run/containerd/containerd.sock" 4timeout: 0 5debug: false 6pull-image-on-create: false 7disable-pull-on-run: false
Установите инструмент настройки кластера Kubernetes kubeadm и инструмент управления нодами кластера kubelet.
1# cd $DOWNLOAD_DIR 2# curl -L --remote-name-all "http://<nexus_registry>:8081/repository/test-RAW/kubeadm/kubeadm-${K8S_RELEASE}" -o kubeadm 3# curl -L --remote-name-all "http://<nexus_registry>:8081/repository/test-RAW/kubelet/kubelet-${K8S_RELEASE}" -o kubelet 4# chmod +x {kubeadm,kubelet} 5# curl -sSL "http://<nexus_registry>:8081/repository/test-RAW/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service 6# mkdir -p /etc/systemd/system/kubelet.service.d 7# curl -sSL "http://<nexus_registry>:8081/repository/test-RAW/kubelet/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 8# systemctl enable --now kubelet
Настройте containerd для работы в закрытом контуре:
сгенерируйте config
исправьте config
перезапустите containerd
1# containerd config default>/etc/containerd/config.toml 2# nano /etc/containerd/config.toml 3изменить опции 4 disable_cgroup = false 5 sandbox_image = "<nexus_registry>:5000/pause:3.6" 6 SystemdCgroup = true 7найти [plugins."io.containerd.grpc.v1.cri".registry.configs] 8и добавить 9 [plugins."io.containerd.grpc.v1.cri".registry.configs."<nexus_registry>:5000"] 10 11 [plugins."io.containerd.grpc.v1.cri".registry.configs."<nexus_registry>:5000".tls] 12 ca_file = "" 13 cert_file = "" 14 insecure_skip_verify = true 15 key_file = "" 16найти [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 17и добавить: 18 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<nexus_registry>:5000"] 19 endpoint = ["http://<nexus_registry>:5000"] 20# systemctl restart containerd
Установите и настройте keepalived, haproxy, nginx (на местер-нодах dhl-app(1-3)-tst) для обеспечения отказоустойчивости.
Примечание
Если одна из мастер-нод падает, виртуальный адрес переназначается на одну из 2-х оставшихся мастер-нод и все продолжает работать.
1# apt install -y keepalived haproxy nginx 2# nano /etc/keepalived/keepalived.conf 3global_defs { 4 enable_script_security 5 script_user nobody 6} 7 8vrrp_script check_apiserver { 9 script "/etc/keepalived/check_apiserver.sh" 10 interval 3 11} 12 13vrrp_instance VI_1 { 14 state BACKUP 15 interface ens192 16 virtual_router_id 5 17 priority 100 18 advert_int 1 19 nopreempt 20 authentication { 21 auth_type PASS 22 auth_pass ZqSj#f1G 23 } 24 virtual_ipaddress { 25 10.0.2.254 26 } 27 track_script { 28 check_apiserver 29 } 30} 31 32nano /etc/keepalived/check_apiserver.sh 33#!/bin/sh 34 35APISERVER_VIP=10.0.2.254 36APISERVER_DEST_PORT=7443 37PROTO=http 38 39errorExit() { 40 echo "*** $*" 1>&2 41 exit 1 42} 43 44curl --silent --max-time 2 --insecure ${PROTO}://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET ${PROTO}://localhost:${APISERVER_DEST_PORT}/" 45if ip addr | grep -q ${APISERVER_VIP}; then 46 curl --silent --max-time 2 --insecure ${PROTO}://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET ${PROTO}://${APISERVER_VIP}:${APISERVER_DEST_PORT}/" 47fi 48 49# chmod +x /etc/keepalived/check_apiserver.sh 50# systemctl enable keepalived 51# systemctl start keepalived 52 53# nano /etc/haproxy/haproxy.cfg 54global 55 log /dev/log local0 56 log /dev/log local1 notice 57 daemon 58 59defaults 60 mode http 61 log global 62 option httplog 63 option dontlognull 64 option http-server-close 65 option forwardfor except 127.0.0.0/8 66 option redispatch 67 retries 1 68 timeout http-request 10s 69 timeout queue 20s 70 timeout connect 5s 71 timeout client 20s 72 timeout server 20s 73 timeout http-keep-alive 10s 74 timeout check 10s 75 76frontend apiserver 77 bind *:7443 78 mode tcp 79 option tcplog 80 default_backend apiserver 81 82backend apiserver 83 option httpchk GET /healthz 84 http-check expect status 200 85 mode tcp 86 option ssl-hello-chk 87 balance roundrobin 88 server node1 10.0.2.64:6443 check 89 server node2 10.0.2.65:6443 check 90 server node3 10.0.2.66:6443 check 91 92# systemctl enable haproxy 93# systemctl restart haproxy 94# nano /etc/nginx/sites-available/default 95 upstream frontend { 96 server 10.0.2.67:30618; 97 server 10.0.2.68:30618; 98 server 10.0.2.69:30618; 99 } 100 101 upstream backend { 102 server 10.0.2.67:30162; 103 server 10.0.2.68:30162; 104 server 10.0.2.69:30162; 105 } 106 107 upstream sg { 108 server 10.0.2.67:32601; 109 server 10.0.2.68:32601; 110 server 10.0.2.69:32601; 111 } 112 113 server { 114 listen 80 default_server; 115 server_name _; 116 client_max_body_size 0; 117 118 location / { 119 proxy_pass http://frontend; 120 } 121 122 location /sg/ { 123 proxy_pass http://sg/; 124 } 125 126 location /backend { 127 proxy_pass http://backend; 128 } 129 130 } 131# systemctl enable nginx
Установите kubectl только на мастер-нодах (dlh-app(1-3)-tst)
1# curl -L --remote-name-all "http://<nexus_registry>:8081/repository/test-RAW/kubectl/kubectl-${K8S_RELEASE}" -o kubectl 2# chmod +x kubectl
Инициализируйте кластер только на первой мастер-ноде (dlh-app1-tst)
1# kubeadm init --image-repository <nexus_registry>:5000 --control-plane-endpoint dlh-k8s-tst:7443 --upload-certs 2# export KUBECONFIG=/etc/kubernetes/admin.conf 3# mkdir -p $HOME/.kube 4# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 5# kubectl apply -f http://<nexus_registry>:8081/repository/test-RAW/cni/weave-daemonset-k8s.yaml
Если все пройдет успешно в выводе команды инициализации будет сообщение с командами для добавления новых master и worker. Сохраните эти команды.
Далее необходимо добавить нужное количество master-нод и worker-нод и повторить шаги по добавлению кластера в kubernetes
Проверьте состояния нод кластера
1# kubectl get nodeПример правильного состояния кластера (Status нод в значении Ready)
NAME
STATUS
ROLES
AGE
VERSION
dlh-app1-tst
Ready
control-plane
54d
v1.29.2
dlh-app2-tst
Ready
control-plane
54d
v1.29.2
dlh-app3-tst
Ready
control-plane
53d
v1.29.2
dlh-app4-tst
Ready
<none>
53d
v1.29.2
dlh-app5-tst
Ready
<none>
53d
v1.29.2
dlh-app6-tst
Ready
<none>
53d
v1.29.2