rke2
RKE2 Ansible Роль
Эта Ansible роль развернет RKE2 кластер Kubernetes. RKE2 будет установлен с помощью метода tarball.
Роль может установить RKE2 в 3 режимах:
RKE2 один узел
RKE2 кластер с одним сервером (мастером) и одним или несколькими агентами (рабочими узлами)
RKE2 кластер с сервером (мастером) в режиме высокой доступности и нулем или более агентами (рабочими узлами). В режиме HA должно быть нечетное количество (рекомендуется три) серверов (мастеров), которые будут запускать etcd, Kubernetes API (адрес VIP от Keepalived или Kube-VIP) и другие службы управления.
- Кроме того, возможно установить кластер RKE2 (все 3 режима) в режиме Air-Gapped с использованием локальных артефактов.
Можно обновить RKE2, изменив переменную
rke2_version
и перезапустив плейбук с этой ролью. В процессе обновления служба RKE2 на узлах будет перезапускаться по одному. Ansible Роль проверит, находится ли узел, на котором служба была перезапущена, в состоянии "Готов", и только тогда продолжит перезапуск службы на другом узле Kubernetes.
Требования
- Ansible 2.10+
Протестировано на
- Rocky Linux 9
- Ubuntu 24.04 LTS
Переменные роли
Это копия defaults/main.yml
---
# Тип узла - сервер или агент
rke2_type: server
# Развертывание контрольной плоскости в режиме HA
rke2_ha_mode: false
# Установить и настроить Keepalived на серверных узлах
# Можно отключить, если вы используете предварительно настроенный балансировщик нагрузки
rke2_ha_mode_keepalived: true
# Установить и настроить нагрузочный балансировщик kube-vip и VIP для кластера
# rke2_ha_mode_keepalived должен быть false
rke2_ha_mode_kubevip: false
# Kubernetes API и IP-адрес регистрации RKE2. По умолчанию используется адрес IPv4 серверного (мастер) узла.
# В режиме HA выберите статический IP, который будет установлен как VIP в keepalived.
# Или, если keepalived отключен, используйте IP-адрес вашего балансировщика нагрузки.
rke2_api_ip: "{{ hostvars[groups[rke2_servers_group_name].0]['ansible_default_ipv4']['address'] }}"
# Опционально, чтобы RKE2 сервер слушал на частном IP-адресе на порту 9345
# rke2_api_private_ip:
# Опционально для подсети IP kubevip
# rke2_api_cidr: 24
# Опционально для kubevip
# rke2_interface: eth0
# Опционально для IPv4/IPv6 адресов, которые будут рекламироваться для узла
# rke2_bind_address: "{{ hostvars[inventory_hostname]['ansible_' + rke2_interface]['ipv4']['address'] }}"
# Диапазон IP-адресов для балансировщика нагрузки kubevip
rke2_loadbalancer_ip_range: {}
# диапазон-глобальный: 192.168.1.50-192.168.1.100
# cidr-финанс: 192.168.0.220/29,192.168.0.230/29
# Установить облачный провайдер kubevip, если rke2_ha_mode_kubevip равен true
rke2_kubevip_cloud_provider_enable: true
# Включить kube-vip для отслеживания сервисов типа LoadBalancer
rke2_kubevip_svc_enable: true
# Указать, какой образ используется для контейнера kube-vip
rke2_kubevip_image: ghcr.io/kube-vip/kube-vip:v0.6.4
# Указать, какой образ используется для контейнера облачного провайдера kube-vip
rke2_kubevip_cloud_provider_image: ghcr.io/kube-vip/kube-vip-cloud-provider:v0.0.4
# Включить kube-vip IPVS балансировщика нагрузки для контрольной плоскости
rke2_kubevip_ipvs_lb_enable: false
# Включить балансировку нагрузки 4 уровня для контрольной плоскости с использованием модуля ядра IPVS
# Необходимо использовать kube-vip версии 0.4.0 или позже
rke2_kubevip_service_election_enable: true
# По умолчанию режим ARP обеспечивает реализацию HA для VIP (вашего IP-адреса сервиса), который будет получать трафик на ведущем kube-vip узле.
# Чтобы обойти это, kube-vip реализовал новую функцию под названием "выборы лидера по сервису",
# вместо того чтобы один узел становился лидером для всех сервисов, выборы проводятся среди всех экземпляров kube-vip, и лидер с этих выборов становится держателем этого сервиса. В конечном итоге,
# это означает, что каждый сервис может оказаться на другом узле, когда он создается, теоретически предотвращая узкое место в начальном развертывании.
# минимальная версия kube-vip 0.5.0
# (Дополнительно) Список флагов kube-vip
# Все флаги можно найти здесь https://kube-vip.io/docs/installation/flags/
# rke2_kubevip_args: []
# - param: lb_enable
# value: true
# - param: lb_port
# value: 6443
# Порт метрик Prometheus для kube-vip
rke2_kubevip_metrics_port: 2112
# Добавить дополнительные SAN в TLS сертификат k8s API
rke2_additional_sans: []
# Настроить домен кластера
# rke2_cluster_domain: cluster.example.net
# Порт назначения API сервера
rke2_apiserver_dest_port: 6443
# Уровень загрязнения серверных узлов
rke2_server_node_taints: []
# - 'CriticalAddonsOnly=true:NoExecute'
# Уровень загрязнения агентских узлов
rke2_agent_node_taints: []
# Предварительно созданный токен, который другие серверные или агентские узлы будут использовать для регистрации при подключении к кластеру
rke2_token: defaultSecret12345
# Версия RKE2
rke2_version: v1.25.3+rke2r1
# URL репозитория RKE2
rke2_channel_url: https://update.rke2.io/v1-release/channels
# URL для установки скрипта bash RKE2
# например, китайское зеркало rancher http://rancher-mirror.rancher.cn/rke2/install.sh
rke2_install_bash_url: https://get.rke2.io
# Локальный каталог данных для RKE2
rke2_data_path: /var/lib/rancher/rke2
# URL по умолчанию для получения артефактов
rke2_artifact_url: https://github.com/rancher/rke2/releases/download/
# Локальный путь для хранения артефактов
rke2_artifact_path: /rke2/artifact
# Необходимые артефакты для режима Airgap
rke2_artifact:
- sha256sum-{{ rke2_architecture }}.txt
- rke2.linux-{{ rke2_architecture }}.tar.gz
- rke2-images.linux-{{ rke2_architecture }}.tar.zst
# Изменить стратегию развертывания для установки на основе локальных артефактов
rke2_airgap_mode: false
# Тип реализации Airgap - download, copy или exists
# - 'download' будет получать артефакты на каждом узле,
# - 'copy' передаст локальные файлы из 'rke2_artifact' на узлы,
# - 'exists' предполагает, что файлы 'rke2_artifact' уже хранятся в 'rke2_artifact_path'
rke2_airgap_implementation: download
# Локальный исходный путь, где хранятся артефакты
rke2_airgap_copy_sourcepath: local_artifacts
# Файлы в формате tarball для дополнительных компонентов, которые будут скопированы из rke2_airgap_copy_sourcepath на узлы
# (Расширения файлов в списке и на реальных файлах должны совпадать)
rke2_airgap_copy_additional_tarballs: []
# Место назначения для дополнительных образов tarball в режиме airgap ( см. https://docs.rke2.io/install/airgap/#tarball-method )
rke2_tarball_images_path: "{{ rke2_data_path }}/agent/images"
# Архитектура для загрузки, в настоящее время доступны версии для amd64 и s390x
rke2_architecture: amd64
# Каталог назначения для скрипта установки RKE2
rke2_install_script_dir: /var/tmp
# Канал RKE2
rke2_channel: stable
# Не развертывать пакеты компонентов и удалить любые развернутые компоненты
# Допустимые элементы: rke2-canal, rke2-coredns, rke2-ingress-nginx, rke2-metrics-server
rke2_disable:
# Опция для отключения kube-proxy
disable_kube_proxy: false
# Опция для отключения встроенного облачного контроллера - в основном для локального размещения
rke2_disable_cloud_controller: false
# Облачный провайдер для использования кластером (aws, azure, gce, openstack, vsphere, external)
# применимо только если rke2_disable_cloud_controller равно true
rke2_cloud_provider_name: "external"
# Путь к пользовательским манифестам, развернутым во время установки RKE2
# Возможно использование шаблонов Jinja2 в манифестах
rke2_custom_manifests:
# Путь к статическим подам, развернутым во время установки RKE2
rke2_static_pods:
# Настроить пользовательский реестр контейнеров
rke2_custom_registry_mirrors: []
# - name:
# endpoint: {}
# rewrite: '"^rancher/(.*)": "mirrorproject/rancher-images/$1"'
# Настроить дополнительные параметры для пользовательского реестра контейнеров
rke2_custom_registry_configs: []
# - endpoint:
# config:
# Путь к шаблону конфигурационного файла реестра контейнеров
rke2_custom_registry_path: templates/registries.yaml.j2
# Путь к шаблону конфигурационного файла RKE2
rke2_config: templates/config.yaml.j2
# Путь к каталогу резервной копии Etcd
rke2_etcd_snapshot_source_dir: etcd_snapshots
# Имя файла резервной копии Etcd.
# Когда имя файла определено, etcd будет восстановлен при первом запуске Ansible.
# Etcd будет восстановлен только во время первого запуска, так что, даже если вы оставите имя файла, он останется нетронутым при следующих запусках.
# Вы можете использовать это или установить параметры в `rke2_etcd_snapshot_s3_options`
rke2_etcd_snapshot_file:
# Место назначения для резервной копии Etcd
rke2_etcd_snapshot_destination_dir: "{{ rke2_data_path }}/server/db/snapshots"
# Параметры резервной копии Etcd s3
# Установите либо все эти значения, либо `rke2_etcd_snapshot_file` и `rke2_etcd_snapshot_source_dir`
# rke2_etcd_snapshot_s3_options:
# s3_endpoint: "" # требуется
# access_key: "" # требуется
# secret_key: "" # требуется
# bucket: "" # требуется
# snapshot_name: "" # требуется.
# skip_ssl_verify: false # опционально
# endpoint_ca: "" # опционально. Может быть пропущено, если используются значения по умолчанию
# region: "" # опционально - по умолчанию us-east-1
# folder: "" # опционально - по умолчанию верхний уровень ведра
# Переопределить стандартный снэпшотер контейнеров
rke2_snapshooter: overlayfs
# Развернуть RKE2 с CNI canal по умолчанию
rke2_cni: canal
# Проверить конфигурацию системы на соответствие выбранному стандарту
# (Поддерживаемое значение - "cis-1.23" или, возможно, "cis-1.6", если вы запускаете RKE2 до 1.25)
rke2_cis_profile: ""
# Скачать файл конфигурации Kubernetes на контроллер Ansible
rke2_download_kubeconf: false
# Имя файла конфигурации Kubernetes, который будет загружен на контроллер Ansible
rke2_download_kubeconf_file_name: rke2.yaml
# Каталог назначения, в который будет загружен файл конфигурации Kubernetes на контроллер Ansible
rke2_download_kubeconf_path: /tmp
# Имя группы инвентаря Ansible по умолчанию для кластера RKE2
rke2_cluster_group_name: k8s_cluster
# Имя группы инвентаря Ansible по умолчанию для серверов RKE2
rke2_servers_group_name: masters
# Имя группы инвентаря Ansible по умолчанию для агентов RKE2
rke2_agents_group_name: workers
# (Опционально) Список флагов сервера API Kubernetes
# Все флаги можно найти здесь https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver
# rke2_kube_apiserver_args: []
# (Опционально) Список меток узлов
# k8s_node_label: []
# (Опционально) Дополнительные параметры конфигурации сервера RKE2
# Вы можете найти флаги по адресу https://docs.rke2.io/reference/server_config
# rke2_server_options:
# - "option: value"
# - "node-ip: {{ rke2_bind_address }}" # например: (agent/networking) IPv4/IPv6 адреса для рекламы узла
# (Опционально) Дополнительные параметры конфигурации агента RKE2
# Вы можете найти флаги по адресу https://docs.rke2.io/reference/linux_agent_config
# rke2_agent_options:
# - "option: value"
# - "node-ip: {{ rke2_bind_address }}" # например: (agent/networking) IPv4/IPv6 адреса для рекламы узла
# (Опционально) Настроить прокси
# Все флаги можно найти здесь https://docs.rke2.io/advanced#configuring-an-http-proxy
# rke2_environment_options: []
# - "option=value"
# - "HTTP_PROXY=http://your-proxy.example.com:8888"
# (Опционально) Настроить аргументы kube-controller-manager по умолчанию
# Эта функция позволяет добавлять аргумент, если его нет по умолчанию, или заменять его, если он уже существует.
# rke2_kube_controller_manager_arg:
# - "bind-address=0.0.0.0"
# (Опционально) Настроить аргументы kube-scheduler по умолчанию
# Эта функция позволяет добавлять аргумент, если его нет по умолчанию, или заменять его, если он уже существует.
# rke2_kube_scheduler_arg:
# - "bind-address=0.0.0.0"
# (Опционально) Настроить nginx через HelmChartConfig: https://docs.rke2.io/networking/networking_services#nginx-ingress-controller
# rke2_ingress_nginx_values:
# controller:
# config:
# use-forwarded-headers: "true"
rke2_ingress_nginx_values: {}
# Запретить, откачать узел, который обновляется. Разрешить узел после обновления RKE2
rke2_drain_node_during_upgrade: false
# Ожидать, пока все поды будут готовы после перезапуска rke2-service во время поэтапного перезапуска.
rke2_wait_for_all_pods_to_be_ready: false
# Включить режим отладки (rke2-service)
rke2_debug: false
# (Опционально) Настроить аргументы kubelet по умолчанию
# rke2_kubelet_arg:
# - "--system-reserved=cpu=100m,memory=100Mi"
# (Опционально) Настроить аргументы kube-proxy по умолчанию
# rke2_kube_proxy_arg:
# - "proxy-mode=ipvs"
# Значение для элемента конфигурации имени узла
rke2_node_name: "{{ inventory_hostname }}"
# сеть для использования для подов.. По умолчанию установлено '10.42.0.0/16'.
rke2_cluster_cidr:
- 10.42.0.0/16
# сеть для использования для ClusterIP сервисов. По умолчанию установлено '10.43.0.0/16'.
rke2_service_cidr:
- 10.43.0.0/16
Пример файла инвентаря
Эта роль полагается на распределение узлов по инвентарным группам masters
и workers
.
Серверные/мастер узлы Kubernetes должны принадлежать группе masters
, а агентские/рабочие узлы должны быть членами группы workers
. Обе группы должны быть дочерними группами k8s_cluster
.
[masters]
master-01 ansible_host=192.168.123.1 rke2_type=server
master-02 ansible_host=192.168.123.2 rke2_type=server
master-03 ansible_host=192.168.123.3 rke2_type=server
[workers]
worker-01 ansible_host=192.168.123.11 rke2_type=agent
worker-02 ansible_host=192.168.123.12 rke2_type=agent
worker-03 ansible_host=192.168.123.13 rke2_type=agent
[k8s_cluster:children]
masters
workers
Пример плейбука
Этот плейбук развернет RKE2 на одном узле, который действует как сервер и агент.
- name: Deploy RKE2
hosts: node
become: yes
roles:
- role: lablabs.rke2
Этот плейбук развернет RKE2 в кластере с одним сервером (мастером) и несколькими агентами (рабочими узлами).
- name: Deploy RKE2
hosts: all
become: yes
roles:
- role: lablabs.rke2
Этот плейбук развернет RKE2 в кластере с одним сервером (мастером) и несколькими агентами (рабочими узлами) в режиме air-gapped. Он будет использовать Multus и Calico как CNI.
- name: Deploy RKE2
hosts: all
become: yes
vars:
rke2_airgap_mode: true
rke2_airgap_implementation: download
rke2_cni:
- multus
- calico
rke2_artifact:
- sha256sum-{{ rke2_architecture }}.txt
- rke2.linux-{{ rke2_architecture }}.tar.gz
- rke2-images.linux-{{ rke2_architecture }}.tar.zst
rke2_airgap_copy_additional_tarballs:
- rke2-images-multus.linux-{{ rke2_architecture }}
- rke2-images-calico.linux-{{ rke2_architecture }}
roles:
- role: lablabs.rke2
Этот плейбук развернет RKE2 в кластере с сервером (мастером) в режиме HA и несколькими агентами (рабочими узлами). Узлы сервера (мастера) будут иметь уровень загрязнения, чтобы нагрузка распределялась только на узлы рабочих агентов. Роль также установит keepalived на узлы контрольной плоскости и настроит VIP адрес, доступный для Kubernetes API. Она также загрузит файл конфигурации Kubernetes на локальную машину.
- name: Deploy RKE2
hosts: all
become: yes
vars:
rke2_ha_mode: true
rke2_api_ip : 192.168.123.100
rke2_download_kubeconf: true
rke2_server_node_taints:
- 'CriticalAddonsOnly=true:NoExecute'
roles:
- role: lablabs.rke2
Использование отдельного токена для узлов-агентов
Согласно документации по конфигурации сервера, возможно определить токен агента, который будет использоваться узлами-агентами для подключения к кластеру, предоставляя им меньше прав в кластер, чем узлы сервера. Для этого необходимо внести следующие изменения в вышеуказанную конфигурацию:
- удалить
rke2_token
из глобальных переменных - добавить в
group_vars/masters.yml
:
rke2_token: defaultSecret12345
rke2_agent_token: agentSecret54321
- добавить в
group_vars/workers.yml
:
rke2_token: agentSecret54321
Хотя изменение токена сервера является проблематичным, токен агента можно менять по желанию, при условии, что у серверов и агентов одно и то же значение, и службы
(rke2-server
и rke2-agent
, соответственно) были перезапущены, чтобы убедиться, что процессы используют новое значение.
Устранение неполадок
Зацикливание плейбука во время запуска службы RKE2 на агентах
Если плейбук начинает зависать во время задачи Start RKE2 service on the rest of the nodes
и затем завершается с ошибкой на задаче Wait for remaining nodes to be ready
, возможно, у вас есть некоторые ограничения на сети узлов.
Пожалуйста, проверьте обязательные Входящие правила для серверных узлов RKE2 по следующей ссылке: https://docs.rke2.io/install/requirements/#networking.
Лицензия
MIT
Информация об авторе
Создана в 2021 году Labyrinth Labs
ansible-galaxy install lablabs/ansible-role-rke2