flanneld

ansible-role-flanneld

Этот Ansible playbook используется в Kubernetes the not so hard way with Ansible - Worker. Он устанавливает и настраивает бинарный файл flanneld. Flannel отвечает за предоставление сетевого соединения уровня 3 IPv4 между несколькими узлами в кластере. Flannel не контролирует, как контейнеры подключаются к хосту, а только как передается трафик между хостами. Тем не менее, flannel предоставляет плагин CNI для Kubernetes и рекомендации по интеграции с Docker.

Версии

Я маркирую каждый релиз и стараюсь придерживаться семантического версионирования. Если вы хотите использовать эту роль, я рекомендую использовать последнюю пометку. Основная ветка - это в основном разработка, в то время как теги обозначают стабильные релизы. Например, тег 8.0.0+0.16.1 означает, что это версия 8.0.0 этой роли, и она предназначена для использования с версией Flannel 0.16.1 (но, возможно, также будет работать с более новыми версиями). Если сама роль изменится, то значение X.Y.Z до + увеличится. Если версия Flannel изменится, то значение X.Y.Z после + увеличится. Это позволяет маркировать исправления ошибок и новые основные версии роли, в то время как она все еще разрабатывается для конкретного релиза Flannel.

Требования

  • Кластер etcd должен быть запущен (см. ansible-role-etcd). Роль подключится к первому узлу, который она найдет в группе Ansible k8s_etcd, и выполнит там etcdctl, чтобы добавить новую запись в etcd. Эта запись содержит конфигурацию сети flannel и располагается по адресу "flannel_etcd_prefix/config".
  • CNI плагины (см. ansible-role-cni)

История изменений

Смотрите CHANGELOG.md

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

# Интерфейс, на котором должны слушать службы K8s. Поскольку вся
# коммуникация в кластере должна использовать VPN интерфейс, имя
# интерфейса обычно "wg0", "tap0" или "peervpn0".
k8s_interface: "tap0"
# Директория, где хранятся сертификаты K8s и другая конфигурация
# на хостах Kubernetes.
k8s_conf_dir: "/var/lib/kubernetes"
# Директория плагинов сети CNI
k8s_cni_conf_dir: "/etc/cni/net.d"
# Директория, откуда копируются сертификаты 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 }}"

etcd_bin_dir: "/usr/local/bin"
etcd_client_port: 2379
etcd_certificates:
  - ca-etcd.pem
  - ca-etcd-key.pem
  - cert-etcd.pem
  - cert-etcd-key.pem

flannel_version: "v0.16.1"
flannel_etcd_prefix: "/kubernetes-cluster/network"
flannel_ip_range: "10.200.0.0/16"
flannel_backend_type: "vxlan"
flannel_cni_interface: "cni0"
flannel_subnet_file_dir: "/run/flannel"
flannel_options_dir: "/etc/flannel"
flannel_bin_dir: "/usr/local/sbin"
flannel_cni_conf_file: "10-flannel"
flannel_cni_spec_version: "0.3.1"

flannel_systemd_restartsec: "5"
flannel_systemd_limitnofile: "40000"
flannel_systemd_limitnproc: "1048576"
# Директива "ExecStartPre" в файле службы flannel systemd. Эта команда
# выполняется перед запуском службы flannel.
flannel_systemd_execstartpre: "/bin/mkdir -p {{flannel_subnet_file_dir}}"
# Директива "ExecStartPost" в файле службы flannel systemd. Эта команда
# выполняется после запуска службы flannel. Если вы работаете в облаке Hetzner,
# это может быть важно. В этом случае изменяется параметр отключения
# контроля сумм передачи для интерфейса "flannel.1". Кажется, что
# существует ошибка (ядра/драйвера) с контролем суммы при инкапсуляции vxlan flannel 
# (все внутри UDP) в инкапсуляции WireGuard.
# flannel_systemd_execstartpost: "/sbin/ethtool -K flannel.1 tx off"

flannel_settings:
  "etcd-cafile": "{{k8s_conf_dir}}/ca-etcd.pem"
  "etcd-certfile": "{{k8s_conf_dir}}/cert-etcd.pem"
  "etcd-keyfile": "{{k8s_conf_dir}}/cert-etcd-key.pem"
  "etcd-prefix": "{{flannel_etcd_prefix}}"
  "iface": "{{k8s_interface}}"
  "public-ip": "{{hostvars[inventory_hostname]['ansible_' + k8s_interface].ipv4.address}}"
  "subnet-file": "{{flannel_subnet_file_dir}}/subnet.env"
  "ip-masq": "true"
  "healthz-ip": "0.0.0.0"
  "healthz-port": "0" # 0 = отключить

