Alfred Sabitzer

K8s Applications mit MicroK8S auf Raspberry PI


Скачать книгу

'source <(kubectl completion bash)' >>~/.bashrc

      alfred@bureau:~$ sudo su -l

      root@bureau:~# kubectl completion bash >/etc/bash_completion.d/kubectl

      root@bureau:~# exit

      Abgemeldet

      alfred@bureau:~$ echo 'alias k=kubectl' >>~/.bashrc

      echo 'complete -F __start_kubectl k' >>~/.bashrc

      alfred@bureau:~$

      Nun loggen wir uns neu ein. Somit funktioniert der Alias und der Zugriff auf den Cluster von außen.

      alfred@bureau:~$ k get all

      NAME READY STATUS RESTARTS AGE

      pod/webserver-depl-bff4d4675-8v9nz 1/1 Running 2 (179m ago) 18h

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

      service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 3d3h

      service/webserver-svc ClusterIP 10.152.183.121 <none> 443/TCP,80/TCP 38h

      NAME READY UP-TO-DATE AVAILABLE AGE

      deployment.apps/webserver-depl 1/1 1 1 38h

      NAME DESIRED CURRENT READY AGE

      replicaset.apps/webserver-depl-cf898f654 0 0 0 38h

      replicaset.apps/webserver-depl-98f95758b 0 0 0 38h

      replicaset.apps/webserver-depl-646544ddfd 0 0 0 37h

      replicaset.apps/webserver-depl-dd8c746d6 0 0 0 37h

      replicaset.apps/webserver-depl-86c6d7549f 0 0 0 37h

      replicaset.apps/webserver-depl-b485f9695 0 0 0 19h

      replicaset.apps/webserver-depl-c8599c9f5 0 0 0 19h

      replicaset.apps/webserver-depl-bff4d4675 1 1 1 18h

      alfred@bureau:~$

      Jetzt können wir den Cluster in der Lens einrichten.

      OEBPS/images/image0018.jpg Abbildung 16: Lens - Cluster hinzufügen

      Es wird die config aus ${HOME}/.kube/config verwendet.

      OEBPS/images/image0019.jpg Abbildung 17: Lens - Cluster Ansicht

      Nun ist Lens mit dem Cluster verbunden. Somit kann komfortabel vom eigenen Rechner aus gearbeitet werden.

      Alternativ ist natürlich auch das Kubernet Dashboard als Webapplikation vorhanden.

      OEBPS/images/image0020.jpg Abbildung 18: Kubernetes Dashboard

      Somit kann der Cluster bequem verwaltet und diagnostiziert werden.

      Wie sicher das exponieren der API nach aussen ist, weiß ich noch nicht. Im Internet sollten der Cluster durch die Firewall geschützt sein (nur die Ingress-Ports sichtbar).

      Generell sollte bei Einsatz im Internet der Firewall große Beachtung zuteil werden. Lokal zu Hause ist die Architektur etwas einfacher.

      OEBPS/images/image0021.jpg Abbildung 19: Netzwerk Architektur

      Hier ist nur der Ingress nach aussen sichtbar. Alles andere kann von aussen nicht erreicht werden. In Richtung Intranet ist alles erlaubt.

      Einfacher WebServer mit Go

      Inspiration:

       https://golang.org/doc/articles/wiki/

       https://www.socketloop.com/tutorials/golang-get-hardware-information-such-as-disk-memory-and-cpu-usage

       https://www.freecodecamp.org/news/how-to-remove-images-in-docker/

      https://docs.docker.com/engine/reference/commandline/image_pull/

      Dieses Kapitel beschreibt einen einfachen WebServer mit Go. Das ist ein richtig funktionierender WebService. Dieser Service wird alle Variablen und die Systemzeit des Containers wiedergeben.

      Zuerst brauchen wir ein einfaches Programm.

      // Ausgabe eines einfachen HTML-Files und ersetzen von Schlüsselwörtern mit konkreten Informationen

      // Inspiration https://golang.org/doc/articles/wiki/

      // https://www.socketloop.com/tutorials/golang-get-hardware-information-such-as-disk-memory-and-cpu-usage

      //

      // alfred@monitoring:~/GetInfo$ go get github.com/shirou/gopsutil/...

      package main

      import (

       "bufio"

       "fmt"

       "io/ioutil"

       "log"

       "net/http"

       "os"

       "runtime"

       "strconv"

       "strings"

       "time"

       "github.com/shirou/gopsutil/disk"

       "github.com/shirou/gopsutil/host"

       "github.com/shirou/gopsutil/mem"

      )

      type Page struct {

       Title string

       Body []byte

      }

      func loadError(xerr string) (xhtml string) {

       var xs string

       currentTime := time.Now()

       xtext, err := ioutil.ReadFile("error.html")

       if err != nil {

       log.Fatal("Error File kann nicht geöffnet werden " + err.Error())

       }

       xs = strings.Replace(string(xtext), "%SYSTIME%", currentTime.Format("2006-01-02 15:04:05 Monday"), -1)

       xs = strings.Replace(string(xs), "%SYSTEMFEHLER%", xerr, -1)

       return xs

      }

      func loadPage(title string) (*Page, error) {

       var xhtml string

       var xtmp string

       var xenv string

       const GB = 1073741824

       filename := title + ".html"

       log.Println(filename)

       xhtml = ""

       currentTime := time.Now()

       f, err := os.Open(filename)

       if err != nil {

       log.Println(filename+" kann nicht geöffnet werden: ", err)

       xhtml = loadError(err.Error())

       } else {

       scanner := bufio.NewScanner(f)