Читать книгу K8s Applications mit MicroK8S auf Raspberry PI - Alfred Sabitzer - Страница 14

Оглавление

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="/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.

K8s Applications mit MicroK8S auf Raspberry PI

Подняться наверх