Rancher Lab met RancherOS

Om een Rancher configuratie te maken ga ik met behulp van een aantal virtuele machines een Kubernetes cluster maken. De cluster ga ik ‘Speeltuin’ noemen. De configuratie qua instellingen wordt alsvolgt:

HostnameFunctieCPU’sMemoryip-address (/24)
speeltuin-cp01ControlPlane24GB192.168.178.155
speeltuin-cp02ControlPlane24GB192.168.178.156
speeltuin-etcd01etcd24GB192.168.178.157
speeltuin-etcd02etcd24GB192.168.178.158
speeltuin-etcd03etcd24GB192.168.178.159
speeltuin-w01worker48GB192.168.178.141
speeltuin-w02worker48GB192.168.178.142
speeltuin-w03worker48GB192.168.178.143
speeltuin-w04worker48GB192.168.178.144

Het OS dat ik voor de Rancher Nodes ga gebruiken is RancherOS v1.5.5.

Virtual Machines

Via rancher.com is een ISO van RancherOS te downloaden en die gebruik ik als opstart ISO voor de VM’s.

Na een Enter op de standaard optie wordt RancherOS gestart. Uiteindelijk verschijnt dit scherm:

Het ziet er wat rommelig uit doordat er nog wat docker images gedownload worden maar de essentiele informatie staat op dit scherm, namelijk het IP adres. In dit geval 192.168.178.56, verkregen uit de DHCP server. Daarnaast is de standaard gebruiker ingelogd en dus kunnen we als eerste het password wijzigen.

$ sudo passwd rancher

En hierna kan ik op mijn eigen computer de rancher VM benaderen als gebruiker ‘rancher‘. Voordat ik dat doe, ga ik echter een cloud-config.yml bestand maken met instellingen voor deze rancher-node. Dit bestand ziet er alsvolgt uit:

#cloud-config

rancher:
  network:
    interfaces:
      eth0:
        address: 192.168.178.141/24
        gateway: 192.168.178.1
        dhcp: false
        mtu: 1500
    dns:
      search:
        - digitalinfo.local
      nameservers:
        - 192.168.178.1
        - 8.8.8.8

ssh_authorized_keys:
  - ssh-rsa AAA...ZZZZ nico@Nicos-MacBook-Pro.local

hostname: rancher-w1

Hiermee wordt dus de hostname en de netwerk-instellingen aangepast. Ook plaats ik de publieke SSH-key van mijn MacBook in de config zodat die gebruikt kan worden voor een ssh-sessie. Er kunnen met ‘cloud-config’ nog veel meer aanpassingen gedaan worden, zie daarvoor de handleiding op de rancher-website.

Dit bestand wordt gekopieerd naar de rancher-node met:

$ scp cloud-config.yml rancher@192.168.178.56:/home/rancher/cloud-config.yml

Nu kunnen we inloggen op de rancher node en controleren of we een valide config-file hebben:

$ ssh rancher@192.168.178.56
$ sudo ros config validate -i cloud-config.yml

Hierbij geldt dan ‘geen nieuw = goed nieuws‘ want als het bestand goed is krijg je geen antwoord terug. Is het fout, dan wordt dat wel aangegeven. (duh)

Het config bestand gaan we nu gebruiken om Rancher als node te installeren op de disk /dev/sda:

$ sudo ros install -c cloud-config.yml -d /dev/sda

Voordat de reboot ingezet wordt, zorg ervoor dat de ISO file in de VM-instellingen van de hypervisor niet meer als boot-device staat ingesteld. Daarna kan de Rancher node herstart worden. Na de herstart zijn de instellingen opgepakt:

Na dit op alle 9 de VM’s te hebben uitgevoerd met uiteraard een uniek IP adres en unieke hostname, is het resultaat:
– 9 (RancherOS) nodes (2 x controlplane, 3 x etcd, 4 x worker)
– docker geïnstalleerd op alle nodes
– gebruiker ‘rancher’ die lid is van de docker groep
– rancher-account kan inloggen via ssh m.b.v. rsa key-pair.

Rancher Kubernetes Engine (RKE)

RKE is een CNCF gecertificeerde distributie voor Kubernetes en draait zowel op bare-metal als op VM machines. De RKE wordt via een RKE-binary geconfigureerd en dat wordt via ‘brew’ op mijn MacBook geïnstalleerd. Hierna kan het commando ‘rke’ gebruikt worden.

cluster configuratie file

Het bestand cluster.yml is het configuratiebestand voor RKE en in de meest simpele vorm voor de 9 VM’s ziet dat er alsvolgt uit:

---
nodes:
- address: 192.168.178.155
  user: rancher
  role:
  - controlplane
  hostname_override: speeltuin-cp01
  internal_address: 192.168.178.155
- address: 192.168.178.156
  user: rancher
  role:
  - controlplane
  hostname_override: speeltuin-cp02
  internal_address: 192.168.178.156
- address: 192.168.178.157
  user: rancher
  role:
  - etcd
  hostname_override: speeltuin-etcd01
  internal_address: 192.168.178.157
- address: 192.168.178.158
  user: rancher
  role:
  - etcd
  hostname_override: speeltuin-etcd02
  internal_address: 192.168.178.158
- address: 192.168.178.159
  user: rancher
  role:
  - etcd
  hostname_override: speeltuin-etcd03
  internal_address: 192.168.178.159
