Kubernetes: Kubespray установка кластера

Создаем сервера на основе Ubuntu 20.04

Отключаем iptables (ufw, netfilter-persistent), apparmor

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

ssh-keygen

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

ssh-copy-id master1
ssh-copy-id master2
ssh-copy-id master3
ssh-copy-id worker1
ssh-copy-id worker2
ssh-copy-id worker3
git clone https://github.com/kubernetes-sigs/kubespray/
cd kubespray/inventory
cp -r sample cluster
cd cluster

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

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

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

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

[all]
master1.server.local ansible_host=10.1.0.1 ansible_user=root
master2.server.local ansible_host=10.1.0.2 ansible_user=root
master3.server.local ansible_host=10.1.0.3 ansible_user=root
worker1.server.local ansible_host=10.1.0.4 ansible_user=root
worker2.server.local ansible_host=10.1.0.5 ansible_user=root
worker3.server.local ansible_host=10.1.0.6 ansible_user=root

[kube_control_plane]
master1.server.local
master2.server.local
master3.server.local

[etcd]
master1.server.local
master2.server.local
master3.server.local

[kube_node]
worker1.server.local
worker2.server.local
worker3.server.local

[calico_rr]

[k8s-cluster:children]
kube_control_plane
kube_node
calico_rr

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

  • 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: docker — определяем систему контейнеризации.
  • k8s_image_pull_policy: IfNotPresent — политика загрузки образов системных контейнеров кластера.
  • system_memory_reserved: 512Mi — зарезервированная за Linux системой (приложениями) память.
  • system_cpu_reserved: 500m — зарезервированное за Linux системой (приложениями) время процессора.
  • kube_proxy_strict_arp: true — отключаем ответы на ARP, необходимо ставить в true при установке MetalLB (описано ниже).
  • force_certificate_regeneration: true — Автоматический перевыпуск сертификатов для кубернетес control plane. Без необходимости увеличения версии кластера.
  • calico_ipip_mode: ‘CrossSubnet’ — Определяем когда использовать IP in IP режим. ‘CrossSubnet’ чтобы минимизировать накладные расходы инкапсуляции, но можно закоментировать.
  • dashboard_enabled: true — разрешаем установить Dashboard.
  • helm_enabled: true — разрешаем развертывание пакетного менеджера Helm.
  • metrics_server_enabled: true — разрешаем развертывание Metrics.
  • metrics_server_kubelet_insecure_tls: true — разрешаем работать Metrics в не-защищенном режиме.

для использования type:LoadBalancer и при отсутствии аннотаций балансировщиков, предлагаемых провайдером, используем MetalLB в режиме layer2 https://metallb.universe.tf/concepts/layer2/ В этом случае очень много ньюансов установки, для некоторых провайдеров понадобится отключение режима контроля источника iptables, где-то необходимо будет на маршрутизатора править настройки и т.д. Поэтому установка MetalLB сугубо опциональна.

  • metallb_enabled: true — разрешаем установку MetalLB.
  • metallb_speaker_enabled: true
  • metallb_ip_range:
    - «10.1.0.240-10.1.0.250» — выбираем не занятый диапазон адресов для MetalLB, на которых будут располагатся сервисы.
  • metallb_protocol: «layer2» — выбираем режим работы layer2
  • 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

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

kubectl get nodes -o wide
NAME                     STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION
master1.server.local    Ready    master1,master         25m   v1.20.2     10.1.0.1         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64
master2.server.local    Ready    master2,master         25m   v1.20.2     10.1.0.2         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64
master3.server.local    Ready    master3,master         24m   v1.20.2     10.1.0.3         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64
worker1.server.local    Ready    <none>                 22m   v1.20.2     10.1.0.4         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64
worker2.server.local    Ready    <none>                 22m   v1.20.2     10.1.0.5         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64
worker3.server.local    Ready    <none>                 13m   v1.20.2     10.1.0.6         <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64

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

docker ps
IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID
43154ddb57a83       15 minutes ago      Running             kube-proxy                0                   a5bda83433ae1
ed2c44fbdd78b       15 minutes ago      Running             kube-scheduler            0                   512d577e92ad5
a27166429d98e       15 minutes ago      Running             kube-controller-manager   0                   4f6fa61c307dc
90f9d984ec9a3       23 minutes ago      Running             node-cache                0                   f7d86f788f4eb
cb12d94b194b3       23 minutes ago      Running             calico-node               0                   794808481e7ae
a8c2fdb8bf76e       26 minutes ago      Running             kube-apiserver            0                   55baeed8da067
d1985d4043858       26 minutes ago      Running             etcd                      0                   b43a297393ef9

kubectl get pods --all-namespaces
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.server.local            kube-system         0                   (default)
4f6fa61c307dc       15 minutes ago      Ready               kube-controller-manager-control1.server.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.server.local            kube-system         0                   (default)
b43a297393ef9       27 minutes ago      Ready               etcd-control1.server.local                      kube-system         0                   (default)

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

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