Kitabı oku: «K8s Applications mit MicroK8S auf Raspberry PI», sayfa 4

Yazı tipi:

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

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
515 s. 126 illüstrasyon
ISBN:
9783742770134
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi:
Metin
Ortalama puan 4, 1 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre
Metin
Ortalama puan 0, 0 oylamaya göre