- address: 192.168.178.141
  user: rancher
  role:
  - worker
  hostname_override: speeltuin-w01
  internal_address: 192.168.178.141
- address: 192.168.178.142
  user: rancher
  role:
  - worker
  hostname_override: speeltuin-w02
  internal_address: 192.168.178.142
- address: 192.168.178.143
  user: rancher
  role:
  - worker
  hostname_override: speeltuin-w03
  internal_address: 192.168.178.143
- address: 192.168.178.144
  user: rancher
  role:
  - worker
  hostname_override: speeltuin-w04
  internal_address: 192.168.178.144

services:
  kubelet:
    extra_args:
      kube-reserved: "cpu=200m,memory=512Mi"
      system-reserved: "cpu=200m,memory=1024Mi"
      eviction-hard: "memory.available<200Mi,,nodefs.available<10Gi"

cluster_name: speeltuin

network:
  plugin: canal

Het spreekt voor zich, ik ga een cluster maken met nodes met de aangegeven ‘roles’. Voor de kubelet-services wordt via ‘arguments’ computer-resources gereserveerd en met behulp van thresholds voor de disk is de ‘pod-eviction’ instelling gemaakt. Eén commando volstaat voor het aanmaken van de cluster:

$ rke up

INFO[0000] Running RKE version: v1.1.1
INFO[0000] Initiating Kubernetes cluster
INFO[0000] [certificates] GenerateServingCertificate is disabled, checking if there are unused kubelet certificates
INFO[0000] [certificates] Generating admin certificates and kubeconfig
INFO[0000] Successfully Deployed state file at [./cluster.rkestate]
INFO[0255] Building Kubernetes cluster
...
INFO[0308] Finished building Kubernetes cluster successfully

Tijd voor koffie en als het bouwen van de cluster gereed is, vind je twee bestanden in de huidige directory:

  • kube_config_cluster.yml
  • cluster.rkestate

Het config-bestand wordt gebruikt voor ‘kubectl‘ via de KUBECONFIG environment variable en de cluster.rkestate wordt door rke gebruikt.

Controle:

$ export KUBECONFIG=./kube_config_cluster.yml
$ kubectl get nodes

NAME             STATUS ROLES         AGE  VERSION
speeltuin-cp01   Ready  controlplane  1h   v1.17.5
speeltuin-cp02   Ready  controlplane  1h   v1.17.5
speeltuin-etcd01 Ready  etcd          1h   v1.17.5
speeltuin-etcd02 Ready  etcd          1h   v1.17.5
speeltuin-etcd03 Ready  etcd          1h   v1.17.5
speeltuin-w01    Ready  worker        1h   v1.17.5
speeltuin-w02    Ready  worker        1h   v1.17.5
speeltuin-w03    Ready  worker        1h   v1.17.5
speeltuin-w04    Ready  worker        1h   v1.17.5

Met behulp van Helm kunnen nu m.b.v. zogenaamde charts, op een eenvoudige manier packages geïnstalleerd worden, bijvoorbeeld Rancher Server. Echter voordat we dat installeren dient er eerst een Certificate Manager aanwezig te zijn om de SSL-certificaten via Let’s Encrypt te kunnen verkrijgen.

cert-manager

Cert-Manager werkt met CDR’s (Custom Resource Definitions) en die worden eerst geladen en daarna kan via Helm de Cert-Manager deployment gestart worden:

$ kubectl create namespace cert-manager 
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager.crds.yaml
$ helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v0.15.1

Vervolgens maken we een ClusterIssuer om certificaten via Let’s Encrypt op te kunnen halen. Het manifest clusterissuer.yaml ziet er alsvolgt uit:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    email: <hier_komt_jouw_emailadres@domain.com>
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: acme-issuer-account-key
    solvers:
    - http01:
        ingress:
          class: nginx

Invoeren met:

$ kubectl apply -f clusterissuer.yaml

Rancher Server

Hierna kan dus de Rancher Server geïnstalleerd worden. De eerste stap daarvoor is het aanmaken van de namespace:

$ kubectl create namespace cattle-system

Vervolgens kan met Helm de repository toegevoegd worden:

$ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

en hierna kan het eigenlijke werk beginnen. Voor de eenvoud van geldige cerificaten maak ik hier gebruik van LetsEncrypt en daarvoor zijn de extra parameters voor docker aan het eind van dit commando. Zorg er wel voor dat de domain-name ge-resolved kan worden via DNS en gebruik een echt email-adres.

$ helm install rancher rancher-stable/rancher --version v2.3.5 \
--namespace cattle-system \
--set hostname=rancher.digitalinfo.nl \
--set ingress.tls.source=letsEncrypt \
--set letsEncrypt.email=youremail@domain.com

En het resultaat zou dan iets als dit moeten zijn:

NAME: rancher
LAST DEPLOYED: Wed May 27 18:32:53 2020
NAMESPACE: cattle-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Rancher Server has been installed.
NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued and Ingress comes up.
Check out our docs at https://rancher.com/docs/rancher/v2.x/en/
Browse to https://rancher.digitalinfo.nl
Happy Containering!

Browse nu naar de URL zoals ingesteld en dan kan het wachtwoord voor de Admin gebruiker ingesteld worden.

Vervolgens wordt de URL ingesteld voor de Rancher Server GUI.

Aangezien de Rancher Server nu in de lokale Kubernetes cluster ‘draait’ zal deze cluster als ‘local‘ automatisch ingesteld worden.