Kubernetes Block
Installiert Kubernetes k3s auf einen oder mehreren Hosts.
Dieser Block kann mit
block.config.k3s.versionaktualisiert 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)
- Cordon
- Drain
- Restart k3s
- 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.workerundconfig.ansible_host_groups.controlplanewird angegeben, welche Host-Gruppen aus der Inventory für die Kubernetes installation verwendet werden sollen.
Wurden die Server mit dem Block
ayedo/hetzner/vpcerstellt, mussinventory.from:mit dem entsprechenden Block namen angegeben werden (Bspw.vpc). Imayedo/hetzner/vpcBlock sollten für die einzelnen Hosts entsprechende Labels gesetzt werden. Bspwkey: k8smitvalue: controlplaneundkey: k8smitvalue: worker. Die Labels/Hosts werden als Ansible-Host-Gruppen in die Inventory geschrieben und alsk8s_controlplaneundk8s_workerdargestellt
|--@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.tokenmuss mindestend 10 Zeichen lang sein.
Soll anstelle des "Kubernetes cloud controler manager" (ccm) ein externer
ccmverwendet werden (Bspw.cargo.ayedo.cloud/ayedo/hetzner/ccm), muss der wertconfig.external_cloud_providerauftruegesetzt 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
CNIverwendet werden (Bspw.cargo.ayedo.cloud/ayedo/k8s/ccciliumm), muss der wertconfig.flannel.disabledauftruegesetzt 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.disabledauftruegesetzt werden. Ansonsten werden keine Workloads auf der Controlplane zugelassen. Der Wertconfig.ansible_host_groups.workerwird 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/ciliumals 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.
- Stoppt die Services k3s und k3s-init
- Entfernt die Datei /usr/local/bin/k3s
- Entfernt den Ordner /etc/rancher
- Entfernt den Ordner /var/lib/rancher
- Entfernt die Datei /etc/systemd/system/k3s.service
- Entfernt die Datei /run/systemd/transient/k3s-init.service
- 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.