Zum Hauptinhalt springen

Beispiele

Diverse Dienste bzw. Applikationen können mit Hilfe von kubectl oder beispielsweise helm installiert werden.

Kubectl

Ein essenzieller Teil eines Kubernetes-Clusters ist die Erreichbarkeit von außen. Um dies zu erreichen muss ein Service sowie Ingress erstellt werden.

$ kubectl create namespace nginx
namespace/nginx created
nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
$ kubectl apply -f nginx-svc.yaml

Die External-IP des Loadbalancers kann über kubectl get svc nginx-service -n nginx in Erfahrung gebracht werden.

Der Ingress dient dabei als Vermittler zwischen dem eingehenden Traffic und dem Service

nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 4G
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
$ kubectl apply -f nginx-ingress.yaml

Um nginx selbst auszurollen, muss ein Deployment erstellt werden:

nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
$ kubectl apply -f nginx-deployment.yaml --namespace nginx

Um alles wieder abzureißen, kann folgender Befehl benutzt werden:

$ kubectl delete all --all --namespace nginx

Helm

Einfacher geht das ganze noch, wenn Helm benutzt wird. Dabei wird automatisch ein Service für den Dienst erstellt. Ausserdem kann, in den meisten Fällen, innerhalb der Values ein Ingress konfiguriert werden. Zuvor muss jedoch, ebenfalls per Helm, ein Ingress mit dem Type Loadbalancer erstellt werden, damit eine öffentliche IP Adresse für den nachfolgenden Dienst existiert.

ingress-values.yaml
controller:
allowSnippetAnnotations: true
podLabels:
app: nginx-ingress
component: controller
extraArgs:
enable-ssl-passthrough: ""
config:
use-http2: true
service:
type: "LoadBalancer"
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm upgrade -i ingress-nginx -f ingress-values.yaml --create-namespace -n ingress-nginx ingress-nginx/ingress-nginx
nginx-values.yaml
cloneStaticSiteFromGit:
enabled: true
repository: "https://github.com/regiocloud/example-website"
branch: "main"
interval: 3600
$ helm upgrade -i nginx -f nginx-values.yaml --create-namespace -n nginx oci://registry-1.docker.io/bitnamicharts/nginx

Die Values in nginx-values.yaml dienen nur als Beispiel. Hier wird eine statische Website ausgeliefert. Alle möglichen Values für das Helm Chart finden sich in der values.yaml des Helm Charts selbst.

Die Erstellung des Loadbalancers nimmt einige Zeit in Anspruch. Mit dem nachfolgendem Kommando kann darauf gewartet werden. Sobald der Loadbalancer verfügbar ist wird in der Spalte EXTERNAL-IP die öffentlich erreichbare IP Adresse des Loadbalancers hinterlegt. Das Kommand kann dann mit STRG+C beendet werden.

$ kubectl get svc --namespace nginx -w nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 100.90.239.115 <pending> 80:31627/TCP 58s
nginx LoadBalancer 100.90.239.115 <pending> 80:31627/TCP 2m12s
nginx LoadBalancer 100.90.239.115 81.163.193.251 80:31627/TCP 2m12s

Die Beispiel Website ist dann über die IP Adresse in der Spalte EXTERNAL-IP über einen beliebigen Browser aufrufbar.

Zum Abreißen des Charts, kann folgender Befehl benutzt werden:

$ helm uninstall nginx -n nginx
release "nginx" uninstalled

Der Loadbalancer kann wie folgt entfernt werden:

$ helm uninstall ingress-nginx -n ingress-nginx
release "ingress-nginx" uninstalled

Kubeapps

$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ kubectl create namespace kubeapps
$ helm install kubeapps --namespace kubeapps bitnami/kubeapps
$ kubectl create --namespace default serviceaccount kubeapps-operator
$ kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kubeapps-operator-token
namespace: default
annotations:
kubernetes.io/service-account.name: kubeapps-operator
type: kubernetes.io/service-account-token
EOF
$ kubectl get --namespace default secret kubeapps-operator-token -o go-template='{{.data.token | base64decode}}'
$ kubectl port-forward -n kubeapps svc/kubeapps 8080:80