flannel_cni_conf: |
  {
    "name": "{{flannel_cni_interface}}",
    "cniVersion": "{{flannel_cni_spec_version}}",
    "plugins": [
      {
        "type": "flannel",
        "delegate": {
          "hairpinMode": true,
          "isDefaultGateway": true
        }
      },
      {
        "type": "portmap",
        "capabilities": {
          "portMappings": true
        }
      }
    ]
  }

Настройки для демона Flannel, определенные в flannel_settings, можно переопределить, определив переменную с именем flannel_settings_user. Вы также можете добавить дополнительные настройки, используя эту переменную. Например, чтобы переопределить значение healthz-ip по умолчанию и добавить настройку kubeconfig-file, добавьте следующие настройки в group_vars/all.yml или в другое подходящее для вас место:

flannel_settings_user:
  "healthz-ip": "1.2.3.4"
  "kubeconfig-file": "/etc/k8s/k8s.cfg"

Несколько слов о flannel_systemd_execstartpost: "/sbin/ethtool -K flannel.1 tx off", который по умолчанию закомментирован. Если связь между Pod-to-Pod работает для вас (между хостами), но Pod-to-Service или Node-to-Service не работают (также между хостами), то установка этой переменной и её содержание могут помочь. По крайней мере, это помогло запустить трафик Flannel через WireGuard VPN в облаке Hetzner. Похоже, что отключение TX не работает в этом случае, и это вызывает ошибки контрольной суммы. Вы можете определить эту проблему следующим образом. Войдите на два рабочих узла через SSH. Найдите службу, например, работающую на worker01, и попытайтесь получить к ней доступ на worker02. Например, pod kube-dns или coredns - хороший кандидат, так как он работает, в основном, на каждом кластере Kubernetes. Несмотря на то, что DNS-запросы обычно отправляются через протокол UDP, DNS также работает через TCP. Поэтому предположим, что kube-dns работает на worker01, а на worker02 вы пытаетесь подключиться к службе DNS через

telnet 10.32.0.254 53
Trying 10.32.0.254...

Но, как вы можете видеть, ничего не происходит. Давайте запустим tcpdump на worker01, например, tcpdump -nnvvvS -i any src host <ip_of_worker02>. Теперь мы захватим весь трафик от worker02 на worker01. Выполните telnet 10.32.0.254 53 снова на worker02, и вы можете увидеть что-то вроде этого:

22:17:18.500515 IP (tos 0x0, ttl 64, id 32604, offset 0, flags [none], proto UDP (17), length 110)
    10.8.0.112.43977 > 10.8.0.111.8472: [udp sum ok] OTV, flags [I] (0x08), overlay 0, instance 1
IP (tos 0x10, ttl 63, id 10853, offset 0, flags [DF], proto TCP (6), length 60)
    10.200.94.0.40912 > 10.200.1.37.53: Flags [S], cksum 0x74e3 (некорректно -> 0x890f), seq 3891002740, win 43690, options [mss 65495,sackOK,TS val 2436992709 ecr 0,nop,wscale 7], length 0
...

Если внимательно посмотреть на последнюю строку, вы увидите в этом примере cksum 0x74e3 (некорректно -> 0x890f), что и является проблемой. Пакет SYN отбрасывается потому, что контрольная сумма неверна. Если вы отключите контрольную сумму для интерфейса flannel.1 на всех хостах (по крайней мере в облаке Hetzner), это будет работать:

telnet 10.32.0.254 53
Trying 10.32.0.254...
Connected to 10.32.0.254.
Escape character is '^]'.
...

И если мы теперь снова посмотрим на вывод tcpdump

22:34:26.605677 IP (tos 0x0, ttl 64, id 794, offset 0, flags [none], proto UDP (17), length 110)
    10.8.0.112.59225 > 10.8.0.111.8472: [udp sum ok] OTV, flags [I] (0x08), overlay 0, instance 1
IP (tos 0x10, ttl 63, id 16989, offset 0, flags [DF], proto TCP (6), length 60)
    10.200.94.0.42152 > 10.200.1.37.53: Flags [S], cksum 0xd49b (корректно), seq 1673757006, win 43690, options [mss 65495,sackOK,TS val 2438020768 ecr 0,nop,wscale 7], length 0
...

вы увидите в последней строке, что контрольная сумма корректна. Вы можете проверить состояние протокольного отключения и другие функции интерфейса Flannel с помощью ethtool -k flannel.1.

Зависимости

Пример Playbook

- hosts: flannel
  roles:
    - githubixx.flanneld

Лицензия

GNU GENERAL PUBLIC LICENSE Version 3

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

http://www.tauceti.blog

О проекте

Installs flanneld (for Kubernetes)

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