2021-10-15
Ja förutom grunderna som
– Docker images i botten (ja vilka containers som helst i stort sett)
– infrastructure by code (hela setupen definieras i YAML-filer som källkodshanteras = Enkelt att byta leverantör )
– fullständig automatisk hantering med scaling (köra på en eller flera )
så är en cool sak som ofta förbises av de som inte förstår Docker är hur du kan köra batchjobb etc i separata isolerade containers (eftersom Docker-containers kan startas upp på millisekunder – jämfört med en virtuell maskin som tar minuter!):. Dvs: istället för att ha en batchmaskin som ni kladdar ner med diverse tredjepartsprodukter, jag tänker på S3 klient, Python, osv osv så skapar du specialsydda batchcontainers – per unik uppsättning, och i fallet med Kubernetes så ingår själva cronjob scheduleringen (schemalagda jobb).
Containers är det “nya batch-filer, ps1+sh osv osv” och parametrar skickar du genom environment-variabler istf kommandoradsparametrar.
Ok…lugn och fin: massa kod och YAML på g. Men det finns ett UI, jag visar det längst ner!
1. Jag har skapat en Docker image. Den utgår från Alpine Linux och jag konfar den med både s3cmd (Python) och SQL Server klient för Linux (dvs sqlcmd)
FROM alpine:3.11
RUN apk update
RUN apk add python py-pip py-setuptools git ca-certificates
RUN pip install python-dateutil
RUN git clone https://github.com/s3tools/s3cmd.git /opt/s3cmd
RUN ln -s /opt/s3cmd/s3cmd /usr/bin/s3cmd
WORKDIR /opt
ADD ./files/mine /opt/s3cfg
ADD ./files/main.sh /opt/main.sh
ADD ./files/sqlserver.sh /opt/sqlserver.sh
# Main entrypoint script
RUN chmod 777 /opt/main.sh
RUN chmod 777 /opt/sqlserver.sh
# Folders for s3cmd optionations
RUN mkdir /opt/src
RUN mkdir /opt/dest
ARG MSSQL_VERSION=17.5.2.1-1
ENV MSSQL_VERSION=${MSSQL_VERSION}
RUN apk add --no-cache curl gnupg --virtual .build-dependencies -- && \
# Adding custom MS repository for mssql-tools and msodbcsql
curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_${MSSQL_VERSION}_amd64.apk && \
curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_${MSSQL_VERSION}_amd64.apk && \
# Verifying signature
curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_${MSSQL_VERSION}_amd64.sig && \
curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_${MSSQL_VERSION}_amd64.sig && \
# Importing gpg key
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --import - && \
gpg --verify msodbcsql17_${MSSQL_VERSION}_amd64.sig msodbcsql17_${MSSQL_VERSION}_amd64.apk && \
gpg --verify mssql-tools_${MSSQL_VERSION}_amd64.sig mssql-tools_${MSSQL_VERSION}_amd64.apk && \
# Installing packages
echo y | apk add --allow-untrusted msodbcsql17_${MSSQL_VERSION}_amd64.apk mssql-tools_${MSSQL_VERSION}_amd64.apk && \
# Deleting packages
apk del .build-dependencies && rm -f msodbcsql*.sig mssql-tools*.apk
# Adding SQL Server tools to $PATH
ENV PATH=$PATH:/opt/mssql-tools/bin
RUN apk add --no-cache curl
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
RUN install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
WORKDIR /
CMD ["/opt/sqlserver.sh"]
2. I sqlserver.sh gör jag bla
FILENAME=$(date "+%Y-%m-%d-%H-%M-%S")
sqlcmd -S ${sql_host} -U ${sql_user} -P ${sql_password} -Q "BACKUP DATABASE ${sql_database} TO DISK='/var/opt/mssql/data/${sql_database}$FILENAME'"
POD=$(kubectl get pods --selector=app=mssql -o jsonpath='{.items[0].metadata.name}')
kubectl cp default/$POD:/var/opt/mssql/data/${sql_database}$FILENAME /opt/src/${sql_database}$FILENAME
kubectl exec $POD -- rm /var/opt/mssql/data/${sql_database}$FILENAME
Dvs kör en backup på min Sql Server (allt inom ${}skickar jag ju som environmentvariabel)
Jag kopierar sedan ner backupfilen till denna container (/opt/src) – och skönt att slippa konfa NFS eller whatever för delade diskar, jag utnyttjar det faktum att både containarna tillhör samma Kubernetes-kluster = kubectl kan flytta data.
3. Sen är det bara att S3 synka /opt/src med min S3 bucket vars configjag styr med environment-variabler också. Den koden visar jag dock inte här men googla S3CMD
4. Sen skapar vi ett Cronjob
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: sqlserverbackuptestapp
spec:
schedule: "1 1 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: sqlserverbackuptestapp
image: blabla/sqlkube
imagePullPolicy: Always
env:
- name: sql_database
value: "TestAppProd"
- name: sql_host
value: "mssql101"
- name: sql_user
value: "sa"
- name: sql_password
value: ""
- name: aws_key
value: "00234121123132312"
- name: aws_secret
value: "2243423243"
- name: s3_host_base
value: "s3.eu-central-003.backblazeb2.com"
- name: DEST_S3
value: s3://nucketname
- name: cmd
value: "sync-local-to-s3"
imagePullSecrets:
- name: regcredaspcode
restartPolicy: OnFailure
5. Sen skapar vi kopior av Cronjobbet för alla databaser vi vill backa
Ok. Jobbigt?
6. Jamen lite UI då. Med Kubernetes Dashboard kan man administrera sitt kluster grafiskt – och här har vi våra jobb och kan kontrollera status, loggar etc etc


Så CRON-jobb i Kubernetes är ganska enkelt!