Читать книгу 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.