Установка кластера kubernetes в закрытом контуре

Внимание

Данный раздел содержит скрытый код. Нажмите на show_code, чтобы развернуть и посмотреть код.

Важно

Перед установкой кластера Kubernetes выполните Подготовку внутренней инфраструктуры. Установку необходимо выполнить на каждом из серверов, выделенных под кластера Kubernetes.

Примечание

Настройки используемые в запросах:

<nexus_registry> — внутренний репозиторий (пакеты, докер образы).

Для установки кластера Kubernetes в ручном режиме выполните действия:

  1. Войдите на сервер Kubernetes под суперпользователем root для выполнения установки

  2. Отключите swap для исключения использования жесткого диска в случае нехватки оперативной памяти (ОЗУ) и закомментируйте его в fstab, чтобы при перезагрузке swap не включался.

    1# swapoff -a
    2# nano /etc/fstab
    

    Примечание

    Проверить, что swap отключен можно командой free -g. В результате должны получить, что swap равен нулю. Если swap не равен нулю, повторите отключение swap.

  3. Включите переадресацию для разрешения перенаправления пакетов с хоста в docker-контейнеры и из контейнеров в сеть. Чтобы при перезагрузке переадресация включалась автоматически, выполните команду:

    1# echo 1 > /proc/sys/net/ipv4/ip_forward
    2# echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
    
  4. Загрузите сетевые модули в ядро ОС.

    1# modprobe br_netfilter
    2# modprobe overlay
    
  5. Закомментируйте все установленные репозитории для исключения обращения с настраиваемых хостов к внешним репозиториям (т.к. контур закрытый).

    1# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
    
  6. Настройте внутренний репозиторий и установите пакеты.

    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
    
  7. Установите плагин 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
    
  8. Установите среду исполнения контейнера 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
    
  9. Добавьте настройки в конфиг 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
    
  10. Установите инструмент настройки кластера 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
  1. Настройте 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
  1. Установите и настройте 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
  1. Установите 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
  1. Инициализируйте кластер только на первой мастер-ноде (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
  1. Если все пройдет успешно в выводе команды инициализации будет сообщение с командами для добавления новых master и worker. Сохраните эти команды.

Далее необходимо добавить нужное количество master-нод и worker-нод и повторить шаги по добавлению кластера в kubernetes

  1. Проверьте состояния нод кластера

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