k3s

Ansible Роль: k3s (v3.x)

Ansible роль для установки K3S ("Легковесный Kubernetes") как на отдельном сервере, так и в кластере.

Нужна помощь!

Привет! :wave: @xanmanning ищет нового поддерживающего разработчика для этой Ansible роли. Это связано с тем, что у меня больше нет свободного времени, и я больше не пишу Ansible регулярно в рамках своей работы. Если вы заинтересованы, свяжитесь со мной.

Примечания к релизу

Пожалуйста, смотрите Релизы и CHANGELOG.md.

Требования

Хост, с которого вы запускаете Ansible, требует следующие зависимости Python:

Вы можете установить зависимости, используя файл requirements.txt в этом репозитории: pip3 install -r requirements.txt.

Эта роль была протестирована на следующих дистрибутивах Linux:

  • Alpine Linux
  • Amazon Linux 2
  • Archlinux
  • CentOS 8
  • Debian 11
  • Fedora 31
  • Fedora 32
  • Fedora 33
  • openSUSE Leap 15
  • RockyLinux 8
  • Ubuntu 20.04 LTS

:warning: Релизы версии v3 этой роли поддерживают только k3s >= v1.19. Для k3s < v1.19 пожалуйста, подумайте о том, чтобы обновиться, или используйте релизы v1.x этой роли.

Перед обновлением, смотрите CHANGELOG для уведомлений о критических изменениях.

Переменные роли

Начиная с K3s v1.19.1+k3s1, вы можете теперь настраивать K3s с помощью конфигурационного файла, а не с использованием переменных окружения или аргументов командной строки. Релиз v2 этой роли перешел на метод конфигурационного файла, вместо заполнения файла юнита systemd аргументами командной строки. Однако могут быть исключения, определенные в Глобальных/Кластерных переменных, в остальном вы будете настраивать k3s с помощью конфигурационных файлов, используя переменные k3s_server и k3s_agent.

Смотрите "Конфигурация сервера (Управляющая плоскость)" и "Конфигурация агента (Рабочий узел)" ниже.

Глобальные/Кластерные переменные

Ниже перечислены переменные, которые устанавливаются для всех игровых хостов для согласованности окружения. Обычно это конфигурация на уровне кластера.

Переменная Описание Значение по умолчанию
k3s_state Состояние k3s: установлен, запущен, остановлен, загружен, удалён, валидирован. установлен
k3s_release_version Использовать конкретную версию k3s, например, v0.2.0. Установите false для стабильной версии. false
k3s_airgap Булевый флаг для включения установки в изолированном режиме false
k3s_config_file Местоположение конфигурационного файла k3s. /etc/rancher/k3s/config.yaml
k3s_build_cluster При наличии нескольких игровых хостов, попытка объединить их в кластер. Смотрите примечания ниже. true
k3s_registration_address Фиксированный адрес регистрации для узлов. IP или FQDN. NULL
k3s_github_url Установить URL GitHub для установки k3s. https://github.com/k3s-io/k3s
k3s_api_url URL для API обновлений K3S. https://update.k3s.io
k3s_install_dir Каталог установки для k3s. /usr/local/bin
k3s_install_hard_links Установка с использованием жестких ссылок вместо символических. false
k3s_server_config_yaml_d_files Плоский список шаблонов для дополнения конфигурации k3s_server. []
k3s_agent_config_yaml_d_files Плоский список шаблонов для дополнения конфигурации k3s_agent. []
k3s_server_manifests_urls Список URL для развертывания на основной управляющей плоскости. Смотрите примечания ниже. []
k3s_server_manifests_templates Плоский список шаблонов для развертывания на основной управляющей плоскости. []
k3s_server_pod_manifests_urls Список URL для установки статических манифестов подов на управляющей плоскости. Смотрите примечания ниже. []
k3s_server_pod_manifests_templates Плоский список шаблонов для установки статических манифестов подов на управляющей плоскости. []
k3s_use_experimental Разрешить использование экспериментальных функций в k3s. false
k3s_use_unsupported_config Разрешить использование неподдерживаемых конфигураций в k3s. false
k3s_etcd_datastore Включить встроенное хранилище etcd (смотрите примечания ниже). false
k3s_debug Включить ведение журнала отладки службы k3s. false
k3s_registries Содержание файла конфигурации реестров. { mirrors: {}, configs:{} }

