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.).
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.
Vor allem die Topologie des Clusters ist mit dem Cockpit Interface gut zu betrachten.
Der Træfik anhand eines Beispiel-Szenarios
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.
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.
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
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.)
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
Und hier sind wir vorerst zuende mit der Vorstellung unserer Kubernetes PaaS.
Neuen Kommentar hinzufügen