githubixx.traefik_kubernetes

traefik-kubernetes

Ta rola Ansible instaluje router brzegowy Traefik dla Kubernetes jako kontroler dostępu. W tle używa oficjalnej wtyczki Helm. Aktualnie wspierane są procedury takie jak instalacja, aktualizacja oraz usuwanie wdrożenia Traefik.

Domyślne ustawienia są zoptymalizowane dla fizycznego/ lokalnego klastra Kubernetes, gdzie Traefik jest publicznym wejściem do usług Kubernetes. Oczywiście, konfigurację można dostosować, jak z każdą inną wtyczką Helm, ale domyślne ustawienia skonfigurują Traefik w następujący sposób:

  • Instancje Traefik będą wdrażane jako DaemonSet
  • Podsy Traefik używają hostPort
  • Traefik nasłuchuje na porcie 80 na wszystkich interfejsach hosta na przychodzące żądania HTTP
  • Traefik nasłuchuje na porcie 443 na wszystkich interfejsach hosta na przychodzące żądania HTTPS
  • Dashboard Traefik jest włączony i nie jest dostępny publicznie
  • Certyfikaty TLS są dostarczane przez cert-manager (Moja rola Ansible cert-manager-kubernetes może być użyta do zainstalowania cert-managera)

Dalsze informacje na temat ustawień wtyczki Helm można znaleźć poniżej.

Wersje

Każde wydanie jest oznaczane odpowiednią etykietą i staram się przestrzegać semantycznej wersjonowania. Jeśli chcesz używać roli, zalecam sprawdzenie najnowszej etykiety. Gałąź główna jest na ogół w trakcie rozwoju, habang etykiety oznaczają stabilne wydania. Etykieta 5.0.0+23.0.1 oznacza, że jest to wydanie 5.0.0 tej roli i używa wersji Helm chart 23.0.1 (wersja Traefik jest określona w pliku wartości [patrz poniżej]). Jeśli sama rola się zmienia, część X.Y.Z przed + wzrasta. Jeśli wersja wykresu Traefik się zmienia, wtedy X.Y.Z po + także rośnie. To pozwala oznaczać poprawki błędów i nowe majorowe wersje roli, podczas gdy nadal rozwija się ona dla określonego wydania Traefik.

Wymagania

