====== 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