Установка кластера kubernetes

00 — подготовительные действия

На машине master запустить DNS сервер с зоной прямого преобразования "kryukov.local":

$TTL 86400
@ IN SOA master.kryukov.local. artur.kryukov.biz. (
                                            2021012100 ;Serial
                                            3600 ;Refresh
                                            1800 ;Retry
                                            604800 ;Expire
                                            86400 ;Minimum TTL
)

@ IN NS master

master          IN      A       192.168.218.170
control1        IN      A       192.168.218.171
control2        IN      A       192.168.218.172
control3        IN      A       192.168.218.173

worker1         IN      A       192.168.218.174
worker2         IN      A       192.168.218.175
worker3         IN      A       192.168.218.176

и зоной обратного преобразования "218.168.192.in-addr.arpa".

$TTL 86400
@ IN SOA master.kryukov.local. artur.kryukov.biz. (
                                            2021012100 ;Serial
                                            3600 ;Refresh
                                            1800 ;Retry
                                            604800 ;Expire
                                            86400 ;Minimum TTL
)
@ IN NS master.kryukov.local.

170 IN PTR master.kryukov.local.

171     IN      PTR     control1.kryukov.local.
172     IN      PTR     control2.kryukov.local.
173     IN      PTR     control3.kryukov.local.

174     IN      PTR     worker1.kryukov.local.
175     IN      PTR     worker2.kryukov.local.
176     IN      PTR     worker3.kryukov.local.

Сгенерировать, если его ещё нет, ssh ключ:

ssh-keygen

Установить ssh ключ на машины кластера.

ssh-copy-id control1
ssh-copy-id control2
ssh-copy-id control3
ssh-copy-id worker1
ssh-copy-id worker2
ssh-copy-id worker3

Переходим в директорию 00-ansible.

Проверяем подключение ansible к хостам:

ansible-playbook ping.yaml

Если ping не проходит, ищем ошибки и исправляем.

Приводим настройки серверов кластера к одному виду:

ansible-playbook prepare-hosts.yaml

Kubespray

git clone https://github.com/kubernetes-sigs/kubespray
cd kubespray/inventory
cp sample cluster
cd cluster

Параметры кластера в файлах kubespray

Перейдите в директорию inventory.

Скопируйте пример конфигурации кластера sample в cluster.

Перейдите в директорию cluster и отредактируйте файл inventory.ini.

Пример файла:

[all]
control1.kryukov.local ansible_host=192.168.218.171
control2.kryukov.local ansible_host=192.168.218.172
control3.kryukov.local ansible_host=192.168.218.173
worker1.kryukov.local ansible_host=192.168.218.174
worker2.kryukov.local ansible_host=192.168.218.175
worker3.kryukov.local ansible_host=192.168.218.176

[kube-master]
control1.kryukov.local
control2.kryukov.local
control3.kryukov.local

[etcd]
control1.kryukov.local
control2.kryukov.local
control3.kryukov.local

[kube-node]
worker1.kryukov.local
worker2.kryukov.local
worker3.kryukov.local

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

Остальные параметры будем изменять в файлах в директории group_vars.

group_vars/k8s-cluster/k8s-cluster.yml

  • kube_version: v1.20.2 — выбираем версию кластера кубернетес.
  • kube_network_plugin: calico — выбираем драйвер сети кластера.
  • kube_service_addresses: 10.233.0.0/18 — диапазон адресов для сервисов кластера.
  • kube_pods_subnet: 10.233.64.0/18 — диапазон адресов для подов кластера.
  • kube_network_node_prefix: 24 — размер подсети подов на ноде кластера.
  • kube_apiserver_port: 6443 — Порт API сервера кластера.
  • kube_proxy_mode: ipvs — режим iptables не ставим.
  • cluster_name: cluster.local — имя кластера. Используется в качестве корневого домена во внутреннем DNS сервере.
  • enable_nodelocaldns: true — включаем кеширующие DNS сервера на каждой ноде кластера.
  • nodelocaldns_ip: 169.254.25.10 — IP адрес кешируюшего DNS сервера на ноде.
  • container_manager: containerd — определяем систему контейнеризации.
  • k8s_image_pull_policy: IfNotPresent — политика загрузки образов системных контейнеров кластера.
  • system_memory_reserved: 512Mi — зарезервированная за Linux системой (приложениями) память.
  • system_cpu_reserved: 500m — зарезервированное за Linux системой (приложениями) время процессора.
  • force_certificate_regeneration: true — Автоматический перевыпуск сертификатов для кубернетес control plane. Без необходимости увеличения версии кластера.

