K8s Applications mit MicroK8S auf Raspberry PI. Alfred Sabitzer
'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.
Es wird die config aus ${HOME}/.kube/config verwendet.
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.
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.
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.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)