Конфигурация службы K3S

Ниже перечислены переменные, которые изменяют, как и когда исполняется файл юнита службы systemd для K3S. Использовать с осторожностью, пожалуйста, обратитесь к документации systemd для получения дополнительной информации.

Переменная Описание Значение по умолчанию
k3s_start_on_boot Запускать k3s при загрузке. true
k3s_service_requires Список необходимых юнитов systemd для юнита службы k3s. []
k3s_service_wants Список "желаемых" юнитов systemd для k3s (слабее, чем "требуется"). []*
k3s_service_before Запускать k3s до определённого списка юнитов systemd. []
k3s_service_after Запускать k3s после определённого списка юнитов systemd. []*
k3s_service_env_vars Словарь переменных окружения для использования в файле юнита systemd. {}
k3s_service_env_file Местоположение файла окружения на хосте. false**

* Шаблон юнита systemd всегда указывает network-online.target для "желаемых" и "после".

** Файл должен уже существовать на целевом хосте, эта роль не создаёт и не управляет файлом. Вы можете управлять этим файлом вне роли с помощью предварительных задач в вашем Ansible playbook.

Групповые/Хостовые переменные

Ниже перечислены переменные, которые устанавливаются для отдельных или групп игровых хостов. Обычно вы устанавливаете их на уровне группы для управляющей плоскости или рабочих узлов.

Переменная Описание Значение по умолчанию
k3s_control_node Указывает, является ли хост (или группа хостов) частью управляющей плоскости. false (роль автоматически делегирует узел)
k3s_server Конфигурация сервера (управляющая плоскость), смотрите примечания ниже. {}
k3s_agent Конфигурация агента (работающий узел), смотрите примечания ниже. {}

Конфигурация сервера (Управляющая плоскость)

Управляющая плоскость настраивается с помощью переменной словаря k3s_server. Пожалуйста, обратитесь к нижеуказанной документации для параметров конфигурации:

https://rancher.com/docs/k3s/latest/en/installation/install-options/server-config/

Переменная словаря k3s_server будет содержать флаги из вышеуказанного (удалив префикс --). Ниже приведен пример:

k3s_server:
  datastore-endpoint: postgres://postgres:verybadpass@database:5432/postgres?sslmode=disable
  cluster-cidr: 172.20.0.0/16
  flannel-backend: 'none'  # Это должно быть в кавычках
  disable:
    - traefik
    - coredns

Или вы можете создать файл .yaml и читать его в переменную k3s_server, как в примере ниже:

k3s_server: "{{ lookup('file', 'path/to/k3s_server.yml') | from_yaml }}"

Смотрите Документацию для примеров конфигурации.

Конфигурация агента (Рабочий узел)

Рабочие узлы настраиваются с помощью переменной словаря k3s_agent. Пожалуйста, обратитесь к нижеуказанной документации для параметров конфигурации:

https://rancher.com/docs/k3s/latest/en/installation/install-options/agent-config

Переменная словаря k3s_agent будет содержать флаги из вышеуказанного (удалив префикс --). Ниже приведен пример:

k3s_agent:
  with-node-id: true
  node-label:
    - "foo=bar"
    - "hello=world"

Или вы можете создать файл .yaml и читать его в переменную k3s_agent, как в примере ниже:

k3s_agent: "{{ lookup('file', 'path/to/k3s_agent.yml') | from_yaml }}"

Смотрите Документацию для примеров конфигурации.

Переменные конфигурации контроллера Ansible

Ниже перечислены переменные, которые используются для изменения способа выполнения роли в Ansible, особенно в отношении повышения привилегий.

Переменная Описание Значение по умолчанию
k3s_skip_validation Пропустить все задачи, которые проверяют конфигурацию. false
k3s_skip_env_checks Пропустить все задачи, которые проверяют конфигурацию окружения. false
k3s_skip_post_checks Пропустить все задачи, которые проверяют состояние после выполнения. false
k3s_become Повышение привилегий пользователя для задач, которые требуют прав root. false

Важная заметка о Python

С версии v3 этой роли требуется Python 3 как на целевой системе, так и на контроллере Ansible. Это необходимо для обеспечения согласованного поведения задач Ansible, так как Python 2 сейчас не поддерживается.