group_vars/k8s-cluster/k8s-net-calico.yml

  • calico_ipip_mode: ‘CrossSubnet’ — Определяем когда использовать IP in IP режим.

group_vars/all/all.yml

  • etcd_kubeadm_enabled: true — разрешаем установку и etcd средствами kubeadm.
  • loadbalancer_apiserver_type: nginx — значение по умолчанию. Доступ к k8s API через loopback интерфейс ноды кластера.

Продолжаем

Переходим в корень kubespray и запускаем установку кластера. Для этого в системе должны быть установлены интерпретатор python и pip.

pip install -r requirements.txt
ansible-playbook -i inventory/cluster/inventory.ini cluster.yml

После установки на ноде control1 можно посмотреть состояние кластера.

kubectl get nodes -o wide
NAME                     STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
control1.kryukov.local   Ready    control-plane,master   25m   v1.20.2   192.168.218.171   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9
control2.kryukov.local   Ready    control-plane,master   25m   v1.20.2   192.168.218.172   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9
control3.kryukov.local   Ready    control-plane,master   24m   v1.20.2   192.168.218.173   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9
worker1.kryukov.local    Ready    <none>                 22m   v1.20.2   192.168.218.174   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9
worker2.kryukov.local    Ready    <none>                 22m   v1.20.2   192.168.218.175   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9
worker3.kryukov.local    Ready    <none>                 13m   v1.20.2   192.168.218.176   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   containerd://1.3.9

Для просмотра контейнеров на ноде, вместо docker следует использовать crictl

crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID
1097d550bb381       43154ddb57a83       15 minutes ago      Running             kube-proxy                0                   a5bda83433ae1
47baed40e7ae9       ed2c44fbdd78b       15 minutes ago      Running             kube-scheduler            0                   512d577e92ad5
ccc6233675992       a27166429d98e       15 minutes ago      Running             kube-controller-manager   0                   4f6fa61c307dc
9d88053806de9       90f9d984ec9a3       23 minutes ago      Running             node-cache                0                   f7d86f788f4eb
74c2eb6a0a4a6       cb12d94b194b3       23 minutes ago      Running             calico-node               0                   794808481e7ae
c38354995b6d0       a8c2fdb8bf76e       26 minutes ago      Running             kube-apiserver            0                   55baeed8da067
bee1356874171       d1985d4043858       26 minutes ago      Running             etcd                      0                   b43a297393ef9

crictl pods
POD ID              CREATED             STATE               NAME                                             NAMESPACE           ATTEMPT             RUNTIME
a5bda83433ae1       15 minutes ago      Ready               kube-proxy-xbqkc                                 kube-system         0                   (default)
512d577e92ad5       15 minutes ago      Ready               kube-scheduler-control1.kryukov.local            kube-system         0                   (default)
4f6fa61c307dc       15 minutes ago      Ready               kube-controller-manager-control1.kryukov.local   kube-system         0                   (default)
f7d86f788f4eb       23 minutes ago      Ready               nodelocaldns-szggp                               kube-system         0                   (default)
794808481e7ae       23 minutes ago      Ready               calico-node-kxlpj                                kube-system         0                   (default)
55baeed8da067       27 minutes ago      Ready               kube-apiserver-control1.kryukov.local            kube-system         0                   (default)
b43a297393ef9       27 minutes ago      Ready               etcd-control1.kryukov.local                      kube-system         0                   (default)

crictl --help

Установите в bash автодополнение для команд kubectl:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc