kubernetes_controller
ansible-role-kubernetes-controller
Эта роль используется в Kubernetes не так сложно с Ansible - Управляющая подсистема. Она устанавливает сервер API Kubernetes, планировщик и менеджер контроллеров. Для получения дополнительной информации об этой роли, пожалуйста, ознакомьтесь с Kubernetes не так сложно с Ansible - Управляющая подсистема.
Версии
Я помечаю каждую версию и стараюсь придерживаться семантического версионирования. Если вы хотите использовать эту роль, я рекомендую проверить последнюю метку. Основная ветка по сути является разработкой, в то время как метки обозначают стабильные выпуски. Метка 23.0.0+1.28.5
означает, что это выпуск 23.0.0
этой роли, и она предназначена для использования с версией Kubernetes 1.28.5
(однако должна работать и с любым релизом K8s 1.27.x). Если сама роль изменится, значение X.Y.Z
до +
увеличится. Если изменится версия Kubernetes, значение X.Y.Z
после +
также увеличится. Это позволяет отмечать исправления ошибок и новые основные версии роли, пока она все еще разрабатывается для конкретного выпуска Kubernetes. Это особенно полезно для основных релизов Kubernetes с нарушающими изменениями.
Требования
Эта роль требует, чтобы вы уже создали некоторые сертификаты для сервера API Kubernetes (см. Kubernetes не так сложно с Ansible - Удостоверяющий центр (CA)). Роль копирует сертификаты из k8s_ctl_ca_conf_directory
(который по умолчанию совпадает с k8s_ca_conf_directory
, используемым ролью githubixx.kubernetes_ca
) на целевой хост. Вам также следует настроить полностью соединённую сеть VPN, например, WireGuard (см. Kubernetes не так сложно с Ansible - WireGuard) и, конечно же, кластер etcd (см. Kubernetes не так сложно с Ansible - кластер etcd). Мощность сети WireGuard VPN не является обязательным требованием, но увеличивает безопасность, так как весь трафик между хостами K8s по умолчанию зашифрован. Но пока все включенные хосты имеют интерфейс, через который они могут общаться друг с другом, это вполне приемлемо.
Поддерживаемые ОС
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 22.04 (Jammy Jellyfish)
Изменения
История изменений:
Смотрите полный CHANGELOG.md
ВАЖНО: Если вы обновляете с версии < 22.0.0+1.27.8
, внимательно прочтите CHANGELOG.md! Версия 22.0.0+1.27.8
имела несколько значительных изменений!
Недавние изменения:
24.0.0+1.29.4
- ОБНОВЛЕНИЕ
- обновлена
k8s_release
до1.29.4
- обновлена
24.0.0+1.29.3
- ОБНОВЛЕНИЕ
- обновлена
k8s_release
до1.29.3
- Molecule: используйте
alvistack
вместоgeneric
Vagrant boxes
- обновлена
23.1.2+1.28.8
- ОБНОВЛЕНИЕ
- обновлена
k8s_release
до1.28.8
- обновлена
23.1.1+1.28.5
- ИСПРАВЛЕНИЕ ОШИБОК
- ClusterRoleBinding
system:kube-apiserver
должен учитывать значениеk8s_apiserver_csr_cn
как имя пользователя - В связи с предыдущим изменением переместите
files/kube-apiserver-to-kubelet_cluster_role.yaml -> templates/rbac/kube-apiserver-to-kubelet_cluster_role.yaml.j2
иfiles/kube-apiserver-to-kubelet_cluster_role_binding.yaml -> templates/rbac/kube-apiserver-to-kubelet_cluster_role_binding.yaml.j2
, так как оба файла стали шаблонами Jinja2.
- ClusterRoleBinding
23.1.0+1.28.5
MOLECULE
- Измените на Ubuntu 22.04 для VM test-assets
- Измените общие названия для сертификатов / измените алгоритм на ecdsa и размер алгоритма
ДРУГИЕ ИЗМЕНЕНИЯ
- Исправьте разрешения для временной директории
- Настройте действия Github из-за изменений Ansible Galaxy
23.0.0+1.28.5
ОБНОВЛЕНИЕ
- Обновлена
k8s_release
до1.28.5
- Обновлена
ЛОМКА
- Расширьте
enable-admission-plugins
вk8s_apiserver_settings
на значения:PodSecurity,Priority,StorageObjectInUseProtection,RuntimeClass,CertificateApproval,CertificateSigning,ClusterTrustBundleAttest,CertificateSubjectRestriction,DefaultIngressClass
. Эти значения включены по умолчанию, если этот флаг не указан (см. Справочник контроллеров приема для получения дополнительной информации).
- Расширьте
MOLECULE
- Измените IP-адреса
Установка
Скачайте напрямую из Github (перейдите в директорию ролей Ansible перед клонированием. Вы можете выяснить путь к роли, используя команду
ansible-config dump | grep DEFAULT_ROLES_PATH
):git clone https://github.com/githubixx/ansible-role-kubernetes-controller.git githubixx.kubernetes_controller
Через команду
ansible-galaxy
и скачайте напрямую из Ansible Galaxy:ansible-galaxy install role githubixx.kubernetes_controller
Создайте файл
requirements.yml
со следующим содержимым (это загрузит роль из Github) и установите его с помощьюansible-galaxy role install -r requirements.yml
(при необходимости изменитеversion
):
---
roles:
- name: githubixx.kubernetes_controller
src: https://github.com/githubixx/ansible-role-kubernetes-controller.git
version: 24.0.1+1.29.4
Переменные роли (по умолчанию)
# Базовая директория для конфигурации Kubernetes и файлов сертификатов для
# всего, что касается управляющей подсистемы. После завершения плейбука
# эта директория содержит различные подкаталоги.
k8s_ctl_conf_dir: "/etc/kubernetes/controller"
# Все файлы сертификатов (связанные с инфраструктурой закрытых ключей), указанные в
# "k8s_ctl_certificates" и "k8s_ctl_etcd_certificates" (см. "vars/main.yml")
# будут храниться здесь. Владельцем этой новой директории будет "root". Группой будет
# группа, указанная в "k8s_run_as_group". Файлы в этой директории
# будут принадлежать "root" и группе, указанной в "k8s_run_as_group". Права
# доступа к файлам будут "0640".
k8s_ctl_pki_dir: "{{ k8s_ctl_conf_dir }}/pki"
# Директория для хранения бинарных файлов Kubernetes (см. переменную "k8s_ctl_binaries"
# в "vars/main.yml"). Владельцем и группой этой новой директории
# будет "root" в обоих случаях. Права доступа к этой директории будут "0755".
#
# ПРИМЕЧАНИЕ: По умолчанию директория "/usr/local/bin" обычно уже существует на каждой
# установке Linux с указанным выше владельцем, группой и правами доступа. Если
# ваши текущие настройки отличаются, рассмотрите возможность использования другой директории. Но убедитесь, что
# новая директория включена в значение вашей переменной "$PATH".
k8s_ctl_bin_dir: "/usr/local/bin"
# Выпуск Kubernetes.
k8s_ctl_release: "1.29.4"
# Интерфейс, на котором служби Kubernetes должны слушать. Поскольку все коммуникации кластера
# должны использовать интерфейс VPN, имя интерфейса обычно "wg0" (WireGuard),"peervpn0" (PeerVPN)
# или "tap0".
#
# Сетевая интерфейс, на котором сервисы управляющей подсистемы Kubernetes должны
# слушать. Это:
#
# - kube-apiserver
# - kube-scheduler
# - kube-controller-manager
#
k8s_interface: "eth0"
# Запуск службы управляющей подсистемы Kubernetes (kube-apiserver, kube-scheduler,
# kube-controller-manager) от имени этого пользователя.
#
# Если вы хотите использовать "secure-port" < 1024 для "kube-apiserver", вам
# скорее всего придется запустить "kube-apiserver" от имени пользователя "root"
# (что не рекомендуется).
#
# Если указанный в "k8s_run_as_user" пользователь не существует, то роль
# его создаст. Только если пользователь уже существует, роль не создаст его,
# но изменит его UID/GID и оболочку, если указано (см. настройки ниже).
# Поэтому убедитесь в том, что UID, GID и оболочка соответствуют существующему пользователю, если вы не хотите,
# чтобы этот пользователь был изменен.
#
# Кроме того, если "k8s_run_as_user" = "root", эта роль вообще не будет трогать пользователя.
k8s_run_as_user: "k8s"
# UID пользователя, указанного в "k8s_run_as_user". Если не указано, будет взят
# следующий доступный UID из "/etc/login.defs" (см. настройку "SYS_UID_MAX" в этом файле).
# k8s_run_as_user_uid: "999"
# Оболочка для пользователя, указанного в "k8s_run_as_user".
# Для повышения безопасности лучше оставить по умолчанию.
k8s_run_as_user_shell: "/bin/false"
# Указывает, будет ли пользователь, указанный в "k8s_run_as_user", системным пользователем (по умолчанию)
# или нет. Если "true", то настройка "k8s_run_as_user_home" будет игнорироваться. В общем
# имеет смысл оставить значение по умолчанию, поскольку не должно быть необходимости входить в систему как
# пользователь, который запускает kube-apiserver, kube-scheduler или kube-controller-manager.
k8s_run_as_user_system: true
# Домашний каталог пользователя, указанного в "k8s_run_as_user". Будет игнорироваться, если
# "k8s_run_as_user_system" установлено в "true". В этом случае никакая домашняя директория не будет
# создана. Обычно не нужно.
# k8s_run_as_user_home: "/home/k8s"
# Запуск демонов Kubernetes (kube-apiserver, kube-scheduler, kube-controller-manager)
# от имени этой группы.
#
# Примечание: Если указанная в "k8s_run_as_group" группа не существует, роль
# её создаст. Только если группа уже существует, роль не создаст её,
# но изменит GID, если указано в "k8s_run_as_group_gid" (см. настройку ниже).
k8s_run_as_group: "k8s"
# GID группы, указанной в "k8s_run_as_group". Если не указано, будет взят
# следующий доступный GID из "/etc/login.defs" (см. настройку "SYS_GID_MAX" в этом файле).
# k8s_run_as_group_gid: "999"
# Указывает, будет ли группа, указанная в "k8s_run_as_group", системной группой (по умолчанию)
# или нет.
k8s_run_as_group_system: true
# По умолчанию все задачи, которые должны взаимодействовать с кластером Kubernetes
# выполняются на локальном хосте (127.0.0.1). Но если у него нет прямого соединения с кластером K8s или
# его следует выполнять в другом месте, эту переменную можно изменить соответственно.
k8s_ctl_delegate_to: "127.0.0.1"
# IP-адрес или имя хоста конечной точки API Kubernetes. Эта переменная
# используется "kube-scheduler" и "kube-controller-manager" для подключения
# к "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_ctl_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_ctl_api_endpoint_port: "6443"
# Обычно "kube-apiserver", "kube-controller-manager" и "kube-scheduler" ведут
# свои журналы в "journald". Но есть исключения, такие как аудиторский журнал. Для таких типов
# журналов эта директория будет использоваться как базовый путь. Владельцем и группой
# этой директории будет тот, кто указан в "k8s_run_as_user" и "k8s_run_as_group",
# поскольку эти услуги работают от этого пользователя и нуждаются в разрешениях для создания файлов
# журналов в этой директории.
k8s_ctl_log_base_dir: "/var/log/kubernetes"
# Права доступа для директории, указанной в "k8s_ctl_log_base_dir"
k8s_ctl_log_base_dir_mode: "0770"
# Порт, к которому компоненты управляющей подсистемы должны подключаться к кластеру etcd
k8s_ctl_etcd_client_port: "2379"
# Интерфейс, на котором прослушивает кластер etcd
k8s_ctl_etcd_interface: "eth0"
# Расположение директории, где хранятся сертификаты Kubernetes.
# Эти сертификаты были сгенерированы ролью "kubernetes_ca", если вы
# не использовали другой метод для их генерации. Эта
# директория находится на контроллере Ansible. Обычно это
# хост, на котором выполняется "ansible-playbook". "k8s_ca_conf_directory" используется
# ролью "kubernetes_ca" для хранения сертификатов. Поэтому
# предполагается, что эта переменная уже установлена.
k8s_ctl_ca_conf_directory: "{{ k8s_ca_conf_directory }}"
# Директория, где хранится "admin.kubeconfig" (файл учетных данных) для пользователя "admin".
# По умолчанию эта директория (и ее файл "kubeconfig") будет
# храниться на хосте, указанном в "k8s_ctl_delegate_to". По умолчанию это
# "127.0.0.1". Поэтому если вы запускаете "ansible-playbook" локально,
# например, директория и файл будут созданы там.
#
# По умолчанию значение этой переменной расширяется до локального $HOME пользователя
# плюс "/k8s/certs". Это означает, что если домашний каталог пользователя равен, например,
# "/home/da_user", то "k8s_admin_conf_dir" будет равен
# "/home/da_user/k8s/certs".
k8s_admin_conf_dir: "{{ '~/k8s/configs' | expanduser }}"
# Права доступа к директории, указанной в "k8s_admin_conf_dir"
k8s_admin_conf_dir_perm: "0700"
# Владелец директории, указанной в "k8s_admin_conf_dir" и для
# "admin.kubeconfig", хранящегося в этой директории.
k8s_admin_conf_owner: "root"
# Группа директории, указанной в "k8s_admin_conf_dir" и для
# "admin.kubeconfig", хранящегося в этой директории.
k8s_admin_conf_group: "root"
# Хост, с которого пользователь "admin" подключается для администрирования кластера K8s.
# Эта настройка записывается в "admin.kubeconfig". Это позволяет использовать
# другой хост/балансировщик нагрузки для сервисов K8s, который может использовать внутренний
# балансировщик нагрузки, в то время как пользователь "admin" подключается к другому хосту/балансировщику,
# который распределяет трафик к "kube-apiserver", например.
#
# Кроме того, в целом те же комментарии, что и для переменной "k8s_ctl_api_endpoint_host",
# применимы.
k8s_admin_api_endpoint_host: "{% set controller_host = groups['k8s_controller'][0] %}{{ hostvars[controller_host]['ansible_' + hostvars[controller_host]['k8s_interface']].ipv4.address }}"
# Аналогично выше для порта.
k8s_admin_api_endpoint_port: "6443"
# Директория для хранения журналов аудита "kube-apiserver" (если включено). Владельцем и
# группой этой директории будет тот, кто указан в "k8s_run_as_user"
# и "k8s_run_as_group".
k8s_apiserver_audit_log_dir: "{{ k8s_ctl_log_base_dir }}/kube-apiserver"
# Директория для хранения конфигурации "kube-apiserver".
k8s_apiserver_conf_dir: "{{ k8s_ctl_conf_dir }}/kube-apiserver"
# Настройки демона "kube-apiserver" (могут быть переопределены или дополнено, определив
# "k8s_apiserver_settings_user")
k8s_apiserver_settings:
"advertise-address": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"bind-address": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"secure-port": "6443"
"enable-admission-plugins": "NodeRestriction,NamespaceLifecycle,LimitRanger,ServiceAccount,TaintNodesByCondition,Priority,DefaultTolerationSeconds,DefaultStorageClass,PersistentVolumeClaimResize,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodSecurity,Priority,StorageObjectInUseProtection,RuntimeClass,CertificateApproval,CertificateSigning,ClusterTrustBundleAttest,CertificateSubjectRestriction,DefaultIngressClass"
"allow-privileged": "true"
"authorization-mode": "Node,RBAC"
"audit-log-maxage": "30"
"audit-log-maxbackup": "3"
"audit-log-maxsize": "100"
"audit-log-path": "{{ k8s_apiserver_audit_log_dir }}/audit.log"
"event-ttl": "1h"
"kubelet-preferred-address-types": "InternalIP,Hostname,ExternalIP" # "--kubelet-preferred-address-types" по умолчанию:
# "Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP"
# Нужно изменить, чтобы "kubectl logs" и "kubectl exec" работали.
"runtime-config": "api/all=true"
"service-cluster-ip-range": "10.32.0.0/16"
"service-node-port-range": "30000-32767"
"client-ca-file": "{{ k8s_ctl_pki_dir }}/ca-k8s-apiserver.pem"
"etcd-cafile": "{{ k8s_ctl_pki_dir }}/ca-etcd.pem"
"etcd-certfile": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver-etcd.pem"
"etcd-keyfile": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver-etcd-key.pem"
"encryption-provider-config": "{{ k8s_apiserver_conf_dir }}/encryption-config.yaml"
"encryption-provider-config-automatic-reload": "true"
"kubelet-certificate-authority": "{{ k8s_ctl_pki_dir }}/ca-k8s-apiserver.pem"
"kubelet-client-certificate": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver.pem"
"kubelet-client-key": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver-key.pem"
"service-account-key-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-controller-manager-sa.pem"
"service-account-signing-key-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-controller-manager-sa-key.pem"
"service-account-issuer": "https://{{ groups.k8s_controller | first }}:6443"
"tls-cert-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver.pem"
"tls-private-key-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver-key.pem"
# Это содержимое "encryption-config.yaml". Используется "kube-apiserver"
# (см. опцию "encryption-provider-config" в "k8s_apiserver_settings").
# "kube-apiserver" будет использовать эту конфигурацию для шифрования данных перед их хранением
# в etcd (шифрование данных в состоянии покоя).
#
# Приведенная ниже конфигурация является приемлемым примером, но может не соответствовать вашим потребностям.
# Поэтому внимательно просмотрите! Например, возможно, вы захотите заменить поставщика "aescbc"
# на другой, такой как "secretbox". Как вы видите, эта конфигурация шифрует только "секреты" в состоянии покоя.
# Но также возможно шифровать и другие ресурсы K8s. ПРИМЕЧАНИЕ: Поставщик "identity" ничего не шифрует! Это означает
# простой текст. В приведенной ниже конфигурации он используется в качестве резервного варианта.
#
# Если вы сохраните значение по умолчанию, указанное ниже, пожалуйста, убедитесь, что переменная
# "k8s_encryption_config_key" указана где-то (например, "group_vars/all.yml" или
# даже лучше используйте "ansible-vault" для хранения таких секретов).
# Это должно быть закодированное в base64 значение. Для создания такого значения в Linux
# выполните следующую команду:
#
# head -c 32 /dev/urandom | base64
#
# Для подробного описания, пожалуйста, посетите:
# https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
#
# Как вращать ключ шифрования или реализовать шифрование в состоянии покоя в
# существующем кластере K8s, пожалуйста, посетите:
# https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#rotating-a-decryption-key
k8s_apiserver_encryption_provider_config: |
---
kind: EncryptionConfiguration
apiVersion: apiserver.config.k8s.io/v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: {{ k8s_encryption_config_key }}
- identity: {}
# Директория для хранения конфигурации менеджера контроллеров.
k8s_controller_manager_conf_dir: "{{ k8s_ctl_conf_dir }}/kube-controller-manager"
# Настройки менеджера контроллеров K8s (могут быть переопределены или дополнены, определив
# "k8s_controller_manager_settings_user")
k8s_controller_manager_settings:
"bind-address": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"secure-port": "10257"
"cluster-cidr": "10.200.0.0/16"
"allocate-node-cidrs": "true"
"cluster-name": "kubernetes"
"authentication-kubeconfig": "{{ k8s_controller_manager_conf_dir }}/kubeconfig"
"authorization-kubeconfig": "{{ k8s_controller_manager_conf_dir }}/kubeconfig"
"kubeconfig": "{{ k8s_controller_manager_conf_dir }}/kubeconfig"
"leader-elect": "true"
"service-cluster-ip-range": "10.32.0.0/16"
"cluster-signing-cert-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver.pem"
"cluster-signing-key-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-apiserver-key.pem"
"root-ca-file": "{{ k8s_ctl_pki_dir }}/ca-k8s-apiserver.pem"
"requestheader-client-ca-file": "{{ k8s_ctl_pki_dir }}/ca-k8s-apiserver.pem"
"service-account-private-key-file": "{{ k8s_ctl_pki_dir }}/cert-k8s-controller-manager-sa-key.pem"
"use-service-account-credentials": "true"
# Директория для хранения конфигурации планировщика.
k8s_scheduler_conf_dir: "{{ k8s_ctl_conf_dir }}/kube-scheduler"
# Настройки kube-scheduler
k8s_scheduler_settings:
"bind-address": "{{ hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address }}"
"config": "{{ k8s_scheduler_conf_dir }}/kube-scheduler.yaml"
"authentication-kubeconfig": "{{ k8s_scheduler_conf_dir }}/kubeconfig"
"authorization-kubeconfig": "{{ k8s_scheduler_conf_dir }}/kubeconfig"
"requestheader-client-ca-file": "{{ k8s_ctl_pki_dir }}/ca-k8s-apiserver.pem"
# Эти параметры безопасности песочницы будут использоваться для
# системных единиц "kube-apiserver", "kube-scheduler" и "kube-controller-manager".
# Эти параметры будут помещены в секцию "[Service]".
# Значения по умолчанию должны быть вполне удовлетворительными для повышения безопасности
# упомянутых услуг. Поэтому имеет смысл сохранять их по возможности.
#
# Для получения дополнительной информации смотрите:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Options
#
# Параметры ниже "RestartSec=5" в основном связаны с безопасностью/песочницей
# и ограничивают воздействие системы на процессы юнита. Вы можете добавлять
# или удалять параметры по мере необходимости. Для получения дополнительной информации смотрите:
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
k8s_ctl_service_options:
- User={{ k8s_run_as_user }}
- Group={{ k8s_run_as_group }}
- Restart=on-failure
- RestartSec=5
- NoNewPrivileges=true
- ProtectHome=true
- PrivateTmp=true
- PrivateUsers=true
- ProtectSystem=full
- ProtectClock=true
- ProtectKernelModules=true
- ProtectKernelTunables=true
- ProtectKernelLogs=true
- ProtectControlGroups=true
- ProtectHostname=true
- ProtectControlGroups=true
- RestrictNamespaces=true
- RestrictRealtime=true
- RestrictSUIDSGID=true
- CapabilityBoundingSet=~CAP_SYS_PTRACE
- CapabilityBoundingSet=~CAP_KILL
- CapabilityBoundingSet=~CAP_MKNOD
- CapabilityBoundingSet=~CAP_SYS_CHROOT
- CapabilityBoundingSet=~CAP_SYS_ADMIN
- CapabilityBoundingSet=~CAP_SETUID
- CapabilityBoundingSet=~CAP_SETGID
- CapabilityBoundingSet=~CAP_SETPCAP
- CapabilityBoundingSet=~CAP_CHOWN
- SystemCallFilter=@system-service
- ReadWritePaths=-/usr/libexec/kubernetes
Настройки kube-apiserver, определенные в k8s_apiserver_settings
, могут быть переопределены, определив переменную k8s_apiserver_settings_user
. Вы также можете добавить дополнительные настройки, используя эту переменную. Например, чтобы переопределить значения по умолчанию для audit-log-maxage
и audit-log-maxbackup
, а также добавить watch-cache
, добавьте следующие настройки в group_vars/k8s.yml
:
k8s_apiserver_settings_user:
"audit-log-maxage": "40"
"audit-log-maxbackup": "4"
"watch-cache": "false"
То же самое верно для kube-controller-manager
, добавляя записи в переменную k8s_controller_manager_settings_user
. Для kube-scheduler
добавьте записи в переменную k8s_scheduler_settings_user
, чтобы переопределить/добавить параметры в словаре k8s_scheduler_settings
.
Пример плейбука
- hosts: k8s_controller
roles:
- githubixx.kubernetes_controller
Тестирование
Эта роль имеет небольшую тестовую настройку, которая создается с помощью Molecule, libvirt (vagrant-libvirt) и QEMU/KVM. Пожалуйста, смотрите мой блог Тестирование ролей Ansible с Molecule, libvirt (vagrant-libvirt) и QEMU/KVM, чтобы узнать, как настроить. Конфигурация тестов находится здесь.
После этого можно выполнить Molecule:
molecule converge
Это создаст несколько виртуальных машин (VM) с поддерживаемой ОС Ubuntu и установит кластер Kubernetes, но без рабочих узлов (то есть без узлов с установленными kube-proxy
и kubelet
). Также включен небольшой этап верификации:
molecule verify
Для очистки выполните:
molecule destroy
Лицензия
GNU GENERAL PUBLIC LICENSE Version 3
Информация об авторе
Installs the Kubernetes API server, scheduler and controller manager.
ansible-galaxy install githubixx/ansible-role-kubernetes-controller