Kubernetes-Workshop Teil 6: Die erste Applikation

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:

Rancher: Namespace 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:

Rancher-Resources-Workloads.

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

Rancher-Ingress-Route

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.