Raphael Friedmann

Ansible – Deployment von Kubernetes (v1.23.3)

Ansible ist ein Opensource Werkzeug, um einen oder mehrere PCs per SSH verwalten zu können und zielt primär auf System ab, die auf Linux basieren. Jedoch kann seit einiger Zeit auch Windows System damit verwalten. Mit den sogenannten Playbook kann man komplette Abläufe über einen oder mehrere Hosts komplett automatisieren und bei Bedarf erneut ausführen.

Das ist in Kombination beispielsweise mit Virtuellen Maschinen in Kombination mit Snapshots sehr praktisch um etwas auszuprobieren.

Als Beispiel deklariert man als erstes eine „hosts“ Datei mit folgendem Inhalt:

				
					[control_plane]
master1.kube.local ansible_host=192.168.0.80

[workers]
worker1.kube.local ansible_host=192.168.0.91
worker2.kube.local ansible_host=192.168.0.91
[cluster:children]
control_plane
workers

				
			

Die IP-Adressen muss man dementsprechend anpassen. In dem Beispiel gehe ich davon aus, das 3 Systeme mit einer Ubuntu Version per Vagrant vorinstalliert sind.

Das untere Beispiel macht folgende Schritte:

– Deaktivierung von automatischen Updates (Ungünstig bei Kubernetes, die Systempflege der Updates muss per Hand erfolgen.)

– Legt einen neuen Benutzer „kube“ mit dem Passwort „kubernetes“ an und erlaubt es „kube“ sudo Befehle ohne Passwort auszuführen.

– Kopiert in dem Fall aus dem Home-Verzeichnis ~/.ssh/authorized_keys einen SSH-Key, den ich in der Regel zum Login verwende, das kann je nach eigenen Bedürfnissen angepasst werden.

– Updatet das System auf das aktuelle Patchlevel bevor Kubernetes installiert wird und löscht von der Installation vorhandene und überflüssige Pakete

– Deaktiviert das Swap von RAM, da Kubernetes damit nicht klar kommt.

– Legt innerhalb der Datei /etc/hosts statische Einträge an, damit der Kubernetes Cluster für den Start nicht auf einen funktionierenden DNS-Server angewiesen ist.

– Installiert containerd als Ersatz zu Docker. Docker gilt mittlerweile seit Version 1.20 als Deprecated.

– Passt das IP Forwarding an, damit Pods von außen erreicht werden können.

– Installiert die Kubernetes Cluster Pakete und aktiviert diese automatisch beim Systemstart.

Folgende Datei als kube-dependencies.yml speichern:

				
					---
- hosts: all
  become: yes
  tasks:
   - name: Disable auto upgrades
     copy:
       src: /usr/share/unattended-upgrades/20auto-upgrades-disabled
       dest: /etc/apt/apt.conf.d/20auto-upgrades
       remote_src: yes
   - name: Create kube superuser user with pass kubernetes
     user:
       name: kube
       password: $6$5dqHns.IJ$FpCGaCbY9ySKo0mh.ydPo57A2kgUdjv3U8IUZXnfw8DNGQw4g0hO27XpMSIhwHvcO8QdEVucnlY9tYyTEg3CN/
       shell: /bin/bash
       groups: sudo
   - name: Allow kube to use sudo without a password
     copy:
       content: "kube ALL=(ALL) NOPASSWD:ALL"
       dest: /etc/sudoers.d/kube
   - name: upload ssh key
     authorized_key:
       user: kube
       state: present
       manage_dir: yes
       key: "{{ lookup('pipe', 'cat ~/.ssh/authorized_keys') }}"
   - name: Updating System to latest Packages
     apt:  update_cache=yes upgrade=dist force_apt_get=yes
   - name: Clean unwanted olderstuff
     apt:
          autoremove: yes
          purge: yes
   - name: Remove swapfile from /etc/fstab
     mount:
       name: "{{ item }}"
       fstype: swap
       state: absent
     with_items:
       - swap
       - none
   - name: Disable swap
     command: swapoff -a
     when: ansible_swaptotal_mb > 0

   - name: Add IPs to /etc/hosts on master and workers
     lineinfile:
       dest: /etc/hosts
       regexp: '.*{{ item }}$'
       line: "{{ hostvars[item].ansible_host }} {{item}}"
       state: present
     when: hostvars[item].ansible_host is defined
     with_items: "{{ groups.all }}"
   - name: Install containerd
     apt:
       name: containerd
       state: present
       update_cache: true
   - name: Create containerd config file
     file:
       path: "/etc/modules-load.d/containerd.conf"
       state: "touch"

   - name: Add conf for containerd
     blockinfile:
       path: "/etc/modules-load.d/containerd.conf"
       block: |
             overlay
             br_netfilter

   - name: modprobe
     shell: |
             sudo modprobe overlay
             sudo modprobe br_netfilter

   - name: Set system configurations for Kubernetes networking
     file:
       path: "/etc/sysctl.d/99-kubernetes-cri.conf"
       state: "touch"

   - name: Add IP Forward and IPtables for containerd
     blockinfile:
       path: "/etc/sysctl.d/99-kubernetes-cri.conf"
       block: |
              net.bridge.bridge-nf-call-iptables = 1
              net.ipv4.ip_forward = 1
              net.bridge.bridge-nf-call-ip6tables = 1

   - name: Apply new sysctl settings
     command: sudo sysctl --system
   - name: install APT Transport HTTPS
     apt:
       name: apt-transport-https
       state: present
   - name: Add Kubernetes apt-key
     apt_key:
       url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
       state: present
   - name: Add Kubernetes APT repository
     apt_repository:
      repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
      state: present
      filename: 'kubernetes'
   - name: Installing Kubernetes Cluster Packages.
     apt:
       name:
         - kubeadm
         - kubectl
         - kubelet
       state: present
   - name: Enable service kubelet, and enable persistently
     service:
       name: kubelet
       enabled: yes
   - name: Disable multipathd
     service:
       name: multipathd
       enabled: no
   - name: Disable unattended-upgrades
     service:
       name: unattended-upgrades
       enabled: no
   - name: Disable cron
     service:
       name: cron
       enabled: no

   - name: Reboot all the kubernetes nodes.
     reboot:
       post_reboot_delay: 10
       reboot_timeout: 40
       connect_timeout: 60
       test_command: uptime

				
			

Um das Playbook zu starten tippt man folgendes ein:

				
					ansible-playbook -i hosts kube-dependencies.yml
				
			

Das wird einige Zeit dauern, Zeit um eine kleine Pause zu machen.