Rancher Kubernetes mit istio als ingress-controller

19 Mai 2021 Lesezeit: 2 Minuten

Ich hatte vor einiger Zeit das zweifelhafte Vergnügen eine Cloud ohne Cloud zu bauen und da keine automatisch angebundenen LoadBalander vorhanden waren, musste mans ich überlegen wie man das ISITO so zum laufen bekommt, dass es sich anfühlt wie ein echter (Web)Server.

Nun könnte man sage: Hey Jörg, aber XYZ macht einfach einen Ingress und leitet dann nach intern weiter.

Aber ich eben nicht!

Im Grunde wollte ich nur erreichen, dass der olle (web) port nicht auf 12345 rennt (NodePort) sonder ihn einfach auf dem ausgewählten Knoten per Hostort frei gibt.

Ist auch total einfach. Als erstes suchen wir uns feste Server aus, aus denen dann der Istio-Ingress laufen wird

Label

kubectl label nodes ingress1 istiohost=yes
kubectl label nodes ingress2 istiohost=yes
kubectl label nodes ingress3 istiohost=yes

Da wir ISTIO sicherlich mit helm instalieren (in meinem Fall habe ich es via Rancher eingerichtet), können wir die Values oder eben die templates so anpassen, dass wir das Istio-Ingress-gateway so anpassen, dass es unter dem Pfad spec.template.spec.containers.[name:istio-proxy].ports einfach

...
- containerPort: 8443
    hostPort: 443
    protocol: TCP
...

nutzt.

Tada - Istio nativ auf Port 443.


Debian Preseed - ein zweifelhaftes Vergnügen

24 Jan 2021 Lesezeit: 6 Minuten

Vielleicht bin ich ja verwöhnt. Oder ich werde alt. Jedoch hatte ich zuletzt die Gelegenheit eine Debian Linux Installation teilweise zu automatisieren. Warum ist schnell erklärt: man möchte sich einfach zum einen gewisse Arbeitsschritte sparen (sollte eine Pflicht bei mehreren Serverinstallationen sein) und zum anderen möchte man Fehlerquellen ausschließen (Beispielsweise Namenskonventionen oder ähnliches).

Nun schreiben wir das Jahr 2021 und alle reden von Cloud und Serverless und so. Doch in kleinen Dörfern gibt es noch immer Menschen die den Kram dahinter installieren und administrieren. Zu diesen Menschen gehöre ich. Und ich mag es nicht, sich wiedehrolende Aufgaben von Hand zu erledigen.

Wenn man sich mit einem Debian Linux herumschlagen muss, dann greift man entweder zu FAI - was grundsätzlich ein interessantes Projekt zu sein scheint. Oder aber man baut sich im einfachsten Fall eine Preseed.cfg Datei, welche die Antworten für den Debian-Installer enthält.

Dabei muss man sich zu allererst klar machen: jede Frage, die nicht beantwortet wird, wird durch den Installer gestellt. Im Klartext bedeutet das: wenn ich zum Beispiel nach dem Hostnamen gefragt werden will, darf ich ihn nicht definieren - bzw. muss die Domain weg lassen und solche Scherze.

Das kann ganz schön nervig sein. Letztendlich erhält man aber eine Datei, die man entweder über einen Webserver bereitstellen kann , oder man remastert sich das ISO. Ich habe mich für letzteres entschieden und zeige hier die Schritte auf.

Zunächst einmal machen wir uns ein Verzeichnis, in welchem wir alle Daten packen werden, die wir für unser ISO remaster brauchen:

mkdir my-fantastic-new-debian-iso
cd ./my-fantastic-new-debian-iso

Dann sollten wir uns auch gleich zu Beginn die Debian ISO besorgen die wir remastern wollen.

wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.7.0-amd64-netinst.iso -O debian-10-amd64-netinst.iso

Nun schreiben wir uns eine Preseed.cfg Datei, die uns die meisten Dinge bei der Installation abnimmt. Was wir noch übrig lassen ist die Servernamen-, Domain- und Netzwerkkonfiguration

cat << EOF > preseed.cfg
# set installer language
d-i debian-installer/language string de
# set installer country
d-i debian-installer/country string DE
# set installer locale
d-i debian-installer/locale string de_DE.UTF-8
# set installer keyboard
d-i keyboard-configuration/xkb-keymap select de

# configure network on a server - yes I think it is a good idea
d-i netcfg/enable boolean true

# if not, I want to choose the networkcard to configure
#d-i netcfg/choose_interface select auto

# if DHCP is available - just ignore it
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/confirm_static boolean true

# just for lazyness
d-i netcfg/hostname string this-is-my-servername

# just use working firmware if exists
d-i hw-detect/load_firmware boolean true

