Kitabı oku: «K8s Applications mit MicroK8S auf Raspberry PI», sayfa 4
-rw-r--r-- 0/0 482 2021-10-15 21:22 1a41da37655e1ae130db0ff268801f26989f408ad4e24fee81b18252883fe835/json
-rw-r--r-- 0/0 2560 2021-10-15 21:22 1a41da37655e1ae130db0ff268801f26989f408ad4e24fee81b18252883fe835/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 278bc14dbdd9bd52e524b98375e76f5b0f975f02167b6a7e8168184e577a8d17/
-rw-r--r-- 0/0 3 2021-10-15 21:22 278bc14dbdd9bd52e524b98375e76f5b0f975f02167b6a7e8168184e577a8d17/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 278bc14dbdd9bd52e524b98375e76f5b0f975f02167b6a7e8168184e577a8d17/json
-rw-r--r-- 0/0 5632 2021-10-15 21:22 278bc14dbdd9bd52e524b98375e76f5b0f975f02167b6a7e8168184e577a8d17/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 37df72a20bd40f12a164a419626ffb20b4554c96983ec36b78024136e65f15c2/
-rw-r--r-- 0/0 3 2021-10-15 21:22 37df72a20bd40f12a164a419626ffb20b4554c96983ec36b78024136e65f15c2/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 37df72a20bd40f12a164a419626ffb20b4554c96983ec36b78024136e65f15c2/json
-rw-r--r-- 0/0 2560 2021-10-15 21:22 37df72a20bd40f12a164a419626ffb20b4554c96983ec36b78024136e65f15c2/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 55a816cb614fc0754c9af49269934861de9251688789bc4a3e9f304ac1059e10/
-rw-r--r-- 0/0 3 2021-10-15 21:22 55a816cb614fc0754c9af49269934861de9251688789bc4a3e9f304ac1059e10/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 55a816cb614fc0754c9af49269934861de9251688789bc4a3e9f304ac1059e10/json
-rw-r--r-- 0/0 3584 2021-10-15 21:22 55a816cb614fc0754c9af49269934861de9251688789bc4a3e9f304ac1059e10/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 5fe6d80a697427a6b315445103e12f8e5e14a6f9f071e119d9da5aa7787dedf0/
-rw-r--r-- 0/0 3 2021-10-15 21:22 5fe6d80a697427a6b315445103e12f8e5e14a6f9f071e119d9da5aa7787dedf0/VERSION
-rw-r--r-- 0/0 1432 2021-10-15 21:22 5fe6d80a697427a6b315445103e12f8e5e14a6f9f071e119d9da5aa7787dedf0/json
-rw-r--r-- 0/0 10244608 2021-10-15 21:22 5fe6d80a697427a6b315445103e12f8e5e14a6f9f071e119d9da5aa7787dedf0/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 678b476f25ed3f1e67caefc50b99dba99e907d2b692e7198f4f7982b1781dd97/
-rw-r--r-- 0/0 3 2021-10-15 21:22 678b476f25ed3f1e67caefc50b99dba99e907d2b692e7198f4f7982b1781dd97/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 678b476f25ed3f1e67caefc50b99dba99e907d2b692e7198f4f7982b1781dd97/json
-rw-r--r-- 0/0 297840128 2021-10-15 21:22 678b476f25ed3f1e67caefc50b99dba99e907d2b692e7198f4f7982b1781dd97/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 916863cb53dae4e13619f82e13ddeded5a2a2f552e5ac0fad747eff6cafe57ea/
-rw-r--r-- 0/0 3 2021-10-15 21:22 916863cb53dae4e13619f82e13ddeded5a2a2f552e5ac0fad747eff6cafe57ea/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 916863cb53dae4e13619f82e13ddeded5a2a2f552e5ac0fad747eff6cafe57ea/json
-rw-r--r-- 0/0 2048 2021-10-15 21:22 916863cb53dae4e13619f82e13ddeded5a2a2f552e5ac0fad747eff6cafe57ea/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 951da7c93bcb5858e3370883aa7ebb5bc7e54ad5a51a9124350c4bf638dfce39/
-rw-r--r-- 0/0 3 2021-10-15 21:22 951da7c93bcb5858e3370883aa7ebb5bc7e54ad5a51a9124350c4bf638dfce39/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 951da7c93bcb5858e3370883aa7ebb5bc7e54ad5a51a9124350c4bf638dfce39/json
-rw-r--r-- 0/0 3584 2021-10-15 21:22 951da7c93bcb5858e3370883aa7ebb5bc7e54ad5a51a9124350c4bf638dfce39/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 c738b6de5b0a35e613204439d94e3142a49ed7c77568b1372a2ac8e44add5431/
-rw-r--r-- 0/0 3 2021-10-15 21:22 c738b6de5b0a35e613204439d94e3142a49ed7c77568b1372a2ac8e44add5431/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 c738b6de5b0a35e613204439d94e3142a49ed7c77568b1372a2ac8e44add5431/json
-rw-r--r-- 0/0 759808 2021-10-15 21:22 c738b6de5b0a35e613204439d94e3142a49ed7c77568b1372a2ac8e44add5431/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 d0cabd374001156bcc1eb54fb096bcb80aa5f94e14ed6c73069b64e31f554deb/
-rw-r--r-- 0/0 3 2021-10-15 21:22 d0cabd374001156bcc1eb54fb096bcb80aa5f94e14ed6c73069b64e31f554deb/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 d0cabd374001156bcc1eb54fb096bcb80aa5f94e14ed6c73069b64e31f554deb/json
-rw-r--r-- 0/0 11713024 2021-10-15 21:22 d0cabd374001156bcc1eb54fb096bcb80aa5f94e14ed6c73069b64e31f554deb/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 e3c9af4387b692800410b9c839fd7964352a56504f884d7975fff36dc077c8c4/
-rw-r--r-- 0/0 3 2021-10-15 21:22 e3c9af4387b692800410b9c839fd7964352a56504f884d7975fff36dc077c8c4/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 e3c9af4387b692800410b9c839fd7964352a56504f884d7975fff36dc077c8c4/json
-rw-r--r-- 0/0 6656 2021-10-15 21:22 e3c9af4387b692800410b9c839fd7964352a56504f884d7975fff36dc077c8c4/layer.tar
drwxr-xr-x 0/0 0 2021-10-15 21:22 eb528dd90d9b2bc0ad36512a3ce210982ca2b2100be249c54335bb4c86b6c520/
-rw-r--r-- 0/0 3 2021-10-15 21:22 eb528dd90d9b2bc0ad36512a3ce210982ca2b2100be249c54335bb4c86b6c520/VERSION
-rw-r--r-- 0/0 482 2021-10-15 21:22 eb528dd90d9b2bc0ad36512a3ce210982ca2b2100be249c54335bb4c86b6c520/json
-rw-r--r-- 0/0 2560 2021-10-15 21:22 eb528dd90d9b2bc0ad36512a3ce210982ca2b2100be249c54335bb4c86b6c520/layer.tar
-rw-r--r-- 0/0 1151 1970-01-01 01:00 manifest.json
-rw-r--r-- 0/0 114 1970-01-01 01:00 repositories
alfred@monitoring:~/GetInfo$ ll *.tar
-rw-rw-r-- 1 alfred alfred 326244864 Oct 15 21:27 getinfo.tar
alfred@monitoring:~/GetInfo$
Wir können aber auch das Dockerfile selbst exportieren.
alfred@monitoring:~/GetInfo$ docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
acdf3516a1ce docker.registry:5000/getinfo:20211015 "/GetInfo" 10 minutes ago Exited (2) 5 minutes ago funny_keller
alfred@monitoring:~/GetInfo$ docker export acdf3516a1ce > getinfo.tar
alfred@monitoring:~/GetInfo$
alfred@monitoring:~/GetInfo$ ll -h *.tar
-rw-rw-r-- 1 alfred alfred 311M Oct 15 21:32 getinfo.tar
alfred@monitoring:~/GetInfo$
alfred@monitoring:~/GetInfo$ tar -tvf getinfo.tar
Mit diesen Befehlen kann man überprüfen was alles im Container drinnenn ist (und das ist eine ganze Menge).
Nun pushen wir den Container in das remote-Repository. Es werden natürlich alle Layer gepushed (in dem Falle gab es die darunterliegenden Layer noch nicht).
alfred@monitoring:~/GetInfo$ docker push docker.registry:5000/getinfo:20211015
The push refers to repository [docker.registry:5000/getinfo]
cae68116d3ec: Pushed
dd68a1e5bd54: Pushed
00e2dc9bf745: Pushed
5a8d0b1f55c0: Pushed
8f352be1ccfe: Pushed
729e17fedb70: Pushed
08ae3e8fdb37: Pushed
6fe1ba639418: Pushed
fa0d2ce7179e: Pushed
092886e29cb5: Pushed
c8d42fc353a6: Pushed
6a91c97933c9: Pushed
ee420dfed78a: Pushed
20211015: digest: sha256:aa82ba777936d4cec354c0b9c5ece353751a96c9717375cfd58d3ed2beea5cf4 size: 3030
alfred@monitoring:~/GetInfo$
Kurze Kontrolle, ob der Container wirklich im Remote Repository gelandet ist.
alfred@monitoring:~/GetInfo$ curl docker.registry:5000/v2/_catalog
{"repositories":["getinfo","hello-world"]}
alfred@monitoring:~/GetInfo$ curl docker.registry:5000/v2/getinfo/tags/list
{"name":"getinfo","tags":["20211015"]}
alfred@monitoring:~/GetInfo$
Abbildung 22: Longhorn Plattengröße
Auch in der Longhorn-Anzeige kann man schön sehen, dass dieses Volume nicht mehr leer ist, und jetzt bereits ca. 1GB Platz braucht.
Nun erzeugen wir ein yaml-File.
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: getinfo
#namespace: default
spec:
selector:
matchLabels:
app: getinfo
replicas: 1
template:
metadata:
labels:
app: getinfo
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: getinfo
image: docker.registry:5000/getinfo:20211015
# resource limits
resources:
requests:
memory: "24Mi"
cpu: "500m" # half vcpu
limits:
memory: "64Mi"
cpu: "1000m" # one vcpu
env:
# currently no env vars used for this container
- name: FOO
value: bar
# check for lifetime liveness, restarts if dead
livenessProbe:
exec:
command:
- ls
initialDelaySeconds: 5
periodSeconds: 10
# check for initial readyness
readinessProbe:
exec:
command:
- ls
initialDelaySeconds: 3
periodSeconds: 3
# pod bekommt diesselbe Zeitzone wie der darunterliegende Node
volumeMounts:
- name: tz-local
mountPath: /etc/localtime
volumes:
- name: tz-local
hostPath: # abhängig vom darunterliegenden OS. Das hier ist linux.
path: /etc/localtime
restartPolicy: Always
dnsPolicy: ClusterFirst
---
apiVersion: v1
kind: Service
metadata:
name: getinfo-service
#namespace: default
labels:
app: getinfo
spec:
ports:
# port=available to other containers
- port: 8080
name: hello
# targetPort=exposed from inside container
targetPort: 8080
protocol: TCP
selector:
app: getinfo
---
Dieses yaml wenden wir nun im Cluster an.
alfred@pc1:~$ k apply -f getinfo.yaml
deployment.apps/getinfo created
service/getinfo-service created
alfred@pc1:~$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/webserver-slainte-67494d5d7b-hj99r 1/1 Running 22 67d
pod/getinfo-6c84cff999-mtf5v 1/1 Running 0 89s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 67d
service/webserver-slainte ClusterIP 10.152.183.125 <none> 443/TCP 67d
service/getinfo-service ClusterIP 10.152.183.43 <none> 8080/TCP 6m12s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver-slainte 1/1 1 1 67d
deployment.apps/getinfo 1/1 1 1 6m12s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-slainte-67494d5d7b 1 1 1 67d
replicaset.apps/getinfo-6c84cff999 1 1 1 89s
replicaset.apps/getinfo-6659cf7655 0 0 0 6m12s
Die Anzeige im Dashboard zeigt uns auch einen gut laufenden Pod.
Abbildung 23: GetInfo Pod im Dashboard
Nun schauen wir, was der Pod zurückliefert:
alfred@pc1:~$ curl http://10.152.183.43:8080/view/hello
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title></title> <meta name="generator" content="LibreOffice 7.1.6.2 (Linux)"/> <meta name="author" content="Alfred Sabitzer"/> <meta name="created" content="2021-10-07T16:33:50.696105947"/> <meta name="changedby" content="Alfred Sabitzer"/> <meta name="changed" content="2021-10-07T16:36:08.816466992"/> <style type="text/css"> @page { size: 21cm 29.7cm; margin: 2cm } p { margin-bottom: 0.25cm; line-height: 115%; background: transparent } td p { orphans: 0; widows: 0; background: transparent } </style></head><body lang="de-AT" link="#000080" vlink="#800000" dir="ltr"><p style="margin-bottom: 0cm; line-height: 100%"><p style="margin-bottom: 0cm; line-height: 100%"><br/></p><table width="100%" cellpadding="4" cellspacing="0"> <col width="64*"/> <col width="64*"/> <col width="64*"/> <col width="64*"/> <tr valign="top"> <td width="25%" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> OSENVIRONMENT</p> </td> <td width="25%" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> DISKUSAGE</p> </td> <td width="25%" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> HOSTINFO</p></td> <td width="25%" style="border: 1px solid #000000; padding: 0.1cm"><p> MEMINFO</p> </td> </tr> <tr valign="top"> <td width="25%" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> PATH=>/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin<br>HOSTNAME=>getinfo-6c84cff999-mtf5v<br>GOLANG_VERSION=>1.16.9<br>GOPATH=>/go<br>FOO=>bar<br>WEBSERVER_SLAINTE_PORT_443_TCP=>tcp://10.152.183.125:443<br>GETINFO_SERVICE_SERVICE_PORT=>8080<br>GETINFO_SERVICE_PORT=>tcp://10.152.183.43:8080<br>GETINFO_SERVICE_PORT_8080_TCP=>tcp://10.152.183.43:8080<br>GETINFO_SERVICE_PORT_8080_TCP_PROTO=>tcp<br>GETINFO_SERVICE_PORT_8080_TCP_ADDR=>10.152.183.43<br>WEBSERVER_SLAINTE_SERVICE_PORT=>443<br>WEBSERVER_SLAINTE_PORT=>tcp://10.152.183.125:443<br>KUBERNETES_SERVICE_HOST=>10.152.183.1<br>KUBERNETES_PORT=>tcp://10.152.183.1:443<br>KUBERNETES_PORT_443_TCP=>tcp://10.152.183.1:443<br>KUBERNETES_PORT_443_TCP_PORT=>443<br>WEBSERVER_SLAINTE_SERVICE_HOST=>10.152.183.125<br>WEBSERVER_SLAINTE_SERVICE_PORT_HTTPS=>443<br>WEBSERVER_SLAINTE_PORT_443_TCP_PROTO=>tcp<br>KUBERNETES_SERVICE_PORT=>443<br>KUBERNETES_PORT_443_TCP_PROTO=>tcp<br>GETINFO_SERVICE_SERVICE_PORT_HELLO=>8080<br>GETINFO_SERVICE_PORT_8080_TCP_PORT=>8080<br>WEBSERVER_SLAINTE_PORT_443_TCP_PORT=>443<br>WEBSERVER_SLAINTE_PORT_443_TCP_ADDR=>10.152.183.125<br>KUBERNETES_SERVICE_PORT_HTTPS=>443<br>KUBERNETES_PORT_443_TCP_ADDR=>10.152.183.1<br>GETINFO_SERVICE_SERVICE_HOST=>10.152.183.43<br>HOME=>/root<br> </p> </td><td width="25%" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> Pfad:/<br>FSTYPE:<br>Total disk space: 58.3 GB<br>Free disk space: 46.1 GB<br>Used disk space: 9.7 GB<br>Used GB Prozent:17.4<br>Used Inodes:176202<br>Used Inodes Prozent:4.7 </p> </td> <td width="25%" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"><p> Hostname: getinfo-6c84cff999-mtf5v<br>OS: linux<br>Platform: alpine<br>Host ID(uuid): c1e70216-8eeb-4ca0-ac87-cf090dcc2c1f<br>Uptime (sec): 5085<br>Number of processes running: 1</p> </td> <td width="25%" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"><p> OS : linux<br>Total memory: 7.6 GB<br>Free memory: 3.1 GB<br>Used memory: 2.0 GB<br>Percentage used memory: 26.48</p> </td> </tr> </table><p style="margin-bottom: 0cm; line-height: 100%"><br/></p><p style="margin-bottom: 0cm; line-height: 100%">Es ist <span style="background: #c0c0c0"><sdfield type=DATETIME sdval="44476,6908896088" sdnum="3079;3079;T. MMMM JJJJ">2021-10-15 20:00:26 Friday</sdf
alfred@pc1:~$
Sieht ganz gut aus:) Auch der Logoutput ist interessant:
alfred@pc1:~$ kubectl logs getinfo-6c84cff999-mtf5v
2021/10/15 19:58:40 Main Started
2021/10/15 20:00:26 hello.html
alfred@pc1:~$
Um den Output richtig zu sehen, ändere ich zu Testzwecken den Typ des Services auf einen NodePort um den Service von außen erreichen zu können.
alfred@pc1:~$ kubectl edit service getinfo-service
service/getinfo-service edited
alfred@pc1:~$
alfred@pc1:~$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 67d
webserver-slainte ClusterIP 10.152.183.125 <none> 443/TCP 67d
getinfo-service NodePort 10.152.183.43 <none> 8080:32304/TCP 19m
alfred@pc1:~$
Der Output aus dem inneren des Pods sieht am Browser auch gut aus.
Abbildung 24: GetInfo Anzeige aus dem Pod
Somit haben wir einen richtigen Service im Kubernetes-Cluster laufen. Wir kontrollieren den Pod noch von innen.
alfred@pc1:~$ kubectl exec getinfo-6c84cff999-mtf5v -it -- /bin/sh
/app # df -h
Filesystem Size Used Available Use% Mounted on
overlay 58.3G 9.8G 46.1G 17% /
tmpfs 64.0M 0 64.0M 0% /dev
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/mmcblk0p2 58.3G 9.8G 46.1G 17% /etc/localtime
/dev/mmcblk0p2 58.3G 9.8G 46.1G 17% /etc/hosts
/dev/mmcblk0p2 58.3G 9.8G 46.1G 17% /dev/termination-log
/dev/mmcblk0p2 58.3G 9.8G 46.1G 17% /etc/hostname
/dev/mmcblk0p2 58.3G 9.8G 46.1G 17% /etc/resolv.conf
shm 64.0M 0 64.0M 0% /dev/shm
tmpfs 3.8G 12.0K 3.8G 0% /run/secrets/kubernetes.io/serviceaccount
tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs 64.0M 0 64.0M 0% /proc/latency_stats
tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
tmpfs 3.8G 0 3.8G 0% /proc/scsi
tmpfs 3.8G 0 3.8G 0% /sys/firmware
/app # date
Sat Oct 16 09:31:11 CEST 2021
/app # top -n 1
Mem: 3902992K used, 4095752K free, 6520K shrd, 180504K buff, 1651716K cached
CPU: 14% usr 11% sys 0% nic 16% idle 52% io 0% irq 4% sirq
Load average: 5.06 3.25 2.38 3/984 1332
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root S 692m 9% 0 0% /GetInfo
1157 0 root S 1720 0% 3 0% /bin/sh
1332 1157 root R 1652 0% 3 0% top -n 1
/app # exit
alfred@pc1:~$ kubectl top pod getinfo-6c84cff999-mtf5v --containers --use-protocol-buffers
POD NAME CPU(cores) MEMORY(bytes)
getinfo-6c84cff999-mtf5v getinfo 8m 5Mi
alfred@pc1:~$
Sieht ganz gut aus.
Automatisierung der Entwicklungsumgebung
Inspiration:
https://elearning.wsldp.com/pcmagazine/install-liteide-on-ubuntu/ https://www.educative.io/blog/kubernetes-deployments-strategies
https://collabnix.github.io/kubetools/
Um die Entwicklung zu standardisieren und zu beschleunigen, legen wir eine gewisse Struktur an.
Unter dem Home-Directory gibt es ein Verzeichnis für die Templates.
.
├── make.sh
├── make_configmap.sh
├── make_configmap_dir.sh
├── make_docker.sh
├── make_yaml.sh
├── registry_delete.sh
├── registry_list.sh
└── svn.sh
Das svn.sh enthält in meinem Fall den Update der notwendigen Skripten für den Build und Deploy.
alfred@monitoring:~/devtemplates$ cat svn.sh
#!/bin/bash
# Auschecken der Sourcen
svn checkout https://monitoring.slainte.at/svn/slainte/trunk/k8s/dev ./
alfred@monitoring:~/devtemplates$
Das make.sh (kommt dann aus dem svn) enthält die notwendigen Befehle für das Bauen und ausrollen.
#!/bin/bash
############################################################################################
# $Date: 2021-12-18 11:38:15 +0100 (Sa, 18. Dez 2021) $
# $Revision: 1618 $
# $Author: alfred $
# $HeadURL: https://monitoring.slainte.at/svn/slainte/trunk/k8s/dev/make.sh $
# $Id: make.sh 1618 2021-12-18 10:38:15Z alfred $
#
# Bauen und deployen
#
############################################################################################
#shopt -o -s errexit #—Terminates the shell script if a command returns an error code.
shopt -o -s xtrace #—Displays each command before it’s executed.
shopt -s expand_aliases # Benutzen von aliasen im Skript
shopt -o -s nounset #-No Variables without definition
namespace="default"
docker_registry="docker.registry:5000"
#equivalent zu source
. ./env.sh
datum=(`date '+%Y%m%d'`)
revision=(`date '+%H%M%S'`)
#revision=$(svn info | grep "Revision" | awk '{print $2}')
tag="${datum}-${revision}"
echo ${tag} > ${image}.tag # Sicherstellen eines stabilen Image-tags
# Aktualisieren der Sourcen
. ${HOME}/.bash_aliases
doDocker=${BASH_ALIASES[mkd]}
doYaml=${BASH_ALIASES[mky]}
${doDocker}
${doYaml}
#
Diese Datei ruft das Shell-Skript zum Bauen des Dockerfiles und zum Erzeugen der Yamls auf. Es erzeugt auch die "Tag-Datei". Dieser Wert wird von den beiden anderen Skripts verwendet (und garantiert einen stabilen Tag, wenn man nur die Yamls neu bauen möchte).
#!/bin/bash
############################################################################################
# $Date: 2021-12-18 11:38:15 +0100 (Sa, 18. Dez 2021) $
# $Revision: 1618 $
# $Author: alfred $
# $HeadURL: https://monitoring.slainte.at/svn/slainte/trunk/k8s/dev/make_docker.sh $
# $Id: make_docker.sh 1618 2021-12-18 10:38:15Z alfred $
#
# Bauen und deployen
#
############################################################################################
#shopt -o -s errexit #—Terminates the shell script if a command returns an error code.
shopt -o -s xtrace #—Displays each command before it’s executed.
shopt -o -s nounset #-No Variables without definition
namespace="default"
docker_registry="docker.registry:5000"
#equivalent zu source
. ./env.sh
datum=(`date '+%Y%m%d'`)
revision=(`date '+%H%M%S'`)
#revision=$(svn info | grep "Revision" | awk '{print $2}')
tag=$(cat ${image}.tag)
# Aktualisieren der Sourcen
svn update
# Docker bauen und in das remote Repo pushen
docker build --no-cache --force-rm . -t ${docker_registry}/${image}:${tag}
docker push ${docker_registry}/${image}:${tag}
docker build --force-rm . -t ${docker_registry}/${image}:latest
docker push ${docker_registry}/${image}:latest
curl ${docker_registry}/v2/${image}/tags/list
#
Diese Datei baut das Docker-Image (einmal mit dem Tag und einmal mit "latest") und pusht das in das Repository.
#!/bin/bash
############################################################################################
# $Date: 2021-12-18 11:38:15 +0100 (Sa, 18. Dez 2021) $
# $Revision: 1618 $
# $Author: alfred $
# $HeadURL: https://monitoring.slainte.at/svn/slainte/trunk/k8s/dev/make_yaml.sh $
# $Id: make_yaml.sh 1618 2021-12-18 10:38:15Z alfred $
#
# Bauen und deployen
#
############################################################################################
#shopt -o -s errexit #—Terminates the shell script if a command returns an error code.
shopt -o -s xtrace #—Displays each command before it’s executed.
shopt -o -s nounset #-No Variables without definition
namespace="default"
docker_registry="docker.registry:5000"
#equivalent zu source
. ./env.sh
datum=(`date '+%Y%m%d'`)
revision=(`date '+%H%M%S'`)
#revision=$(svn info | grep "Revision" | awk '{print $2}')
tag=$(cat ${image}.tag)
# Aktualisieren der Sourcen
svn update
# yaml updaten
for val in ${namespace}; do
echo "Namespace: ${val} "
#Namespacespezifisch
. ../namespace/${val}_env.sh
cat ${image}*.yaml > /tmp/${image}.tmp_1
sed 's/\${image}/'"${image}"'/g' /tmp/${image}.tmp_1 > /tmp/${image}.tmp_2
sed 's/\${tag}/'"${tag}"'/g' /tmp/${image}.tmp_2 > /tmp/${image}.tmp_3
sed 's/\${secretName}/'"${secretName}"'/g' /tmp/${image}.tmp_3 > /tmp/${image}.tmp_4
sed 's/\${host}/'"${host}"'/g' /tmp/${image}.tmp_4 > /tmp/${image}.tmp_5
sed 's/\${namespace}/'"${val}"'/g' /tmp/${image}.tmp_5 > /tmp/${image}.tmp_6
sed 's/\${namespace_comment}/'"${namespace_comment}"'/g' /tmp/${image}.tmp_6 > /tmp/${image}.tmp_7
sed 's/\${cluster_issuer}/'"${cluster_issuer}"'/g' /tmp/${image}.tmp_7 > /tmp/${image}.tmp_8
sed 's/\${docker_registry}/'"${docker_registry}"'/g' /tmp/${image}.tmp_8 > /tmp/${image}.yaml
#
# Nun kann das yaml verwendet werden
#
ansible pc1 -m copy -a "src="http://litres.ru/tmp/${image}.yaml" dest=./yaml/"${image}_${val}.yaml
# Installieren
ansible pc1 -m shell -a "microk8s kubectl apply -f ./yaml/"${image}_${val}.yaml" --namespace="${val}
done
rm -f /tmp/${image}*.*
#
Dieses Skript baut die yamls (und ersetzt alle Variablen) und deployed das in den Kubernetes-Cluster.
Das make_configmap_dir.sh (kommt dann aus dem svn) hilft beim Erstellen einer configmap basierend auf einem vorhandenen Verzeichnis. Das hilft um Tippfehler, Einrückungsfehler udglm. zu vermeiden.
#!/bin/bash
############################################################################################
# $Date: 2021-12-01 22:31:06 +0100 (Mi, 01. Dez 2021) $
# $Revision: 1457 $
# $Author: alfred $
# $HeadURL: https://monitoring.slainte.at/svn/slainte/trunk/k8s/dev/make_configmap_dir.sh $
# $Id: make_configmap_dir.sh 1457 2021-12-01 21:31:06Z alfred $
#
# Erzeugen einer configmap aus einem Verzeichnis
#
############################################################################################
#shopt -o -s errexit #—Terminates the shell script if a command returns an error code.
#shopt -o -s xtrace #—Displays each command before it’s executed.
shopt -o -s nounset #-No Variables without definition
# Überprüfen der Parameter
if [ "${1}" = "" ] ;
then
echo "Usage: $0 Quelle Ziel "
echo "eg: $0 /tmp/myconfigfile /tmp/my_configmap.yaml"
exit -1
fi
if [ "${2}" = "" ] ;
then
echo "Usage: $0 Quelle Ziel "
echo "eg: $0 /tmp/myconfigfile /tmp/my_configmap.yaml"
exit -1
fi
idir=${1}
ofile=${2}
if [ ! -d "${idir}" ]; then # Das ist kein Verzeichnis
echo "Usage: $0 Quelle Ziel "
echo "\"$@\"" "ist kein Verzeichnis"
exit -1
fi
# Schreiben des Ausgabefiles
exec 4> ${ofile}
echo "---">&4
echo "# \${image}-\${tag}" >&4
echo "# generiert mit $0 $1 $2" >&4
echo "apiVersion: v1" >&4
echo "kind: ConfigMap" >&4
echo "metadata:" >&4
string="${ofile}"
#echo "${string}"
prefix="/"
suffix="."
repl=${string%"$prefix"*}
#echo "${repl}"
keyn=${string#"$repl$prefix"}
#echo "${keyn}"
keyn=${keyn%"$suffix"*}
#echo "${keyn}"
keyclean=${keyn//_/$'-'}
outname=${keyclean}
echo " name: ${outname}-cm" >&4
echo " namespace: \${namespace}" >&4
# loop über das Verzeichnis
#echo ${idir}
echo "data: # ${idir}" >&4
FILES="${idir}/*.conf
${idir}/*.ini
${idir}/*.html
${idir}/*.php
${idir}/*.sh
${idir}/*.txt
${idir}/*.json
${idir}/*.webmanifest"
for filename in $FILES ; do
if [ -f "${filename}" ]
then
string="${filename}"
#echo "${string}"
prefix="/"
suffix=""
repl=${string%"$prefix"*}
#echo "${repl}"
keyn=${string#"$repl$prefix"}
#echo "${keyn}"
keyn=${keyn%"$suffix"*}
#echo "${keyn}"
keyclean=${keyn//_/$'-'}
echo " ${keyn}: |" >&4
while read
do
echo " ${REPLY}">&4
done < ${filename}
fi
done
# loop über das Verzeichnis
echo "binaryData: # ${idir}" >&4
FILES="${idir}/*.asc
${idir}/*.rev
${idir}/*.pem
${idir}/*.crt
${idir}/*.key
${idir}/*.png
${idir}/*.jpg
${idir}/authorized_keys
${idir}/*.ico"
for filename in $FILES ; do
if [ -f "${filename}" ]
then
string="${filename}"
#echo "${string}"
prefix="/"
suffix=""
repl=${string%"$prefix"*}
#echo "${repl}"
keyn=${string#"$repl$prefix"}
#echo "${keyn}"
keyn=${keyn%"$suffix"*}
#echo "${keyn}"
keyclean=${keyn//_/$'-'}
cat ${filename} | base64 > /tmp/bd.txt
echo " ${keyn}: |" >&4
while read
do
echo " ${REPLY}">&4
done < /tmp/bd.txt
fi
done
echo "---">&4
exec 4>&-
Damit das überall funktioniert gibt es auch einen Alias in ${home}/.bash_aliases-
#Shortcut um sich tipparbeit zu sparen
alias kubectl='microk8s.kubectl'
alias k='kubectl'
alias kall='microk8s kubectl get all --all-namespaces && microk8s kubectl get ingresses --all-namespaces && microk8s kubectl get endpoints --all-namespaces'
#Dieser alias ist ein Muster, würde alle logs der traefik-pods anzeigen
#Zeigt jetzt die Ingress-Pods
alias klt='(kubectl get pods --all-namespaces) | grep -i nginx-ingress-microk8s-controller | while read a b c; do kubectl logs "$b" -n ingress; done'
alias helm='microk8s.helm3'
alias mk='/home/alfred/devtemplates/make.sh '
alias mkd='/home/alfred/devtemplates/make_docker.sh '
alias mky='/home/alfred/devtemplates/make_yaml.sh '
alias make_configmap='/home/alfred/devtemplates/make_configmap_dir.sh '
Damit das richtig funktioniert, müssen auch die Source-Verzeichnisse eine gewisse Konvention haben. Die Details werden im nächsten Abschnitt anhand des Default-Backend-Serices erklärt.