DO-1431 Co-authored-by: denis.patrakeev <denis.patrakeev@avroid.tech> Reviewed-on: https://git.avroid.tech/K8s/k8s-deploy/pulls/1
Требования
Версия Kuberspray и Kubernetes у текущих инвентору
| Kuberspray | v2.25.1 |
|---|---|
| Kubernetes | v1.29.10 |
TODO: ???
Особенности развертывания кластера
| Модуль | Комментарий |
|---|---|
| Cluster name | k8s.avroid.local |
| Сеть | Только IPv4 |
| Сеть | 172.24.0.0/18 - подсеть сервисов |
| Сеть | 172.24.64.0/18 - подсеть подов |
| Сеть | 10000-32767 - список портов, разрешённый к форвардингу на нодах |
| Маска подсети на ноду | 25 (Итого - max 126 на ноде и max 128 нод) |
| CNI | calico |
| DNS zone | k8s.<ОКРУЖЕНИЕ_XX>.local |
| DNS | Dual CoreDNS + nodelocaldns |
| Etcd | данные сервиса в /data/etcd на отдельном блочном устройстве с ext4) |
| Core | containerd (/var/lib/containerd на отдельном блочном устройстве с XFS) |
| Приватные регистри | nexus.local.club в настройках |
| HA | API Server |
| NTP | Настроен с российскими серверами и Московской таймзоной |
| Ingress | Nginx ingress controller 80 --> 30100 (Node), 443 --> 30101 (Node) |
| Дополнительные сервисы | Kubernetes dashboard, Helm, Metrics Server, Cert manager, netchecker |
| netchecker | netchecker |
| Local storage | Локальный диск на master-нодах для Prometheus через local_volume_provisioner |
Доступ до развёрнутых сервисов
Kubernetes Dashboard:
Kubespray docs: Accessing Kubernetes Dashboard
Official docs: Accessing Kubernetes Dashboard
Ingress NGINX Controller
https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme
С кастомными патчами из ./pathes/ingress_nginx
<worker_node>:30100/TCP --> nginx:80/TCP
<worker_node>:30101/TCP --> nginx:443/TCP
DNS
https://github.com/kubernetes/dns/blob/master/docs/specification.md
<worker_node>:53/UDP
netchecker
https://github.com/Mirantis/k8s-netchecker-server
http://<IP_АДРЕС_НОДЫ>:31081/api/v1/agents/
http://<IP_АДРЕС_НОДЫ>:31081/api/v1/connectivity_check
http://<IP_АДРЕС_НОДЫ>:31081/metrics
Подготовка окружения для развёртывания и развёртывание
1. Предварительная подготовка ВМ
Предварительно готовим ВМ основным набором спритов Ansible со следующими особенностями:
- настраиваем дополнительные диски и точки монтирования
- настраиваем авторизацию доменную
- отключаем настройку NTP
- отключаем настройку node_exporter
2. Обновляем подмодуль с Kubespray и проверяем что он стоит на необходимом тэге
cd env/<ОКРУЖЕНИЕ_XX>
git submodule update --init --recursive
cd kukbespray
git status
cd ../
3. Переходим в каталог с Kubespray
cd kubespray
4. Готовим окружение Ansible
Kubespray docs: Ansible Python Compatibility
| Ansible Version | Python Version |
|---|---|
| 2.11 | 2.7,3.5-3.9 |
| 2.12 | 3.8-3.10 |
| >=2.16.4 | 3.10-3.12 |
VENVDIR=kubespray-venv
KUBESPRAYDIR=kubespray
virtualenv --python=$(which python3) -m venv $VENVDIR
source $VENVDIR/bin/activate
cd $KUBESPRAYDIR
pip install -U -r requirements.txt
TODO: ???
5. Копируем инвентори
cp -r <...>/inventory ./inventory/
6. Запускаем раскатку кластера
ansible-playbook cluster.yml -i ../inventory/inventory.ini -bkK -v
7. Копируем конфиг для подключения к кластеру через kubectl
Копируем с любой из master-нод конфиг:
/etc/kubernetes/admin.conf
К себе на машину и правим, в опции server указываем вместо 127.0.0.1 внешний адрес мастер-ноды.
Затем настраиваем любым удобным способом работу с кластером через него: Kubespray docs: Access the kubernetes cluster
8. Применяем кастомные патчи для Ingress NGINX
kubectl --kubeconfig='config_k8s.<ОКРУЖЕНИЕ_XX>.local' -n ingress-nginx apply -f ./pathes/ingress_nginx/svc-ingress-nginx-controller.yaml
kubectl --kubeconfig='config_k8s.<ОКРУЖЕНИЕ_XX>.local' -n ingress-nginx apply -f ./pathes/ingress_nginx/ic-ingress-nginx.yaml
Дополнительные действия с кластером через Kubespray
Дополнительные теги: Kubespray docs: Ansible tags
Добавление/удаление нод: Kubespray docs: Adding/replacing a node
Обновление кластера: Kubespray docs: Upgrading Kubernetes in Kubespray