Rancher: das “gut & günstig” Setup mit K3s und Ansible
Rancher ist ein tolles Tool, um mehrere Kubernetes Cluster schnell und einfach verwalten zu können. Bei trieb.work betreiben wir viele Services in Kubernetes Clustern, die wir mit der Rancher Oberfläche verwalten. Da Rancher selber in einem Kubernetes Cluster betrieben werden muss, hat man hier oft hohe laufende Kosten. Wir stellen hier im Kurzen unser Setup mit “K3s” statt “k8s” vor und wieso dieses Setup günstiger ist.
Unterschied zwischen K3s und k8s
Im Vergleich zu Kubernetes bietet K3s einen geringeren Funktionsumfang, ist jedoch schneller und einfacher zu installieren und zu verwalten. Es ist für Edge-Computing-Szenarien und Umgebungen mit geringen Ressourcen geeignet, während Kubernetes für größere, komplexere Deployments entwickelt wurde.
Da das Cluster nur Rancher als Applikation beheimatet, werden viele Features von Kubernetes nicht benötigt - es kann im allgemeinen einfacher aufgebaut sein und damit weniger Ressourcen verbrauchen.
K3s Aufbau in der Hetzner Cloud
Hetzner hat sich auch bei diesem Projekt als Hostinganbieter angeboten. Wir nutzen hier für einen simplen Aufbau zwei K3s VMs und eine PostgresQL VM als Datenspeicher.
Das “Bestellen” der VMs und des virtuellen Netz läuft komplett mittels Ansible. Der generelle Ablauf und die Strukturierung der Ansible Skripte sieht so aus:
- hosts: localhost
connection: local
gather_facts: False
user: root
vars:
tasks:
- include_tasks: roles/hetzner-project/security.yml
- hosts: localhost
connection: local
gather_facts: False
user: root
vars:
datacenter_location: nbg1
tasks:
- include_tasks: roles/hetzner-server/hetzner-nodes-k3s.yml
- hosts: localhost
user: root
connection: local
gather_facts: False
vars:
tasks:
- include_tasks: roles/hetzner-networking/hetzner-network.yml
- hosts: _managed_by_ansible_
user: root
tasks:
- include_tasks: roles/system-upgrade.yml
- hosts: _managed_by_ansible_
user: root
gather_facts: False
collections:
- devsec.hardening
roles:
- ssh_hardening
vars:
ssh_permit_root_login: "without-password"
ssh_print_motd: true
ssh_allow_tcp_forwarding: 'yes'
# needed for ansible
sftp_enabled: true
- hosts: control-k3s-datastore
user: root
gather_facts: False
tasks:
- include_tasks: roles/postgresql/install.yml
- include_tasks: roles/postgresql/configure.yml
handlers:
- name: restart postgres
service: name=postgresql state=restarted
- hosts: _workload_type_control
user: root
gather_facts: False
tasks:
- include_tasks: roles/k3s/master.yml
- hosts: control-k3s-1
user: root
gather_facts: False
name: Display content of k3s kubeconfig
tasks:
- name: Display k3s kubeconfig contents
command: cat /etc/rancher/k3s/k3s.yaml
register: command_output
- name: Print to console
debug:
msg: "{{ command_output.stdout_lines }} "
- Einrichten eines public keys in der Hetzner Cloud
- Bestellen der Server in der Location nbg1
- Einrichten des virtuellen Netzes für den Traffic der k3s Nodes mit Postgres
- Ein komplettes System Upgrade
- Ein standard SSH-Hardening um Zugriffe einzuschränken (in Zukunft werden wir versuchen, dass viele Nodes keine public IP Adresse mehr haben, sondern der Zugriff z.B. über die Hetzner CLI abläuft
- Installation und Konfiguration von Postgres
- Start des k3s setups auf den Worker-Nodes. Hierbei richten wir auch die beiden IP Adressen in Cloudflare im DNS ein
- Nach dem Setup wird der Inhalt der kubeconfig auf der Console angezeigt
