diff --git a/vsellier/5mntalks/kube101/Readme.md b/vsellier/5mntalks/kube101/Readme.md new file mode 100644 index 0000000..e9334c0 --- /dev/null +++ b/vsellier/5mntalks/kube101/Readme.md @@ -0,0 +1,38 @@ +# Kubernetes 101 + +Demos for https://hedgedoc.softwareheritage.org/WHMy1n08TASpdzz6rflWMA?both + + +## Prerequisites + +- k3s (https://k3s.io) +- Deploy a registry +``` +kubectl create namespace registry +kubectl apply --namespace registry registry +``` +- Add the entry `registry.demo` pointing to your cluster in your local `/etc/hosts` and on each node of your cluster +- on each node, create the file `/etc/rancher/k3s/registries.yaml` with this content: +``` +mirrors: + registry.demo: + endpoint: + - "http://registry.demo/v2/" +``` +- restart k3s + +- build the demo images +``` +cd demo-flask +./build.sh +``` + +- for the distributed storage, deploy longhorn (https://longhorn.io) +``` +cd longhoen +./install.sh +``` + +## demos + +Follow the speaker notes on the presentation diff --git a/vsellier/5mntalks/kube101/curl b/vsellier/5mntalks/kube101/curl new file mode 100755 index 0000000..6488f4e --- /dev/null +++ b/vsellier/5mntalks/kube101/curl @@ -0,0 +1,6 @@ +#!/bin/bash + +cmd="kubectl run --rm -ti --command=true --image curlimages/curl curl /bin/sh" + +echo "$cmd" +eval $cmd diff --git a/vsellier/5mntalks/kube101/d1-1 b/vsellier/5mntalks/kube101/d1-1 new file mode 100755 index 0000000..9a57606 --- /dev/null +++ b/vsellier/5mntalks/kube101/d1-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl get nodes -o wide" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d1-2 b/vsellier/5mntalks/kube101/d1-2 new file mode 100755 index 0000000..68fb767 --- /dev/null +++ b/vsellier/5mntalks/kube101/d1-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl describe nodes vse-k3s-2" + +echo "$cmd" +read +eval $cmd | less diff --git a/vsellier/5mntalks/kube101/d2-1 b/vsellier/5mntalks/kube101/d2-1 new file mode 100755 index 0000000..9db54cc --- /dev/null +++ b/vsellier/5mntalks/kube101/d2-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl run -ti --rm --image debian debian" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d2-2 b/vsellier/5mntalks/kube101/d2-2 new file mode 100755 index 0000000..bdc52f3 --- /dev/null +++ b/vsellier/5mntalks/kube101/d2-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl describe pod debian | less" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d3-1 b/vsellier/5mntalks/kube101/d3-1 new file mode 100755 index 0000000..492b604 --- /dev/null +++ b/vsellier/5mntalks/kube101/d3-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl apply -f d3-1.yaml" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d3-1.yaml b/vsellier/5mntalks/kube101/d3-1.yaml new file mode 100644 index 0000000..8c7a154 --- /dev/null +++ b/vsellier/5mntalks/kube101/d3-1.yaml @@ -0,0 +1,47 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: d3 +spec: + selector: + matchLabels: + app: d3 + replicas: 2 + strategy: + rollingUpdate: + maxSurge: 1 + template: + metadata: + labels: + app: d3 + spec: + containers: + - name: d3 + image: registry.demo/demo:v0 + imagePullPolicy: Always + resources: + requests: + memory: "64Mi" + cpu: "100m" + limits: + memory: "128Mi" + cpu: "500m" + ports: + - containerPort: 5000 + readinessProbe: + httpGet: + port: 5000 + periodSeconds: 2 + failureThreshold: 1 + startupProbe: + httpGet: + port: 5000 + periodSeconds: 2 + successThreshold: 1 + livenessProbe: + httpGet: + port: 5000 + periodSeconds: 2 + failureThreshold: 1 + successThreshold: 1 diff --git a/vsellier/5mntalks/kube101/d3-2 b/vsellier/5mntalks/kube101/d3-2 new file mode 100755 index 0000000..cad0be5 --- /dev/null +++ b/vsellier/5mntalks/kube101/d3-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl scale --replicas=5 deployment d3" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d3-3 b/vsellier/5mntalks/kube101/d3-3 new file mode 100755 index 0000000..2db7024 --- /dev/null +++ b/vsellier/5mntalks/kube101/d3-3 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl scale --replicas=2 deployment d3" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d4-1 b/vsellier/5mntalks/kube101/d4-1 new file mode 100755 index 0000000..b236c7b --- /dev/null +++ b/vsellier/5mntalks/kube101/d4-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl apply -f d4-1.yaml" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d4-1.yaml b/vsellier/5mntalks/kube101/d4-1.yaml new file mode 100644 index 0000000..556a3f6 --- /dev/null +++ b/vsellier/5mntalks/kube101/d4-1.yaml @@ -0,0 +1,33 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: d3-clusterip +spec: + type: ClusterIP + selector: + app: d3 + ports: + - port: 5000 + targetPort: 5000 +--- +apiVersion: v1 +kind: Service +metadata: + name: d3-nodeport +spec: + type: NodePort + selector: + app: d3 + ports: + - port: 5000 + targetPort: 5000 + nodePort: 30000 # 30000 <= nodePort < 32767 +--- +apiVersion: v1 +kind: Service +metadata: + name: d3-externalname +spec: + type: ExternalName + externalName: www.duckduckgo.com diff --git a/vsellier/5mntalks/kube101/d4-2 b/vsellier/5mntalks/kube101/d4-2 new file mode 100755 index 0000000..020ae9e --- /dev/null +++ b/vsellier/5mntalks/kube101/d4-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl run -ti --rm --command=true --image curlimages/curl curl /bin/sh" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d5-1 b/vsellier/5mntalks/kube101/d5-1 new file mode 100755 index 0000000..2557cd2 --- /dev/null +++ b/vsellier/5mntalks/kube101/d5-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl apply -f d5-1.yaml" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d5-1.yaml b/vsellier/5mntalks/kube101/d5-1.yaml new file mode 100644 index 0000000..59db36f --- /dev/null +++ b/vsellier/5mntalks/kube101/d5-1.yaml @@ -0,0 +1,19 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: demo + labels: + name: d3 +spec: + rules: + - host: demo + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: d3-clusterip + port: + number: 5000 diff --git a/vsellier/5mntalks/kube101/d6-1 b/vsellier/5mntalks/kube101/d6-1 new file mode 100755 index 0000000..9a5cb4b --- /dev/null +++ b/vsellier/5mntalks/kube101/d6-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="watch -n1 'curl -s http://demo; echo; curl -s http://demo/count'" + +echo "$cmd" +read +watch -n1 "echo HOME PAGE; curl -s http://demo; echo; echo count; curl -s http://demo/count" diff --git a/vsellier/5mntalks/kube101/d6-2 b/vsellier/5mntalks/kube101/d6-2 new file mode 100755 index 0000000..98d9fc1 --- /dev/null +++ b/vsellier/5mntalks/kube101/d6-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl set image deployment/d3 d3=registry.demo/demo:v1 --record" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d6-3 b/vsellier/5mntalks/kube101/d6-3 new file mode 100755 index 0000000..5e44660 --- /dev/null +++ b/vsellier/5mntalks/kube101/d6-3 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl rollout undo deployment d3" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d6-4 b/vsellier/5mntalks/kube101/d6-4 new file mode 100755 index 0000000..89542e0 --- /dev/null +++ b/vsellier/5mntalks/kube101/d6-4 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl set image deployment/d3 d3=registry.demo/demo:v2 --record" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d6-5 b/vsellier/5mntalks/kube101/d6-5 new file mode 100755 index 0000000..423548b --- /dev/null +++ b/vsellier/5mntalks/kube101/d6-5 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl scale --replicas=6 deployment d3" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d7-1 b/vsellier/5mntalks/kube101/d7-1 new file mode 100755 index 0000000..7f8b09b --- /dev/null +++ b/vsellier/5mntalks/kube101/d7-1 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl apply -f d7-1.yaml" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/d7-1.yaml b/vsellier/5mntalks/kube101/d7-1.yaml new file mode 100644 index 0000000..9837af1 --- /dev/null +++ b/vsellier/5mntalks/kube101/d7-1.yaml @@ -0,0 +1,87 @@ +# --- +# apiVersion: v1 +# kind: PersistentVolume +# metadata: +# name: d3-pv +# spec: +# capacity: +# storage: 10Gi +# volumeMode: Filesystem +# accessModes: +# - ReadWriteOnce +# persistentVolumeReclaimPolicy: Delete +# storageClassName: d3-pv +# local: +# path: /srv/d3 +# nodeAffinity: +# required: +# nodeSelectorTerms: +# - matchExpressions: +# # TODO adapt for your needs +# - key: kubernetes.io/os +# operator: In +# values: +# - vs3-k3s-1 +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: d3-pvc +spec: + accessModes: + - ReadWriteMany + storageClassName: longhorn + resources: + requests: + storage: 4Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: d3 +spec: + selector: + matchLabels: + app: d3 + replicas: 5 + strategy: + rollingUpdate: + maxSurge: 3 + template: + metadata: + labels: + app: d3 + spec: + containers: + - name: d3 + image: registry.demo/demo:v2 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "500m" + ports: + - containerPort: 5000 + readinessProbe: + httpGet: + port: 5000 + periodSeconds: 2 + failureThreshold: 1 + startupProbe: + httpGet: + port: 5000 + periodSeconds: 2 + successThreshold: 1 + livenessProbe: + httpGet: + port: 5000 + periodSeconds: 2 + failureThreshold: 1 + successThreshold: 1 + volumeMounts: + - name: pvc + mountPath: /data + volumes: + - name: pvc + persistentVolumeClaim: + claimName: d3-pvc diff --git a/vsellier/5mntalks/kube101/d7-2 b/vsellier/5mntalks/kube101/d7-2 new file mode 100755 index 0000000..cad0be5 --- /dev/null +++ b/vsellier/5mntalks/kube101/d7-2 @@ -0,0 +1,7 @@ +#!/bin/bash + +cmd="kubectl scale --replicas=5 deployment d3" + +echo "$cmd" +read +eval $cmd diff --git a/vsellier/5mntalks/kube101/demo-flask/Dockerfile b/vsellier/5mntalks/kube101/demo-flask/Dockerfile new file mode 100644 index 0000000..25f4068 --- /dev/null +++ b/vsellier/5mntalks/kube101/demo-flask/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.7 + +RUN pip install flask + +RUN mkdir /app /data +VOLUME /data + +ENTRYPOINT ["flask"] +CMD ["run", "--host", "0.0.0.0"] + +WORKDIR /app +ARG VERSION=v0 +ENV FLASK_APP=demo-${VERSION}.py +ENV VERSION=${VERSION} +COPY demo-${VERSION}.py /app diff --git a/vsellier/5mntalks/kube101/demo-flask/build.sh b/vsellier/5mntalks/kube101/demo-flask/build.sh new file mode 100755 index 0000000..0564714 --- /dev/null +++ b/vsellier/5mntalks/kube101/demo-flask/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for version in {0..2}; do + docker build --build-arg VERSION="v${version}" -t "registry.demo/demo:v${version}" . + docker push "registry.demo/demo:v${version}" +done diff --git a/vsellier/5mntalks/kube101/demo-flask/demo-v0.py b/vsellier/5mntalks/kube101/demo-flask/demo-v0.py new file mode 100644 index 0000000..077fd6d --- /dev/null +++ b/vsellier/5mntalks/kube101/demo-flask/demo-v0.py @@ -0,0 +1,13 @@ +from flask import Flask +import os +import platform + +app = Flask(__name__) + +@app.route('/') +def hello_world(): + return f"Hello!\nversion:{os.environ['VERSION']}\nhostname:{platform.node()}\n" + +@app.route('/count') +def count(): + return f"version:{os.environ['VERSION']}\nhostname:{platform.node()}\nNot yet implemented\n" diff --git a/vsellier/5mntalks/kube101/demo-flask/demo-v1.py b/vsellier/5mntalks/kube101/demo-flask/demo-v1.py new file mode 100644 index 0000000..60ffd93 --- /dev/null +++ b/vsellier/5mntalks/kube101/demo-flask/demo-v1.py @@ -0,0 +1,23 @@ +from flask import Flask +import os +import platform +app = Flask(__name__) + +@app.route('/') +def hello_world(): + return f"Hello!\nversion:{os.environ['VERSION']}\nhostname:{platform.node()}\n" + +@app.route('/count') +def count(): + try: + with open("/data/count.txt", "r") as f: + count = f.read() + except: + count = 0 + + calls = count + 1 + + with open("/data/count.txt", "w") as f: + f.write(str(calls)) + + return f"version:{os.environ['VERSION']}\nhostname:{platform.node()}: count={calls}" diff --git a/vsellier/5mntalks/kube101/demo-flask/demo-v2.py b/vsellier/5mntalks/kube101/demo-flask/demo-v2.py new file mode 100644 index 0000000..0275c0d --- /dev/null +++ b/vsellier/5mntalks/kube101/demo-flask/demo-v2.py @@ -0,0 +1,23 @@ +from flask import Flask +import os +import platform +app = Flask(__name__) + +@app.route('/') +def hello_world(): + return f"Hello!\nversion:{os.environ['VERSION']}\nhostname:{platform.node()}\n" + +@app.route('/count') +def count(): + try: + with open("/data/count.txt", "r") as f: + count = f.read() + except: + count = 0 + + calls = int(count) + 1 + + with open("/data/count.txt", "w") as f: + f.write(str(calls)) + + return f"version:{os.environ['VERSION']}\nhostname:{platform.node()}: count={calls}" diff --git a/vsellier/5mntalks/kube101/longhorn/ingress.yaml b/vsellier/5mntalks/kube101/longhorn/ingress.yaml new file mode 100644 index 0000000..69a38f8 --- /dev/null +++ b/vsellier/5mntalks/kube101/longhorn/ingress.yaml @@ -0,0 +1,19 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: longhorn-frontend + labels: + name: longhorn-frontend +spec: + rules: + - host: longhorn.demo + http: + paths: + - pathType: Prefix + path: "/" + backend: + service: + name: longhorn-frontend + port: + number: 80 diff --git a/vsellier/5mntalks/kube101/longhorn/install.sh b/vsellier/5mntalks/kube101/longhorn/install.sh new file mode 100755 index 0000000..86cd2ac --- /dev/null +++ b/vsellier/5mntalks/kube101/longhorn/install.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +helm repo add longhorn https://charts.longhorn.io +helm repo update +helm install -f values.yaml longhorn/longhorn --name longhorn --namespace longhorn-system diff --git a/vsellier/5mntalks/kube101/longhorn/values.yaml b/vsellier/5mntalks/kube101/longhorn/values.yaml new file mode 100644 index 0000000..c059302 --- /dev/null +++ b/vsellier/5mntalks/kube101/longhorn/values.yaml @@ -0,0 +1,2 @@ +persistence: + reclaimPolicy: Retain diff --git a/vsellier/5mntalks/kube101/registry/00-registry.yml b/vsellier/5mntalks/kube101/registry/00-registry.yml new file mode 100644 index 0000000..fbe65bf --- /dev/null +++ b/vsellier/5mntalks/kube101/registry/00-registry.yml @@ -0,0 +1,129 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: registry +spec: + selector: + app: registry + ports: + - protocol: TCP + port: 80 + targetPort: 5000 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: registry +spec: + rules: + - host: registry.demo + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: registry + port: + number: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: registry-deployment + labels: + app: registry +spec: + replicas: 1 + selector: + matchLabels: + app: registry + template: + metadata: + labels: + app: registry + spec: + containers: + - name: registry + image: registry:latest + resources: + {} + env: + - name: REGISTRY_STORAGE_DELETE_ENABLED + value: "true" + ports: + - containerPort: 5000 +--- +apiVersion: v1 +kind: Service +metadata: + name: registry-ui +spec: + type: ClusterIP + selector: + app: registry-ui + ports: + - port: 80 + targetPort: 80 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: registry-ui +spec: + rules: + - host: registry-ui.demo + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: registry-ui + port: + number: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: registry-ui + labels: + app: registry-ui +spec: + replicas: 1 + selector: + matchLabels: + app: registry-ui + template: + metadata: + labels: + app: registry-ui + spec: + containers: + - name: registry-ui + image: "docker.io/joxit/docker-registry-ui:static" + imagePullPolicy: Always + env: + - name: REGISTRY_TITLE + value: "Docker registry UI" + - name: DELETE_IMAGES + value: "true" + - name: REGISTRY_URL + value: "http://registry" + - name: PULL_URL + value: "registry.demo" + ports: + - name: http + containerPort: 80 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {} diff --git a/vsellier/5mntalks/kube101/watch b/vsellier/5mntalks/kube101/watch new file mode 100755 index 0000000..c29d7a9 --- /dev/null +++ b/vsellier/5mntalks/kube101/watch @@ -0,0 +1,3 @@ +#!/bin/bash + +watch "echo Nodes; kubectl get nodes; echo; echo Deployments; kubectl get deployments -o wide; echo; echo Services; kubectl get services; echo; echo Ingress; kubectl get ingress -o wide ; echo; echo Pods; kubectl get pods -o wide; echo; echo PV; kubectl get pv -o wide; echo; echo PVC; kubectl get pvc -o wide"