Sertifikater
Hvis du har et eget domene kan du knytte opp cert-manager og nginx mot f.eks Let’s Encrypt. Men i dette eksemplet skal vi se på et internt kluster. Og for å få kjørt tls kryptering mellom tjenestene, og ut av klusteret, må vi lage vårt eget sertifikat som cert-manager bruker for å utstede sertifikater for alle tjenestene.
Opprett et nytt CA sertifikat
Det opprettes automatisk eget CA og sertifikater for hver enkelt tjeneste. Det som nå må gjøres er å manuelt godkjenne CA sertifikatet på egen maskin og på den maskinen der klusteret kjører. Dette for å kunne få tilgang til tjenestene uten å måtte si at man godtar koblingen selv om den ikke er “sikker”.
I noen tilfeller som i DroneCI så gjøres det her et unntak, da byggeagentene ikke automatisk får tilgang til CA sertifikatene, og det i sånn måte må importeres som en del av byggepipeline. Av praktiske, og av læringsøymed er disse stegene heller utelatt.
Importere sertifikatene på egen maskin og i kluster
# Hent ut nåværende issuer sertifikat.
kubectl get secrets -n cert-manager self-signed-ca -o json | jq -r '.data["tls.crt"]' | base64 -d > issuer.crt
# Installer sertifikat i lokal cert-store
sudo cp issuer.crt /usr/local/share/ca-certificates/issuer.crt
sudo update-ca-certificates
# Test om sertifikatet er gyldig. Denne kommandoen skal skrive ut HTML kode om den er TLS er gyldig.
curl -L argocd.local
Restarte microk8s
For at disse endringene skal traversere til microk8s, må vi restarte klusteret:
microk8s stop && microk8s start
Importere CA sertifikatet inn i podene
For at gitea og droneci skal kunne kommunisere over en sikker TLS forbindelse, må man legge inn issuer.crt
filen i hver eneste pod. Dette skal vi gjøre ved hjelp av en configmap, og er et stykke manuelt arbeid.
ca.crt
er tilgjengelig som en hemmelighet i de namespace
som har spurt etter et sertifikat. Hemmeligheten som lages består av 3 datafelt, ca.crt
, tls.crt
og tls.key
.
ca.crt
- Dette feltet er den offentlige nøkkelen til issuer sertifikatet som vi får fra klusteret.
tls.crt
- Dette er den offentlige nøkkelen for selve tjenesten.
tls.key
- Dette er privatnøkkelen for tjenesten, (leaf sertifikatet) f.eks det sertifikatet som gir oss https://drone.local
Det vi må gjøre hvis vi ønsker en tjeneste som kommuniserer med en annen tjeneste over HTTPS
i klusteret, er å importere ca.crt
inn i noden. Det er forskjellig for hvert HELM chart, men forhåpentligvis er det en god oppskrift på hvordan man kan gjøre det. Sluttresultatet manifestet skal bli som følger:
apiVersion: v1
kind: Pod
metadata:
name: drone
namespace: drone
spec:
containers:
- image:
volumeMounts:
- mountPath: /etc/ssl/certs/ca.crt
name: cluster-ca
readOnly: true
subPath: ca.crt #denne er VIKTIG. Hvis ikke overskrives hele mappen. Dette er også verdien fra hemmeligheten vi ønsker å hente ut.
volumes:
- secret:
secretName: drone-tls-secret
name: cluster-ca