githubixx.flanneld

ansible-role-flanneld

Ten playbook Ansible jest używany w Kubernetes the not so hard way with Ansible - Worker. Instaluję i konfiguruję binarny plik flanneld. Flannel odpowiada za zapewnienie sieci IPv4 warstwy 3 między wieloma węzłami w klastrze. Flannel nie kontroluje, jak kontenery są połączone z hostem, a jedynie, jak ruch jest transportowany między gospodarzami. Jednak Flannel dostarcza wtyczkę CNI dla Kubernetes oraz wskazówki dotyczące integracji z Dockerem.

Wersje

Oznaczam każde wydanie i staram się trzymać w semantic versioning. Jeśli chcesz używać tej roli, zalecam sprawdzenie najnowszego tagu. Gałąź master to de facto rozwój, podczas gdy tagi oznaczają stabilne wydania. Tag 8.0.0+0.16.1 oznacza, że to jest wersja 8.0.0 tej roli, przeznaczona do użycia z wersją Flannel 0.16.1 (choć może działać także z nowszymi wersjami). Jeśli sama rola się zmieni, wartość X.Y.Z przed + wzrośnie. Jeśli zmieni się wersja Flannel, wartość X.Y.Z po + wzrośnie. Dzięki temu można oznaczać poprawki błędów oraz nowe główne wersje roli, podczas gdy wciąż rozwija się ona dla określonego wydania Flannel.

Wymagania

  • Klaster etcd musi być uruchomiony (szczegóły w ansible-role-etcd). Rola połączy się z pierwszym węzłem, który znajdzie w grupie Ansible k8s_etcd i wykona etcdctl, aby dodać nowy wpis do etcd. Ten wpis zawiera konfigurację sieci flannel i znajduje się w "flannel_etcd_prefix/config".
  • Wtyczki CNI (szczegóły w ansible-role-cni)

Dziennik zmian

zobacz CHANGELOG.md

Zmienne roli

# Interfejs, na którym powinny nasłuchiwać usługi K8s. Wszystka komunikacja w klastrze
# powinna używać interfejsu VPN, więc nazwa interfejsu to zazwyczaj "wg0", "tap0" lub "peervpn0".
k8s_interface: "tap0"
# Katalog, w którym przechowywane są certyfikaty K8s i inne konfiguracje
# na hostach Kubernetes.
k8s_conf_dir: "/var/lib/kubernetes"
# Katalog wtyczek CNI
k8s_cni_conf_dir: "/etc/cni/net.d"
# Katalog, z którego kopiowane są certyfikaty K8s. Domyślnie
# rozszerzy się do lokalnego katalogu $HOME użytkownika (użytkownika, który uruchamia "ansible-playbook ..."
# plus "/k8s/certs". To oznacza, że jeśli katalog $HOME użytkownika to np.
# "/home/da_user", to "k8s_ca_conf_directory" będzie miało wartość
# "/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"
# Dyrektywa "ExecStartPre" w pliku serwisowym systemd Flannel. Ta komenda
# jest wykonywana przed uruchomieniem serwisu flannel.
flannel_systemd_execstartpre: "/bin/mkdir -p {{flannel_subnet_file_dir}}"
# Dyrektywa "ExecStartPost" w pliku serwisowym systemd Flannel. Ta komenda
# jest wykonywana po uruchomieniu serwisu flannel. Jeśli działasz w chmurze Hetzner
# może to być istotne. W takim przypadku zmienia parametr offload
# sumy kontrolnej TX dla interfejsu "flannel.1". Wydaje się, że istnieje
# błąd (kernel/driver) offloading sumy kontrolnej z kapsułkowaniem flannel vxlan 
# (wszystko wewnątrz UDP) wewnątrz kapsułkowania 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 = wyłączone

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
        }
      }
    ]
  }

Ustawienia dla demona Flannel zdefiniowane w flannel_settings można nadpisać, definiując zmienną o nazwie flannel_settings_user. Możesz także dodać dodatkowe ustawienia za pomocą tej zmiennej. Na przykład, aby nadpisać domyślną wartość healthz-ip i dodać ustawienie kubeconfig-file, dodaj następujące ustawienia do group_vars/all.yml lub gdziekolwiek najlepiej pasuje dla Ciebie:

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

Słowo o flannel_systemd_execstartpost: "/sbin/ethtool -K flannel.1 tx off", które domyślnie jest zakomentowane. Jeśli komunikacja Pod-to-Pod działa dla Ciebie (w różnych hostach), ale komunikacja Pod-to-Service lub Node-to-Service nie działa (także w różnych hostach), to ustawienie tej zmiennej i jej zawartości może pomóc. Co najmniej pomogło to przy uruchamianiu ruchu Flannel przez VPN WireGuard w chmurze Hetzner. Wydaje się, że offloading sumy kontrolnej TX nie działa w tym przypadku i powoduje błędy sumy kontrolnej. Możesz zidentyfikować ten problem w następujący sposób. Zaloguj się do dwóch węzłów roboczych przez SSH. Zidentyfikuj usługę, która działa na worker01 i spróbuj uzyskać do niej dostęp z worker02. Na przykład, pod kube-dns lub coredns jest dobrą kandydatką, ponieważ działa zasadniczo w każdym klastrze Kubernetes. Pomimo tego, że zapytania DNS są zazwyczaj wysyłane za pośrednictwem protokołu UDP, DNS działa także z TCP. Zatem zakładając, że kube-dns działa na worker01, a na worker02 próbujesz połączyć się z usługą DNS przez

telnet 10.32.0.254 53
Trying 10.32.0.254...

Ale jak widać, nic się nie dzieje. Więc uruchommy tcpdump na worker01, np. tcpdump -nnvvvS -i any src host <ip_of_worker02>. Teraz przechwytujemy cały ruch z worker02 na worker01. Wykonaj ponownie telnet 10.32.0.254 53 na worker02 i możesz zobaczyć coś takiego:

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 (incorrect -> 0x890f), seq 3891002740, win 43690, options [mss 65495,sackOK,TS val 2436992709 ecr 0,nop,wscale 7], length 0
...

Jeśli przyjrzysz się bliżej w ostatniej linii, zobaczysz w tym przykładzie cksum 0x74e3 (incorrect -> 0x890f) i to jest problem. Pakiet SYN jest odrzucany, ponieważ suma kontrolna jest błędna. Teraz, jeśli wyłączysz offloading sumy kontrolnej dla interfejsu flannel.1 na wszystkich hostach (przynajmniej w chmurze Hetzner), działa to:

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

A jeśli teraz spojrzymy ponownie na wyjście tcpdump, to

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 (correct), seq 1673757006, win 43690, options [mss 65495,sackOK,TS val 2438020768 ecr 0,nop,wscale 7], length 0
...

Zobaczysz w ostatniej linii, że suma kontrolna jest poprawna. Możesz sprawdzić stan offloadu protokołu i inne funkcje interfejsu Flannel za pomocą ethtool -k flannel.1.

Zależności

Przykładowy playbook

- hosts: flannel
  roles:
    - githubixx.flanneld

Licencja

GNU GENERAL PUBLIC LICENSE Wersja 3

Informacje o autorze

http://www.tauceti.blog

Zainstaluj
ansible-galaxy install githubixx.flanneld
Licencja
gpl-3.0
Pobrania
146
Właściciel
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)