Kubernetes PaaS AF Data Systems

In diesem Beitrag möchten wir Euch unsere PaaS, basierend auf Kubernetes, mit seinen Komponenten und Funktionalitäten vorstellen.

In unserem Kubernetes-Cluster gibt es viele nützliche Komponenten. Unter den wichtigsten, mit denen wir am meisten arbeiten, zählen:

Kubernetes API:

Die Schnittstelle von Kubernetes um das System zu steuern.

etcd:

Der etcd ist notwendig um alle Key-Values zu speichern und den Pods diese zur Verfügung zu stellen.

Kube-Proxy:

Der Kube-Proxy läuft auf jedem Node unseres Clusters. Er hilft uns, Anfragen an den jeweiligen Pod weiterzuleiten. Hierzu kommen die Services zum Einsatz, welche, als Typ NodePort oder Loadbalancer, es ermöglichen, Pods ausserhalb des Clusters anzusteuern.

Kubernetes DNS ( KubeDNS ):

Pods haben oft keine lange Lebensdauer. Sie werden häufig deployed und bekommen daher immer eine andere IP-Adresse. Damit die Container-Applikationen (Pods), Services oder Jobs dennoch aufeinander zugreifen und ausführen können, gibt es einen Kubernetes DNS-Dienst der die Namen auflösen kann.

Zusätzlich zu unserem Kubernetes Setup sind auf einem Node der Git Service Gogs und Jenkins bereitgestellt. Den Gogs könnten wir auch in unserem K8s selber aufsetzen, siehe Gogs auf Kubernetes.

Natürlich ist unser PaaS System schon mal für Euch vorbereitet.

Vorinstallierte Pods und Services in unserem K8s-Cluster:

kubectl get pods --namespace=kube-system

NAME                                        READY     STATUS    RESTARTS   AGE
kube-dns-v20-rh55d                          3/3       Running   3          1d
kubernetes-dashboard-1223860727-dj6zw       1/1       Running   1          1d

kubectl get services --namespace=kube-system

NAME                      CLUSTER-IP      EXTERNAL-IP   PORT(S)                       AGE
kube-dns                  10.254.0.2      <none>        53/UDP,53/TCP                 2d
kubernetes-dashboard      10.254.82.203   <nodes>       9090:30000/TCP                2d

Kubernetes Dashboard:

Das Kubernetes Dashboard ist die graphische Benutzeroberfläche. Mit ihr können wir unser Kubernetes Cluster zusätzlich managen (Deployments, Namespaces, Storages, etc.).

dashboard

Cockpit:

Über das Cockpit Interface bekommt man einen guten Einblick in das System. Vor allem das Cluster lässt sich hiermit gut visualisieren und auch teilweise managen.

screenshot3

Vor allem die Topologie des Clusters ist mit dem Cockpit Interface gut zu betrachten.

screenshot4

Der Træfik anhand eines Beispiel-Szenarios

Bildtext

der Træfik ist ein reverse Proxy und Load Balancer mit dem man einfach Microservices deployen kann. Anhand von 3 Beispiel-Websiten wird die Funktionialität vom Træfik veranschaulicht.

Der Træfik benutzt die K8s Funktionialität des Ingress Controller. Der Ingress Controller hat die Aufgabe, Service und Anwendungen ausserhalb von Kubernetes erreichbar zu machen.

Einfache Schematik der Nutzung eines Ingress:

  internet
     |
[ Ingress ]
--|-----|--
[ Services ]
--|-----|--
[   Pods  ]

Erst erstellen wir Pods und Services mit Beispiel-Websiten:

Die hier benutzten Yamls sind in unserem Github zu finden.

kubectl create -f cheese.yaml und kubectl create -f cheese-services.yaml

Die für unseren Træfik deployten Ingress Example Pods:

kubectl get pods

NAME                          READY     STATUS    RESTARTS   AGE
cheddar-3176250419-b8j4p      1/1       Running   0          2h
cheddar-3176250419-srbdb      1/1       Running   0          2h
stilton-4090477751-7hj4f      1/1       Running   0          2h
stilton-4090477751-z6bqp      1/1       Running   0          2h
wensleydale-434814935-fzr6p   1/1       Running   0          2h
wensleydale-434814935-q6dkz   1/1       Running   0          2h

und die Services:

kubectl get services

NAME                      CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
cheddar                   10.254.104.25    <none>        80/TCP                        2h
stilton                   10.254.166.211   <none>        80/TCP                        2h
wensleydale               10.254.251.18    <none>        80/TCP                        2h

Noch ist der Provider K8s in Træfik leer.

screenshot6

Was uns jetzt fehlt ist ein Ingress, den wir auf die Services anwenden.

kubectl create -f cheese-ingress.yaml

kubectl get ingresses

NAME      HOSTS               ADDRESS   PORTS     AGE
cheeses   cheeses.localhost             80        8m

Nun sieht man die Websiten die durch den Træfik gehen.

screenshot7

Mit einem curl cheeses.localhost/cheddar sieht man, dass der Ingress mit Træfik funktioniert

<html>
  <head>
    <style>
      html { 
        background: url(./bg.jpg) no-repeat center center fixed; 
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
      }

      h1 {
        font-family: Arial, Helvetica, sans-serif;
        background: rgba(187, 187, 187, 0.5);
        width: 4em;
        padding: 0.5em 1em;
        margin: 1em;
      }
    </style>
  </head>
  <body>
    <h1>Cheddar</h1>
  </body>
</html>

Mit Jenkins eine Deployment-Umgebung für Kubernetes

Logo

Jetzt stellt sich die Frage, wie man Änderungen für z.B. die oben benutzte Website schnell und einfach deployen kann. Hierbei hilft uns Jenkins. Zunächst muss man alle benötigten Dateien (Dockerfile, Config-Files, Yamls, etc) in ein Git-Repository ablegen. Diese kann Jenkins in vorkonfigurierten "Jobs" beziehen und dann bauen (Docker Image erstellen und ablegen, Kubectl Ausführen, uvm.)

screenshot9

Im folgendem Diagramm wird ein möglicher Deployment-Prozess mit Jenkins und Git dargestellt.

Blau = Der Jenkins, zuständig für Deployments und Continuous Integration

Rot = Ablaufprozesse eines Deployments zwischen Jenkins und den Komponenten im Kubernetes Cluster

Grün = Die Komponenten im Kubernetes Cluster sowie unsere Pods

screenshot10

Und hier sind wir vorerst zuende mit der Vorstellung unserer Kubernetes PaaS.

Neuen Kommentar schreiben