Musisz mieć zainstalowany binarny plik Helm 3 na hoście, gdzie wykonywane są ansible-playbook, lub na hoście, gdzie zlecono uruchomienie skryptów (np. za pomocą zmiennej traefik_delegate_to). Możesz:

  • użyć swojego ulubionego menedżera pakietów, jeśli Twoja dystrybucja zawiera helm w swoim repozytorium (na przykład dla Archlinux użyj sudo pacman -S helm)
  • lub skorzystać z jednej z ról Ansible Helm (np. helm - która również jest instalowana, jeśli używasz `ansible-galaxy role install -vr requirements.yml)
  • lub bezpośrednio pobrać binarny plik z wydań Helm i umieścić go w katalogu /usr/local/bin/

Potrzebna jest również poprawnie skonfigurowana zmienna KUBECONFIG (domyślnie znajduje się w ${HOME}/.kube/config). Normalnie, jeśli kubectl działa z Twoim klastrem, powinno być wszystko w porządku.

Dodatkowo, należy zainstalować kolekcję Ansible kubernetes.core. Można to zrobić za pomocą pliku collections.yml dołączonego w tej roli: ansible-galaxy install -r collections.yml.

I oczywiście potrzebujesz klastra Kubernetes ;-)

Dziennik zmian

Patrz CHANGELOG.md

Zmienne roli

# Wersja wykresu Helm
traefik_chart_version: "23.2.0"

# Nazwa wydania Helm
traefik_release_name: "traefik"

# Nazwa repozytorium Helm
traefik_repo_name: "traefik"

# Nazwa wykresu Helm
traefik_chart_name: "{{ traefik_repo_name }}/{{ traefik_release_name }}"

# URL wykresu Helm
traefik_chart_url: "https://helm.traefik.io/traefik"

# Przestrzeń nazw Kubernetes, w której powinny być zainstalowane zasoby Traefik
traefik_namespace: "traefik"

# Katalog, który zawiera plik wartości wykresu Helm. Jeśli określisz tę
# zmienną, Ansible spróbuje znaleźć plik o nazwie "values.yml.j2" lub
# "values.yaml.j2" w określonym katalogu (".j2" ponieważ możesz
# używać tam standardowych rzeczy szablonów Jinja2). Zawartość tego pliku
# będzie dostarczona do polecenia "helm install/template" jako plik wartości.
# Domyślnie katalog to "$HOME" użytkownika plus
# "/traefik/helm". Jeśli task nie znajdzie takiego pliku, użyje
# wartości w "templates/traefik_values_default.yml.j2" domyślnie.
traefik_chart_values_directory: "{{ '~/traefik/helm' | expanduser }}"

# Domyślnie CRD (CustomResourceDefinitions) nie są instalowane. Ustaw na
# "true", jeśli CRD powinny być zainstalowane. Zobacz także:
# https://github.com/traefik/traefik-helm-chart/tree/master/traefik/crds
# Zainstalowane będą następujące CRD:
#   - ingressroutes.traefik.containo.us
#   - ingressroutes.traefik.io
#   - ingressroutetcps.traefik.containo.us
#   - ingressroutetcps.traefik.io
#   - ingressrouteudps.traefik.containo.us
#   - ingressrouteudps.traefik.io
#   - middlewares.traefik.containo.us
#   - middlewares.traefik.io
#   - middlewaretcps.traefik.containo.us
#   - middlewaretcps.traefik.io
#   - serverstransports.traefik.containo.us
#   - serverstransports.traefik.io
#   - tlsoptions.traefik.containo.us
#   - tlsoptions.traefik.io
#   - tlsstores.traefik.containo.us
#   - tlsstores.traefik.io
#   - traefikservices.traefik.containo.us
#   - traefikservices.traefik.io
traefik_install_crds: false

# Domyślnie wszystkie zadania, które muszą komunikować się z klastrem Kubernetes
# są wykonywane na lokalnym hoście (127.0.0.1). Jeśli ten host
# nie ma bezpośredniego dostępu do tego klastra lub zadania powinny być
# wykonywane gdzie indziej, zmienna ta może zostać odpowiednio zmieniona.
traefik_delegate_to: 127.0.0.1

# Wyświetla polecenie "helm", które zostało wykonane, jeśli zadanie używa Helm do
# instalacji, aktualizacji/upgrade lub usuwania zasobu.
traefik_helm_show_commands: false

# Bez zdefiniowanej zmiennej "action" ta rola renderuje tylko plik
# z wszystkimi zasobami, które zostaną zainstalowane lub zaktualizowane. Renderowany
# plik z zasobami będzie nazywał się "template.yml" i będzie umieszczony w
# katalogu określonym poniżej.
traefik_template_output_directory: "{{ '~/traefik/template' | expanduser }}"

Użycie

Pierwszą rzeczą, którą należy zrobić, to sprawdzić templates/traefik_values_default.yml.j2. Ten plik zawiera wartości/ustawienia dla wykresu Helm Traefik, które różnią się od domyślnych, które znajdują się tutaj. Oto domyślne ustawienia:

# Wszystkie możliwe wartości wykresu Helm można znaleźć pod adresem:
# https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml

image:
  repository: traefik
  tag: "2.11.2"
  pullPolicy: IfNotPresent

# Te argumenty są przekazywane do binarnego pliku Traefik. Wszelkie opcje znajdziesz
# tutaj: https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Pierwszy ustawiania poziom logowania.
#
# Drugi ustawia wartość adnotacji "kubernetes.io/ingress.class"
# do obserwowania. Jeśli obiekt "Ingress" Kubernetes "standard"
# zostanie przesłany do serwera API Kubernetes (zamiast własnej implementacji Traefik
# zwanej "IngressRoute"), Traefik obsłuży te żądania
# i skieruje je odpowiednio.
additionalArguments:
  - "--log.level=INFO"
  - "--providers.kubernetesingress.ingressclass=traefik"

# Globalne argumenty przekazywane do binarnego pliku Traefik.
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Pierwszy wyłącza okresowe sprawdzanie, czy wydano nową wersję.
#
# Drugi wyłącza anonimowe statystyki użycia.
globalArguments:
  - "--global.checknewversion=false"
  - "--global.sendanonymoususage=false"

# To tworzy wdrożenie Traefik. Ponieważ "DaemonSet" jest określony tutaj,
# stworzy to instancję Traefik na wszystkich węzłach roboczych Kubernetes. Jeśli
# tylko podzbiór węzłów powinien być użyty, określić "affinity", "nodeSelector"
# lub "toleration's" odpowiednio. Zobacz link do wartości wykresu Helm powyżej.
deployment:
  enabled: true
  kind: DaemonSet
  dnsPolicy: ClusterFirstWithHostNet

# Instrukcje dla Traefik, aby nasłuchiwał na różnych portach.
ports:
  # Nazwa tego portu nie może być zmieniona, ponieważ jest używana do sprawdzania
  # gotowości i aktywności, ale możesz dostosować jej konfigurację do swoich upodobań.
  # Aby uzyskać dostęp do dashboardu, możesz użyć "kubectl port-forward" np.:
  # kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
  # Otwierając http://localhost:9000/dashboard/ powinieneś zobaczyć dashboard.
  traefik:
    port: 9000
    expose: false
    protocol: TCP
  # Niezabezpieczony przychodzący ruch HTTP. Jeśli odkomentujesz "redirectTo: websecure",
  # cały ruch, który dociera na ten port, zostanie przekierowany do punktu wejścia "websecure",
  # co oznacza punkt wejścia obsługujący zabezpieczony ruch HTTPS.
  # Ale bądź świadomy, że może to być problematyczne dla cert-managera.
  # Także używany jest "hostPort". Ponieważ "DaemonSet" został określony powyżej,
  # oznacza to, że podsy Traefik będą odpowiadać na żądania na portach 80 i 443
  # na wszystkich węzłach roboczych Kubernetes. Jeśli hosty mają publiczny adres IP, a porty 80/443
  # nie są chronione przez zaporę, Traefik jest dostępny dla żądań z Internetu
  # (co normalnie chcesz w przypadku Traefik ;-) ). Dla innych
  # opcji zobacz link powyżej. Te ustawienia są użyteczne dla rozwiązań fizycznych lub
  # lokalnych bez dodatkowego loadbalancera.
  web:
    port: 30080
    hostPort: 80
    expose: true
    protocol: TCP
    # redirectTo: websecure
  # Punkt wejścia dla ruchu HTTPS.
  websecure:
    port: 30443
    hostPort: 443
    expose: true
    protocol: TCP

# Te ustawienia zabezpieczeń są zasadniczo najlepszymi praktykami mającymi na celu ograniczenie
# powierzchni ataku tak bardzo, jak to możliwe.
# Powierzchnię ataku można dodatkowo ograniczyć przy użyciu "seccomp", który jest stabilny od
# wersji Kubernetes v1.19 i pozwala ograniczyć wywołania systemowe do minimum. Zobacz:
# https://kubernetes.io/docs/tutorials/clusters/seccomp/
securityContext:
  capabilities:
    drop:
      - ALL
  readOnlyRootFilesystem: true
  runAsGroup: 65532
  runAsNonRoot: true
  runAsUser: 65532

# Wszystkie procesy kontenera są również częścią tego dodatkowego identyfikatora grupy.
podSecurityContext:
  fsGroup: 65532

# Ustaw poziom logowania ogólnego i włącz log dostępów.
logs:
  general:
    level: INFO
  access:
    enabled: true

# Ponieważ porty Traefik web/websecure są dostępne przez "hostPort", usługa nie jest
# potrzebna.
service:
  enabled: false

# Ograniczenia zasobowe CPU i RAM. Te ustawienia powinny również być ustawione na
# rozsądne wartości w przypadku wycieku pamięci.
resources:
  requests:
    cpu: "100m"
    memory: "50Mi"
  limits:
    cpu: "300m"
    memory: "150Mi"

# Aktualizuje podsy w DaemonSet jeden po drugim, kiedy DaemonSet został zaktualizowany
updateStrategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1

Jednak nic nie jest na stałe ;-) Aby użyć własnych wartości, wystarczy utworzyć plik o nazwie values.yml.j2 lub values.yaml.j2 i umieścić go w katalogu określonym w traefik_chart_values_directory (domyślnie jest to $HOME/traefik/helm). Następnie ta rola będzie używać tego pliku do renderowania wartości Helm. Możesz użyć templates/traefik_values_default.yml.j2 jako szablonu lub po prostu zacząć od zera. Jak wspomniano wcześniej, możesz zmieniać wszystkie ustawienia dla wykresu Helm, które różnią się od domyślnych, które znajdują się tutaj.

Po umieszczeniu pliku wartości i sprawdzeniu wartości w defaults/main.yml, rola może być zainstalowana. Większość zadań roli jest wykonywana lokalnie, ponieważ wiele zadań potrzebuje komunikować się z serwerem API Kubernetes lub wykonywać polecenia Helm.

Domyślną akcją jest po prostu renderowanie pliku YAML z zasobami Kubernetes po zastąpieniu wszystkich zmiennych Jinja2 i tym podobnych. W sekcji Przykładowy Playbook poniżej znajduje się Przykład 2 (przypisanie etykiety do roli). Rola githubixx.traefik-kubernetes ma przypisaną etykietę role-traefik-kubernetes. Zakładając, że wartości dla wykresu Helm powinny być renderowane (nic nie zostanie zainstalowane w tym przypadku) i playbook jest nazywany k8s.yml, wykonaj następujące polecenie:

ansible-playbook --tags=role-traefik-kubernetes k8s.yml

Aby renderować szablon do innego katalogu, użyj zmiennej traefik_template_output_directory, np.:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars traefik_template_output_directory="/tmp/traefik" k8s.yml

Jeśli chcesz zobaczyć polecenia helm i parametry, które zostały wykonane w logach, możesz również określić --extra-vars traefik_helm_show_commands=true.

Jedno z ostatnich zadań nosi nazwę TASK [githubixx.traefik_kubernetes : Write templates to file]. To renderuje szablon z zasobami, które zostaną utworzone, w katalogu określonym w traefik_template_output_directory. Plik będzie nazywał się template.yml. Katalog/plik zostanie umieszczony na Twoim lokalnym komputerze, aby można było go sprawdzić.

Jeśli renderowany szablon zawiera wszystko, czego potrzebujesz, rolę można zainstalować, a to ostatecznie wdroży Traefik:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml

Aby sprawdzić, czy wszystko zostało wdrożone, użyj standardowych poleceń kubectl, takich jak kubectl -n <traefik_namespace> get pods -o wide.

Ponieważ Traefik wydaje aktualizacje co kilka tygodni/miesięcy, rola także może przeprowadzać aktualizacje. Ta metoda może być także użyta do zmiany istniejących wartości bez aktualizacji wersji Traefik, np. Zobacz także Wydania Traefik przed aktualizacją Traefik. Zmiany w wykresie Helm można znaleźć w historii commitów.

Aby zaktualizować Traefik/wykres Helm, wystarczy zmienić zmienną traefik_chart_version, np. z 10.21.1 na 10.24.2. Możesz także potrzebować zmienić wartość image.tag w templates/traefik_values_default.yml.j2. Jeśli tylko parametry powinny być zmienione, zaktualizuj wartości odpowiednio.

Aby przeprowadzić aktualizację Traefik lub wdrożyć nowe wartości, uruchom

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=upgrade k8s.yml

Na koniec, jeśli chcesz pozbyć się Traefik, możesz usunąć wszystkie zasoby:

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=delete k8s.yml

Przykładowy Playbook

Przykład 1 (bez etykiety roli):

- hosts: traefik
  roles:
    - githubixx.traefik_kubernetes

Przykład 2 (przypisanie etykiety do roli):

-
  hosts: traefik
  roles:
    -
      role: githubixx.traefik-kubernetes
      tags: role-traefik-kubernetes

Host traefik w przykładowym playbooku to zazwyczaj po prostu localhost, określony w pliku hosts Ansible lub jakikolwiek inny host, który chcesz używać jako "wykonawca". Upewnij się tylko, że na tym hoście zainstalowany jest helm i ma ważny kubeconfig (co zwykle jest prawdą, jeśli polecenie kubectl działa z klastrem Kubernetes).

Testowanie

Ta rola ma mały zestaw testowy, który jest tworzony przy użyciu Molecule, libvirt (vagrant-libvirt) i QEMU/KVM. Proszę zobaczyć mój post na blogu Testowanie ról Ansible z Molecule, libvirt (vagrant-libvirt) i QEMU/KVM, jak skonfigurować. Konfiguracja testowa jest tutaj.

Następnie można wykonać molekuł. Molecule ustawi kilka maszyn wirtualnych z kompletnym klastrem Kubernetes, co umożliwi testowanie wszystkich funkcjonalności Traefik.

Następujące polecenie wykona podstawową konfigurację i utworzy szablon zasobów (domyślna akcja, patrz powyżej), które zostaną utworzone:

molecule converge

Instalowanie Traefik i wymaganych zasobów:

molecule converge -- --extra-vars action=install

Aktualizacja Traefik lub zmiana parametrów:

molecule converge -- --extra-vars action=upgrade

Usuwanie Traefik i jego zasobów:

molecule converge -- --extra-vars action=delete

Aby uruchomić kilka testów, użyj

molecule verify

Aby wyczyścić, uruchom

molecule destroy

Licencja

GNU GENERAL PUBLIC LICENSE Wersja 3

Informacje o autorze

http://www.tauceti.blog

O projekcie

Ansible role to install Traefik ingress controller in a Kubernetes cluster

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