Если на целевых системах установлены обе версии Python 2 и Python 3, вероятнее всего, по умолчанию будет выбрана версия Python 2. Чтобы убедиться, что используется Python 3 на целевой системе с обеими версиями, убедитесь, что для ansible_python_interpreter установлен правильный путь в вашем инвентаре. Ниже приведен пример инвентаря:

---

k3s_cluster:
  hosts:
    kube-0:
      ansible_user: ansible
      ansible_host: 10.10.9.2
      ansible_python_interpreter: /usr/bin/python3
    kube-1:
      ansible_user: ansible
      ansible_host: 10.10.9.3
      ansible_python_interpreter: /usr/bin/python3
    kube-2:
      ansible_user: ansible
      ansible_host: 10.10.9.4
      ansible_python_interpreter: /usr/bin/python3

Важная заметка о k3s_release_version

Если вы не установите k3s_release_version, будет установлена последняя версия из стабильного канала k3s. Если вы разрабатываете с использованием конкретной версии k3s, вы должны убедиться, что это значение установлено в вашей конфигурации Ansible, например:

k3s_release_version: v1.19.3+k3s1

Также возможно установить конкретные "Каналы" k3s, ниже приведены некоторые примеры для k3s_release_version:

k3s_release_version: false             # по умолчанию 'stable' канал
k3s_release_version: stable            # последняя 'stable' версия
k3s_release_version: testing           # последняя 'testing' версия
k3s_release_version: v1.19             # последняя 'v1.19' версия
k3s_release_version: v1.19.3+k3s3      # конкретная версия

# Конкретный коммит
# ОСТОРОЖНО - используется только для тестирования - должен быть 40 символов
k3s_release_version: 48ed47c4a3e420fa71c18b2ec97f13dc0659778b

Если вы используете system-upgrade-controller, вам нужно будет использовать жесткие ссылки вместо символических, так как контроллер не сможет следовать за символическими ссылками. Эта опция добавлена, но по умолчанию не включена, чтобы избежать поломки существующих установок.

Чтобы включить использование жестких ссылок, установите k3s_install_hard_links в true.

k3s_install_hard_links: true

Результат этого можно увидеть, выполнив следующую команду в k3s_install_dir:

ls -larthi | grep -E 'k3s|ctr|ctl' | grep -vE ".sh$" | sort

Символические ссылки:

[root@node1 bin]# ls -larthi | grep -E 'k3s|ctr|ctl' | grep -vE ".sh$" | sort
3277823 -rwxr-xr-x 1 root root  52M Jul 25 12:50 k3s-v1.18.4+k3s1
3279565 lrwxrwxrwx 1 root root   31 Jul 25 12:52 k3s -> /usr/local/bin/k3s-v1.18.6+k3s1
3279644 -rwxr-xr-x 1 root root  51M Jul 25 12:52 k3s-v1.18.6+k3s1
3280079 lrwxrwxrwx 1 root root   31 Jul 25 12:52 ctr -> /usr/local/bin/k3s-v1.18.6+k3s1
3280080 lrwxrwxrwx 1 root root   31 Jul 25 12:52 crictl -> /usr/local/bin/k3s-v1.18.6+k3s1
3280081 lrwxrwxrwx 1 root root   31 Jul 25 12:52 kubectl -> /usr/local/bin/k3s-v1.18.6+k3s1

Жесткие ссылки:

[root@node1 bin]# ls -larthi | grep -E 'k3s|ctr|ctl' | grep -vE ".sh$" | sort
3277823 -rwxr-xr-x 1 root root  52M Jul 25 12:50 k3s-v1.18.4+k3s1
3279644 -rwxr-xr-x 5 root root  51M Jul 25 12:52 crictl
3279644 -rwxr-xr-x 5 root root  51M Jul 25 12:52 ctr
3279644 -rwxr-xr-x 5 root root  51M Jul 25 12:52 k3s
3279644 -rwxr-xr-x 5 root root  51M Jul 25 12:52 k3s-v1.18.6+k3s1
3279644 -rwxr-xr-x 5 root root  51M Jul 25 12:52 kubectl

Важная заметка о k3s_build_cluster

Если вы установите k3s_build_cluster в false, эта роль будет устанавливать каждый игровой хост как отдельный узел. Пример, когда вы можете использовать это, — это создание большого количества отдельных IoT-устройств, работающих на K3s. Ниже приведена гипотетическая ситуация, в которой мы собираемся развернуть 25 изменений Raspberry Pi, каждое отдельной системой, а не кластер из 25 узлов. Для этого мы бы использовали playbook, подобный приведенному ниже:

