Rancher: das “gut & günstig” Setup mit K3s und Ansible

Jannik Zinkl
Jannik Zinkl
  • 2023-02-07
  • 9 min to read
Blog Images

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
Jannik Zinkl
Jannik Zinkl

Entrepreneur & Cloud Architect with a passion for Climate Tech