Zurück zum Hub

cargo.ayedo.cloud/ayedo/linux/k8s-1.27

Registry-Block

polycrate block pull cargo.ayedo.cloud/ayedo/linux/k8s-1.27:0.3.14

Kubernetes Block

Installiert Kubernetes k3s auf einen oder mehreren Hosts.

Dieser Block kann mit block.config.k3s.version aktualisiert werden.

Versionshistorie: CHANGELOG.poly.

k3s binary source

Default (k3s.binary.source: github) laedt die Binary von GitHub anhand von k3s.version (inkl. GitHub-sha256sum). OS-Packages gehoeren in den Hardening-Block. System-Images (pause, CoreDNS, …) kommen weiter ueber k3s.private_registries (interne/Proxy-Registry).

url und file sind absolut bzw. relativ zu block.artifacts.path (artifacts/blocks/<block.name>/…). Der Block setzt k3s.version nicht in den Pfad ein.

checksum ist optional (sha256:<hex> oder eine Checksum-URL). Leer + github = bisherige GitHub-Checksum-URL. Leer + url/file = keine Pruefung.

k3s:
  version: v1.37.1+k3s1
  binary:
    source: github          # github | url | file
    url: ""                 # source=url: https://mirror.example/k3s
    file: ""                # source=file: k3s  (→ artifacts/blocks/k8s/k3s)
    checksum: ""
# Interne HTTP/FTP-URL, Dateiname liegt beim Kunden
k3s:
  binary:
    source: url
    url: https://repo.internal.example/binaries/k3s
# Datei auf dem Controller unter artifacts/blocks/k8s/
k3s:
  binary:
    source: file
    file: k3s

Actions

restart-k3s

Startet den k3s service neu. Schritte:

Von controlplane X-1 (rückwärts) und dann con worker X-1 (rückwärts)

  1. Cordon
  2. Drain
  3. Restart k3s
  4. Uncordon

show-ips

Zeigt welche IP-Adressen für die Konfiguration der Worker und Controlplanes ermittelt wurden.

hosts

Zeigt eine Übersicht der Verfügbaren Hosts und Gruppen aus einer zuvor erstellten Ansible-Inventory an. Die Action führt folgenden Befehl aus ansible-inventory --graph

@all:
  |--@ungrouped:
  |--@ayedo-demo:
  |  |--ayedo-demo-master-1
  |  |--ayedo-demo-master-2
  |  |--ayedo-demo-master-3
  |  |--ayedo-demo-worker-1
  |  |--ayedo-demo-worker-2
  |  |--ayedo-demo-worker-3
  |--@k8s_controlplane:
  |  |--ayedo-demo-master-1
  |  |--ayedo-demo-master-2
  |  |--ayedo-demo-master-3
  |--@k8s_worker:
  |  |--ayedo-demo-worker-1
  |  |--ayedo-demo-worker-2
  |  |--ayedo-demo-worker-3

install

Mit config.ansible_host_groups.worker und config.ansible_host_groups.controlplane wird angegeben, welche Host-Gruppen aus der Inventory für die Kubernetes installation verwendet werden sollen.


Wurden die Server mit dem Block ayedo/hetzner/vpc erstellt, muss inventory.from: mit dem entsprechenden Block namen angegeben werden (Bspw. vpc). Im ayedo/hetzner/vpc Block sollten für die einzelnen Hosts entsprechende Labels gesetzt werden. Bspw key: k8s mit value: controlplane und key: k8s mit value: worker. Die Labels/Hosts werden als Ansible-Host-Gruppen in die Inventory geschrieben und als k8s_controlplane und k8s_worker dargestellt

  |--@k8s_controlplane:
  |  |--ayedo-demo-master-1
  |  |--ayedo-demo-master-2
  |  |--ayedo-demo-master-3
  |--@k8s_worker:
  |  |--ayedo-demo-worker-1
  |  |--ayedo-demo-worker-2
  |  |--ayedo-demo-worker-3

Der Wert bei config.k3s.token muss mindestend 10 Zeichen lang sein.


Soll anstelle des "Kubernetes cloud controler manager" (ccm) ein externer ccm verwendet werden (Bspw. cargo.ayedo.cloud/ayedo/hetzner/ccm), muss der wert config.external_cloud_provider auf true gesetzt werden. Ein nachträgliches deaktivieren des "Kubernetes cloud controler manager" ist nicht möglich, hierzu muss das Cluster neu aufgesetzt werden.


Soll anstelle des "flannel CNI" (Container Network Interface) ein alternativer CNI verwendet werden (Bspw. cargo.ayedo.cloud/ayedo/k8s/ccciliumm), muss der wert config.flannel.disabled auf true gesetzt werden. Ein nachträgliches deaktivieren des flannel CNI ist nicht möglich, hierzu muss das Cluster neu aufgesetzt werden.


Bei Single-Node installationen, muss der Wert config.k3s.controlplane.taint.disabled auf true gesetzt werden. Ansonsten werden keine Workloads auf der Controlplane zugelassen. Der Wert config.ansible_host_groups.worker wird bei Single-Node installationen nicht gesetzt.


k8s multi-node cluster mit integriertem Kubernetes ccm, OIDC und private-registries