- hosts: k3s_nodes  # например, 25 RPi в нашем инвентаре.
  vars:
    k3s_build_cluster: false
  roles:
     - xanmanning.k3s

Важная заметка о k3s_control_node и высокой доступности (HA)

По умолчанию только один хост будет определён как управляющий узел в Ansible. Если вы не установите хост как управляющий узел, эта роль автоматически делегирует первый игровой хост как управляющий узел. Это не подходит для использования в рабочей нагрузке.

Если несколько хостов имеют k3s_control_node, установленное в true, вы также должны установить datastore-endpoint в k3s_server в качестве строки соединения к базе данных MySQL или PostgreSQL, или внешнему кластеру Etcd, в противном случае выполнение плей будет неудачным.

Если используется TLS, CA, сертификат и ключ должны быть уже доступны на игровых хостах.

Смотрите: Высокая доступность с внешней БД

Также возможно, хотя и не поддерживается, запустить один управляющий узел K3s с определенным datastore-endpoint. Поскольку это не обычно поддерживаемая конфигурация, вам нужно будет установить k3s_use_unsupported_config в true.

С версии K3s v1.19.1 возможно использовать встроенный Etcd как бэкенд для базы данных, и это делается установкой k3s_etcd_datastore в true. Лучшей практикой для Etcd является определение как минимум трех участников для обеспечения кворума. Кроме того, рекомендуется иметь нечетное количество участников, чтобы гарантировать большинство в случае сетевого разъединения. Если вы хотите использовать 2 участника или четное количество участников, пожалуйста, установите k3s_use_unsupported_config в true.

Важная заметка о k3s_server_manifests_urls и k3s_server_pod_manifests_urls

Чтобы развернуть серверные манифесты и манифесты подов сервера по URL, вам нужно указать url и, при необходимости, filename (если не указано, используется базовое имя). Ниже приведен пример, как развернуть оператора Tigera для Calico и kube-vip.

---

k3s_server_manifests_urls:
  - url: https://docs.projectcalico.org/archive/v3.19/manifests/tigera-operator.yaml
    filename: tigera-operator.yaml

k3s_server_pod_manifests_urls:
  - url: https://raw.githubusercontent.com/kube-vip/kube-vip/main/example/deploy/0.1.4.yaml
    filename: kube-vip.yaml

Важная заметка о k3s_airgap

При развертывании k3s в изолированной среде вы должны предоставить бинарный файл k3s в ./files/. Бинарный файл не будет загружен с GitHub и, следовательно, не будет проверен с использованием предоставленной контрольной суммы sha256, а также не сможет проверить версию, которую вы запускаете. Все риски и обязательства, связанные с этим, принимаются на себя пользователем в данной ситуации.

Зависимости

Нет зависимостей от других ролей.

Примеры Playbook

Пример playbook, один управляющий узел, работающий с testing канала k3s:

- hosts: k3s_nodes
  vars:
    k3s_release_version: testing
  roles:
     - role: xanmanning.k3s

Пример playbook, высокая доступность с базой данных PostgreSQL, работающий с последним стабильным релизом:

- hosts: k3s_nodes
  vars:
    k3s_registration_address: loadbalancer  # Обычно балансировщик нагрузки.
    k3s_server:
      datastore-endpoint: "postgres://postgres:verybadpass@database:5432/postgres?sslmode=disable"
  pre_tasks:
    - name: Установить каждый узел как управляющий узел
      ansible.builtin.set_fact:
        k3s_control_node: true
      when: inventory_hostname in ['node2', 'node3']
  roles:
    - role: xanmanning.k3s

Лицензия

BSD 3-clause

Участники

Вклад от сообщества очень приветствуется, но пожалуйста, прочитайте руководство по вкладу перед тем, как это сделать, это поможет сделать все максимально гладко.

Также, пожалуйста, ознакомьтесь с замечательным списком участников.

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

Xan Manning

О проекте

Ansible role for installing k3s as either a standalone server or HA cluster

Установить
ansible-galaxy install PyratLabs/ansible-role-k3s
Лицензия
bsd-3-clause
Загрузки
998768
Владелец
Deep in the lab...