Im fünften Teil haben wir unseren Kubernetes-Cluster eingerichtet. Heute wollen wir die erste Applikation installieren. Wir verwenden für die Demo einfach das kleine webbasierte Spiel game2048. Dieses gibt es praktischerweise schon fertig als Docker-Container.
Im ersten Schritt erstellen wir einen Namespace:
kubectl create namespace game2048
Dann erzeugen wir eine deployment.yaml mit folgendem Inhalt:
apiVersion: apps/v1
kind: Deployment
metadata:
name: game2048
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: game2048
template:
metadata:
labels:
app.kubernetes.io/name: game2048
spec:
containers:
- name: game2048
securityContext:
{}
image: "ponsfrilus/2048nginx:latest"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
und deployen diese mit:
kubectl -n game2048 create -f deployment.yaml
Mit folgendem Kommando kann man sich das Ergebnis anschauen:
kubectl -n game2048 get deployments
Wir sollten folgendes Ergebnis erhalten:
NAME READY UP-TO-DATE AVAILABLE AGE
game2048 1/1 1 1 16s
Damit wir auf den installierten Server zugreifen können, benötigen wir einen Service, den wir in der Datei service.yaml definieren:
apiVersion: v1
kind: Service
metadata:
name: game2048
labels:
app.kubernetes.io/name: game2048
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: game2048
Auch diesen Service installieren wir mit:
kubectl -n game2048 create -f service.yaml
Nun definieren wir eine Ingress-Route und erstellen eine Datei ingress.yaml. Das Entscheidende ist die Angabe der Domain unter „host:“. Unter dieser Adresse wollen wir die Anwendung aufrufen.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: game2048
labels:
app.kubernetes.io/name: game2048
spec:
rules:
- host: "2048.ronnywalter.de"
http:
paths:
- path: /
backend:
serviceName: game2048
servicePort: 80
Auch diese installieren wir mit:
kubectl -n game2048 create -f ingress.yaml
Damit haben wir folgende Komponenten deployed:
kubectl -n game2048 get all
NAME READY STATUS RESTARTS AGE
pod/game2048-5fb4546466-266hv 1/1 Running 0 7m10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/game2048 ClusterIP 10.43.114.142 <none> 80/TCP 3m45s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/game2048 1/1 1 1 7m10s
NAME DESIRED CURRENT READY AGE
replicaset.apps/game2048-5fb4546466 1 1 1 7m10s
Natürlich kann man sich das Ganze auch in der Rancher-Oberfläche ansehen. Der soeben erzeugte Namespace ist standardmäßig noch keinem Rancher-Projekt zugeordnet. Das liegt daran, dass der Projekt-Begriff eine Rancher-Eigenschaft ist, und kein Kubernetes-Objekt. Wir haben soeben nur mit Kubernetes-Mitteln gearbeitet. Man kann den Namespace über die Oberfläche in ein Projekt (wie z.B. Default) verschieben:

Es gibt auch die Möglichkeit, an den Namespace sogenannte Labels anzubringen und damit die Zuordnung zu Projekten zu realisieren, doch dazu später mehr.
Im Projekt Default sieht man nun die installierte Anwendung:

Oder die installierten Ingress-Routen (unter „Load Balancing“):

Nun wollen wir endlich die Applikation auch aufrufen und können das unter der URL, die wir in der Ingress-Definition angegeben haben, auch tun. Im obigen Beispiel haben wir http://2048.ronnywalter.de verwendet.
In Teil 2 haben wir die Server mit der Firewall ufw eingerichtet. Es ist natürlich notwendig, den http-Port zuzulassen, damit wir auf den Server zugreifen können. Das machen wir in dem Beispiel auf den 3 Nodes, auf denen wir Kubernetes installiert haben. Den https-Port öffnen wir gleich mit, da wir den später noch brauchen.
ufw allow http
ufw allow https
Nun können wir die Seite aufrufen.

Der Browser zeigt nun noch an, dass die Seite „Nicht Sicher“ ist. Heutzutage betreibt man keine Seiten mehr ohne https und ein gültiges Zertifikat. Daher wollen wir uns im nächsten Teil ein eben solches via LetsEncrypt besorgen.