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

Информация об авторе

http://www.tauceti.blog

О проекте

Installs Kubernetes worker.

Установить
ansible-galaxy install githubixx/ansible-role-kubernetes-worker
Лицензия
gpl-3.0
Загрузки
1560
Владелец
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)