block:
  - name: k8s
    from: cargo.ayedo.cloud/ayedo/linux/k8s
    inventory:
      from: baremetal
    config:
      cluster_name: my-cluster
      cluster_ip_detection:
        enabled: true
      init:
        restart_nodes: true # nach erster installation auf false setzen.
      oidc:
        enabled: true
        issuer_url: "https://id.example.com/application/o/k8s/" 
        client_id: "k8s-production"
      k3s:
        token: myToken
        private_registries:
          enabled: true
          # Siehe: https://docs.k3s.io/installation/private-registry
          content: 
            mirrors:
              registry.example.com:
                endpoint:
                  - "https://registry.example.com:443"
            # config:
            #   ...
            #   ...
      ansible_host_groups:
        controlplane: k8s_controlplane
        worker: k8s_worker
      debug: True

k8s single-node cluster mit externem ccm

block:
  - name: k8s
    from: cargo.ayedo.cloud/ayedo/linux/k8s
    inventory:
      from: vpc
    config:
      external_cloud_provider: true
      cluster_name: my-cluster
      cluster_ip_detection:
        enabled: true
      init:
        restart_nodes: true # nach erster installation auf false setzen.
      k3s:
        token: myToken
        controlplane:
          taint:
            disabled: true
      ansible_host_groups:
        controlplane: k8s_controlplane
      debug: True

k8s multi-node cluster mit externem ccm und deaktiviertem flannel CNI

Ein nachträgliches deaktivieren des flannel CNI ist nicht möglich.


Mit diesem Beispiel kann der Block ayedo/k8s/cilium als alternativer CNI verwendet werden.

block:
  - name: k8s
    from: cargo.ayedo.cloud/ayedo/linux/k8s
    inventory:
      from: vpc
    config:
      external_cloud_provider: true
      cluster_name: my-cluster
      cluster_ip_detection:
        enabled: true
      init:
        restart_nodes: true # nach erster installation auf false setzen.
      flannel:
        disabled: true
      k3s:
        token: myToken
      ansible_host_groups:
        controlplane: k8s_controlplane
        worker: k8s_worker
      debug: True

k8s multi-node cluster mit deaktvierter IP Erkennung

inventory.yml Beispiel:

all:
  vars:
    primary_ip: 10.11.3.1
    primary_interface: eth0
  hosts:
    demo-controlplane-1:
      ansible_host: 138.201.xxx.xxx
      ansible_user: "sysops"
      ansible_ssh_port: 4422
      ansible_python_interpreter: "/usr/bin/python3"
      ansible_become: "yes"
      internal_ip: 10.11.3.1
      internal_interface: enp7s0
      public_ip: 138.201.xxx.xxx
      public_interface: eth0
    demo-controlplane-2:
      ansible_host: 128.140.xxx.xxx
      ansible_user: "sysops"
      ansible_ssh_port: 4422
      ansible_python_interpreter: "/usr/bin/python3"
      ansible_become: "yes"
      internal_ip: 10.11.3.2
      internal_interface: enp7s0
      public_ip: 128.140.xxx.xxx
      public_interface: eth0
    demo-controlplane-3:
      ansible_host: 142.132.xxx.xxx
      ansible_user: "sysops"
      ansible_ssh_port: 4422
      ansible_python_interpreter: "/usr/bin/python3"
      ansible_become: "yes"
      internal_ip: 10.11.3.3
      internal_interface: enp7s0
      public_ip: 142.132.xxx.xxx
      public_interface: eth0

  children:
    k8s_controlplane:
      hosts:
        demo-controlplane-1:
        demo-controlplane-2:
        demo-controlplane-3:

Block im Workspace:

block:
  - name: k8s
    from: cargo.ayedo.cloud/ayedo/linux/k8s
    inventory:
      from: vpc
    config:
      external_cloud_provider: true
      cluster_name: my-cluster
      init:
        restart_nodes: true # nach erster installation auf false setzen.
      cluster_ip_detection:
        enabled: false
      flannel:
        disabled: true
      k3s:
        token: myToken
      ansible_host_groups:
        controlplane: k8s_controlplane
        worker: k8s_worker
      debug: True

Worker-only join against a shared-edge API (SNI)

When workers join a managed controlplane behind a shared Envoy/Ingress VIP, do not put the VIP IP in primary_ip. Set the full API URL (protocol, hostname, port) on k3s.server. The port is not assumed to be 6443.

Requires block version >= 0.3.11. Existing workspaces that use all.vars.primary_ip keep the legacy https://{{ primary_ip }}:6443 path when k3s.server is empty.

block:
  - name: k8s
    from: cargo.ayedo.cloud/ayedo/linux/k8s-1.27:0.3.11
    config:
      cluster_ip_detection:
        enabled: false
      cluster_name: acme
      flannel:
        disabled: true
      k3s:
        token: myToken
        server: https://api.acme.k8s.example.com:443
      ansible_host_groups:
        worker: k8s_worker

uninstall

Entfernt k3s von allen nodes.

  1. Stoppt die Services k3s und k3s-init
  2. Entfernt die Datei /usr/local/bin/k3s
  3. Entfernt den Ordner /etc/rancher
  4. Entfernt den Ordner /var/lib/rancher
  5. Entfernt die Datei /etc/systemd/system/k3s.service
  6. Entfernt die Datei /run/systemd/transient/k3s-init.service
  7. Startet den Host neu

Installierte Packages werden nicht entfernt. Anpassungen am Betriebssystem werden nicht rückgängig gemacht. Das Verzeichnis /var/lib/kubelet muss ggf. manuell entfernt werden. Vorhandene mounts müssen manuell entfernt werden.