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
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
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:
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.
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
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