# set the debian mirror for stuff
d-i mirror/country string manual
d-i mirror/http/hostname string ftp2.de.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i mirror/suite string stable

# set the initial root password... use some secure things like 1234 or so....
d-i passwd/root-password password yes-it-is-me-root
d-i passwd/root-password-again password yes-it-is-me-root

# I do not want to create a user... working with root is fine (joke)
d-i passwd/make-user boolean false

# set timezone 
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Berlin

# install puppet repo, becaus I like the way it work
d-i apt-setup/local0/repository string deb http://apt.puppetlabs.com/ buster puppet6
d-i apt-setup/local0/key string https://apt.puppetlabs.com/pubkey.gpg

# select software to install 
tasksel tasksel/first multiselect standard,ssh-server
d-i pkgsel/include string puppet-agent nscd

# just after installing: enable root login so that I can do my work
d-i preseed/late_command string \
   in-target sh -c 'sed -i "s/^#PermitRootLogin.*\$/PermitRootLogin yes/g" /etc/ssh/sshd_config'; \
   cp /cdrom/partition.sh /target/root/

# update my software if it is installed
d-i pkgsel/upgrade select full-upgrade

# I don't want to publish my software usage
popularity-contest popularity-contest/participate boolean false

d-i grub-installer/only_debian boolean true
EOF

So, damit können wir schon mal arbeiten. Wenn ich nun ein Debian installieren, dann werden wir nach der manuellen Netzwerkkonfiguration gefragt und auch nach der Partitionierung. Zum Schluss wird der Root-Login noch aktiviert - das sollte man lassen, aber es zeigt, das auch im Nachgang an die Installation Anpassungen an dem System möglich sind.

Jetzt müssen wir das ganze noch in ein, sagen wir netinstall, ISO packen. Dazu führe ich nun einfach die schritte auf, die gegangen werden um sowohl das ISO herunterzuladen, als auch die Preseed.cfg in die initrd zu bekommen.

# create a folder for mounting the iso
mkdir ORIGISO
# create a folder for the content of the new iso
mkdir NEWISO
# mount the downloaded iso
sudo mount -o loop debian-10-amd64-netinst.iso ./ORIGISO
# copy the content of the original ISO to the workspace
cp -rT ./ORIGISO/ ./NEWISO/
# umount the iso
sudo umount ./ORIGISO
# now the magic beginns
chmod +w -R ./NEWISO/install.amd/
gunzip ./NEWISO/install.amd/initrd.gz
echo preseed.cfg | cpio -H newc -o -A -F ./NEWISO/install.amd/initrd
gzip ./NEWISOCONTENT/install.amd/initrd
chmod -w -R ./NEWISO/install.amd
chmod +w ./NEWISO/md5sum.txt
find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > ./NEWISO/md5sum.txt
chmod -w ./NEWISO/md5sum.txt
# generate the iso
sudo genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o preseed-debian-10.iso ./NEWISO
# remove all the temporary stuff
sudo rm -fR ./ORIGISO ./NEWISO preseed.cfg

Was dann dabei raus kommt ist eine Datei preseed-debian-10.iso. Diese kann man dann zum Installieren nutzen.


Rancher Agent: Certificate chain is not complete

18 Jan 2021 Lesezeit: 2 Minuten

Wenn man einen Kubernetes Cluster mit Rancher betreibt, dann ist man leider auf die eine der andere Komponente angewiesen, damitman diese schöne bunte Oberfläche betreiben kann. Eine dieser Komponenten ist der Rancher Agent, den es bei einem funktionierenden Cluster dann als Node-Agent und als Cluster-Agent zu finden gibt.

Wenn man mal mit einem Glas Bier auf dem Tisch den Rancher aktualisiert, dann passiert es bei einem Versionssprung auch, dass eben dieser seine Agenten auf die gleiche Version nachzieht wie er sie selbst hat.

Betreibt man das ganze mit einer privaten CA, dann könnte man sich hier den Tag versauen.

Daher sollte man aufpassen, dass man bei einem

helm install rancher rancher-latest/rancher --namespace cattle-system --set hostname=rancher.my.org --set ingress.tls.source=secret --set privateCA=true

Genau das --set privateCA=true nicht vergisst. Denn sollte man das tun, dann findet sich im Deployment der Agenten eine leere Variable CATTLE_CA_CHECKSUM die auch dann nicht mit Leben gefüllt wird, wenn man das oben genannte Flag setzt. Das muss man dann schon selbst machen. Ansonsten bleiben die Agenten mit einem CrashLoopBackOff einfach stehen.

Verpennt man das einmal, muss man es wie gesagt selbst machen, ein aus der Hüfte kommendes:

kubectl edit  deployment -n cattle-system cattle-cluster-agent

hilft dabei aber enorm.