kubernetes_worker
ansible-role-kubernetes-worker
Эта роль Ansible используется в Kubernetes the not so hard way with Ansible - Worker. Эта роль Ansible настраивает рабочие узлы Kubernetes. Для получения дополнительной информации смотрите Kubernetes the not so hard way with Ansible - Worker.
Версии
Я маркирую каждую версию и стараюсь придерживаться семантического версионирования. Если вы хотите использовать эту роль, я рекомендую взять последнюю метку. Основная ветка в основном используется для разработки, в то время как метки обозначают стабильные версии. Однако я также стараюсь поддерживать основную ветку в хорошем состоянии. Метка 24.0.0+1.27.8
означает, что это релиз 24.0.0
этой роли, и он предназначен для использования с версией Kubernetes 1.27.8
(но, конечно, должен работать с любым релизом K8s 1.27.x). Если сама роль изменится, то X.Y.Z
до +
увеличится. Если изменится версия Kubernetes, то X.Y.Z
после +
тоже увеличится. Это позволяет обозначать исправления ошибок и новые основные версии роли, пока она все еще разрабатывается для конкретного релиза Kubernetes. Это особенно полезно для мажорных релизов Kubernetes с несовместимыми изменениями.
Требования
Этот плейбук предполагает, что вы уже развернули компоненты контроллера Kubernetes (см. kubernetes-controller и Kubernetes the not so hard way with Ansible - Control plane.
Вам также нужно установить containerd, CNI плагины и runc. Чтобы обеспечить связь между Pods
Kubernetes на разных хостах, имеет смысл позже установить Cilium, когда рабочие узлы будут запущены. Конечно, Calico
, WeaveNet
, kube-router
или flannel или другие сетевые решения для Kubernetes также являются допустимыми вариантами.
Поддерживаемые ОС
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
Изменения
История изменений:
Смотрите полный CHANGELOG.md
ВАЖНО Версия 24.0.0+1.27.8
имела много потенциально несовместимых изменений. Поэтому, если вы обновляетесь с версии < 24.0.0+1.27.8
, пожалуйста, прочитайте CHANGELOG этой версии тоже!
Недавние изменения:
26.0.0+1.29.4
ОБНОВЛЕНИЕ
- Обновление
k8s_release
до1.29.4
- Обновление
MOLECULE
- Использовать
alvistack
вместоgeneric
Vagrant образов
- Использовать
25.0.1+1.28.8
- ОБНОВЛЕНИЕ
- Обновление
k8s_release
до1.28.8
- Обновление
25.0.0+1.28.5
ОБНОВЛЕНИЕ
- Обновление
k8s_release
до1.28.5
- Обновление
ДРУГИЕ ИЗМЕНЕНИЯ
- Корректировка действия Github из-за изменений в Ansible Galaxy
.yamllint
: увеличение максимальной длины строки с 200 до 300
MOLECULE
- Переключение на Ubuntu 22.04 для тестовых виртуальных машин
- Изменение IP-адресов
- Корректировка общих имен для сертификатов / изменение алгоритма на ecdsa и размера алгоритма
- Удаление
collections.yml
Установка
Скачайте напрямую с Github (смените директорию на каталог ролей Ansible перед клонированием. Вы можете узнать путь к роли, используя команду
ansible-config dump | grep DEFAULT_ROLES_PATH
):git clone https://github.com/githubixx/ansible-role-kubernetes-worker.git githubixx.kubernetes_worker
Через команду
ansible-galaxy
и загрузка напрямую из Ansible Galaxy:ansible-galaxy install role githubixx.kubernetes_worker
Создайте файл
requirements.yml
со следующим содержимым (это загрузит роль с Github) и установите с помощьюansible-galaxy role install -r requirements.yml
(изменитеверсию
, если необходимо):
---
roles:
- name: githubixx.kubernetes_worker
src: https://github.com/githubixx/ansible-role-kubernetes-worker.git
version: 26.0.0+1.29.4
Переменные роли
# Основной каталог для конфигурации Kubernetes и файлов сертификатов для
# всех, относящихся к рабочим узлам. После завершения плейбука этот каталог
# будет содержать различные подпапки.
k8s_worker_conf_dir: "/etc/kubernetes/worker"
# Все файлы сертификатов (связанные с инфраструктурой закрытых ключей), указанные в
# "k8s_worker_certificates" (см. "vars/main.yml"), будут храниться здесь.
# Владельцем и группой этого нового каталога будет "root". Права доступа
# будут "0640".
k8s_worker_pki_dir: "{{ k8s_worker_conf_dir }}/pki"
# Каталог для хранения двоичных файлов Kubernetes (см. переменную "k8s_worker_binaries"
# в "vars/main.yml"). Владельцем и группой этого нового каталога
# будет "root" в обоих случаях. Права доступа для этого каталога будут "0755".
#
# ПРИМЕЧАНИЕ: По умолчанию каталог "/usr/local/bin" обычно уже существует на каждом
# установке Linux с упомянутыми выше правами собственности, группами и разрешениями. Если
# ваши текущие настройки отличаются, подумайте об использовании другого каталога. Но убедитесь,
# что новый каталог включен в значение вашей переменной "$PATH".
k8s_worker_bin_dir: "/usr/local/bin"
# Релиз K8s
k8s_worker_release: "1.29.4"
# Интерфейс, на котором должны слушать службы Kubernetes. Так как вся
# связь кластера должна использовать интерфейс VPN, имя интерфейса
# обычно "wg0" (WireGuard), "peervpn0" (PeerVPN) или "tap0".
#
# Сетевой интерфейс, на котором должны слушать рабочие службы Kubernetes. То есть:
#
# - kube-proxy
# - kubelet
#
k8s_interface: "eth0"
# Каталог, откуда копировать сертификаты K8s. По умолчанию это
# будет расширяться к LOCAL $HOME пользователя (пользователь, который выполняет "ansible-playbook ..."
# плюс "/k8s/certs". Это означает, что если каталог $HOME пользователя, например,
# "/home/da_user", то "k8s_ca_conf_directory" будет иметь значение
# "/home/da_user/k8s/certs".
k8s_ca_conf_directory: "{{ '~/k8s/certs' | expanduser }}"
# IP-адрес или имя хоста конечной точки API Kubernetes. Эта переменная
# используется "kube-proxy" и "kubelet" для подключения к "kube-apiserver"
# (API-сервер Kubernetes).
#
# По умолчанию здесь указан первый хост в группе Ansible "k8s_controller".
# ПРИМЕЧАНИЕ: Эта настройка не устойчива к ошибкам! Это означает,
# что если первый хост в группе Ansible "k8s_controller" недоступен,
# то рабочий узел и его нагрузка продолжают работать, но рабочий
# узел не получает никаких обновлений с API-сервера Kubernetes.
#
# Если у вас есть балансировщик нагрузки, который распределяет трафик между всеми
# API-серверами Kubernetes, он должен быть указан здесь (или его IP-адрес,
# или DNS-имя). Но вам нужно убедиться, что IP
# адрес или DNS-имя, которое вы хотите использовать здесь, включены в
# TLS сертификат API-сервера Kubernetes (см. переменную "k8s_apiserver_cert_hosts"
# из https://github.com/githubixx/ansible-role-kubernetes-ca
# роли). Если он не указан, вы получите ошибки сертификата в
# журналах упомянутых выше служб.
k8s_worker_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# Как выше, только для порта. Он указывает, на каком порту
# слушают API-серверы Kubernetes. Опять же, если есть балансировщик нагрузки,
# который распределяет запросы к API-серверам Kubernetes,
# укажите порт балансировщика нагрузки здесь.
k8s_worker_api_endpoint_port: "6443"
# Пакеты ОС, необходимые на рабочем узле Kubernetes. Вы можете добавлять дополнительные
# пакеты в любое время. Но, пожалуйста, имейте в виду, что если вы удалите один или несколько из
# списка по умолчанию, ваш рабочий узел может не работать так, как ожидалось, или вообще не работать.
k8s_worker_os_packages:
- ebtables
- ethtool
- ipset
- conntrack
- iptables
- iptstate
- netstat-nat
- socat
- netbase
# Каталог для хранения конфигурации kubelet
k8s_worker_kubelet_conf_dir: "{{ k8s_worker_conf_dir }}/kubelet"
# Настройки kubelet
#
# Если вы хотите включить использование "RuntimeDefault" в качестве профиля seccomp по умолчанию
# для всех нагрузок, добавьте эти настройки в "k8s_worker_kubelet_settings":
#
# "seccomp-default": ""
#
# Также смотрите:
# https://kubernetes.io/docs/tutorials/security/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads
k8s_worker_kubelet_settings:
"config": "{{ k8s_worker_kubelet_conf_dir }}/kubelet-config.yaml"
"node-ip": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"kubeconfig": "{{ k8s_worker_kubelet_conf_dir }}/kubeconfig"
# kubelet kubeconfig
k8s_worker_kubelet_conf_yaml: |
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: "{{ k8s_worker_pki_dir }}/ca-k8s-apiserver.pem"
authorization:
mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
- "10.32.0.254"
failSwapOn: true
healthzBindAddress: "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
healthzPort: 10248
runtimeRequestTimeout: "15m"
serializeImagePulls: false
tlsCertFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}.pem"
tlsPrivateKeyFile: "{{ k8s_worker_pki_dir }}/cert-{{ inventory_hostname }}-key.pem"
cgroupDriver: "systemd"
registerNode: true
containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
# Каталог для хранения конфигурации kube-proxy
k8s_worker_kubeproxy_conf_dir: "{{ k8s_worker_conf_dir }}/kube-proxy"
# Настройки kube-proxy
k8s_worker_kubeproxy_settings:
"config": "{{ k8s_worker_kubeproxy_conf_dir }}/kubeproxy-config.yaml"
k8s_worker_kubeproxy_conf_yaml: |
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}
clientConnection:
kubeconfig: "{{ k8s_worker_kubeproxy_conf_dir }}/kubeconfig"
healthzBindAddress: {{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}:10256
mode: "ipvs"
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 2s
iptables:
masqueradeAll: true
clusterCIDR: "10.200.0.0/16"
Зависимости
Пример плейбука
- hosts: k8s_worker
roles:
- githubixx.kubernetes_worker
Тестирование
Эта роль имеет небольшую тестовую конфигурацию, которая создается с использованием Molecule, libvirt (vagrant-libvirt) и QEMU/KVM. Пожалуйста, смотрите мой пост в блоге Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM о том, как настроить. Конфигурация тестирования находится здесь.
После этого вы можете выполнить Molecule. Это создаст несколько виртуальных машин (VM) с поддерживаемой ОС Ubuntu и установит кластер Kubernetes:
molecule converge
На этом этапе кластер еще не полностью функционален, так как отсутствует сетевой плагин. Поэтому связь между Podами на разных узлах пока невозможна. Чтобы исправить это, следующая команда может быть использована для установки Cilium для всех сетевых потребностей Kubernetes и CoreDNS для нужд DNS Kubernetes:
molecule converge -- --extra-vars k8s_worker_setup_networking=install
После этого у вас будет практически полностью функциональный кластер Kubernetes.
Также включен небольшой шаг верификации:
molecule verify
Чтобы очистить, выполните
molecule destroy
Лицензия
GNU GENERAL PUBLIC LICENSE версия 3
Информация об авторе
ansible-galaxy install githubixx/ansible-role-kubernetes-worker