Dieser Beitrag ist ein Tutorial darüber, wie man eine mit nginx gehostete Website mit dem in K3s eingebauten Ingress Controller Traefik exponiert.

Er basiert auf meinem letzten Beitrag

Das Ergebnis war ein “leerer” Cluster ohne nützliche Services. In meinem ersten Beitrag zur Installation von K3s habe ich einen Ingress Controller basierend auf HAProxy erstellt. Damals war mir nicht bewusst, dass K3s bereits einen Ingress Controller enthält, der sofort einsatzbereit ist.

Diesmal werden vier Kubernetes-Ressourcen benötigt:

  • ConfigMap
  • Deployment
  • Service
  • Ingress

Die ConfigMap ist ein schneller Weg, die index.html für nginx verfügbar zu machen. Es ist keine saubere Art, eine Website zu hosten, und wird nur für dieses Tutorial verwendet.

Erstelle zuerst die index.html:

<html>
<head><title>Hello World!</title>
 <style>
 html {
  font-size: 500.0%;
 }
 div {
  text-align: center;
 }
 </style>
</head>
<body>
 <div>Hello World!</div>
</body>
</html>

Dann erstelle die ConfigMap:

kubectl create configmap test-html --from-file index.html

Die restlichen Manifeste sind ähnlich wie im vorherigen Tutorial, außer der Volume-Deklaration im Deployment:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
 name: nginx-ingress
 annotations:
 kubernetes.io/ingress.class: "traefik"
spec:
 rules:
 - http:
  paths:
  - path: /
  backend:
   serviceName: nginx-service
   servicePort: 80

---
apiVersion: v1
kind: Service
metadata:
 name: nginx-service
 labels:
 run: nginx
spec:
 ports:
 - port: 80
  protocol: TCP
 selector:
 app: nginx

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
spec:
 selector:
 matchLabels:
  app: nginx
 replicas: 10
 template:
 metadata:
  labels:
  app: nginx
 spec:
  containers:
  - name: nginx
  image: nginx
  ports:
  - containerPort: 80
  volumeMounts:
  - name: html-volume
   mountPath: /usr/share/nginx/html
  volumes:
  - name: html-volume
  configMap:
   name: test-html

Wende alles an mit:

kubectl apply -f nginx.yaml

Überprüfe die IP, unter der die Website erreichbar ist:

$ kubectl get ingress
NAME   CLASS HOSTS ADDRESS  PORTS AGE
nginx-ingress <none> *  12.345.6.789 80  22m

Probiere es aus mit:

wget 12.345.6.789

Dies sollte das HTML zurückgeben, das am Anfang dieses Tutorials zur ConfigMap hinzugefügt wurde.

Ressourcen