====== 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
===== Kubespray =====
git clone https://github.com/kubernetes-sigs/kubespray/
cd kubespray/inventory
cp -r sample cluster
cd cluster
===== Параметры кластера в файлах kubespray =====
Перейдите в директорию 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.
==== 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**: //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. Без необходимости увеличения версии кластера.
==== group_vars/k8s-cluster/k8s-net-calico.yml ====
* **calico_ipip_mode**: ‘CrossSubnet’ — Определяем когда использовать IP in IP режим. ‘CrossSubnet’ чтобы минимизировать накладные расходы инкапсуляции, но можно закоментировать.
==== group_vars/k8s-cluster/addons.yml ====
* **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/|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
==== 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
После установки на ноде 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 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 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 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64
worker1.server.local Ready 22m v1.20.2 10.1.0.4 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64
worker2.server.local Ready 22m v1.20.2 10.1.0.5 CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64
worker3.server.local Ready 13m v1.20.2 10.1.0.6 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