
Nylig kunngjorde et kjent selskap at de flytter linjen sin med bÊrbare datamaskiner til ARM-arkitektur. Da jeg hÞrte denne nyheten, kom jeg pÄ at jeg, igjen mens jeg sÄ pÄ prisene for EC2 i AWS, la merke til Graviton-er med en veldig fristende pris. SelvfÞlgelig var det en hake ved det, for dette er ARM. Den gangen hadde jeg ikke i tankene at ARM er ganske seriÞst ...
For meg har denne arkitekturen alltid vĂŠrt forbeholdt mobile enheter og annet IoT-stĂŠsj. «Ekte» servere pĂ„ ARM virker heller uvanlig, til og med litt sprĂž ... Men en ny tanke festet seg, sĂ„ en helg bestemte jeg meg for Ă„ sjekke hva som faktisk kan kjĂžres pĂ„ ARM i dag. Og for dette ville jeg begynne med noe nĂŠrt og kjĂŠrt â et Kubernetes-kluster. Og ikke bare et hvilket som helst «kluster», men litt «voksent», slik at det ville vĂŠre sĂ„ likt som jeg er vant til Ă„ se det i produksjon.
I mitt hode skulle klusteret vÊre tilgjengelig fra internett, det skulle kjÞre en eller annen webapplikasjon, og det skulle vÊre minst overvÄkning. For Ä realisere denne ideen trengs det et par (eller flere) Raspberry Pi-modeller ikke lavere enn 3B+. Eksperimenteringsstedet kunne ogsÄ vÊrt AWS, men jeg var spesielt interessert i «bringebÊr» (som uansett stod ubrukt). SÄ, vi skal sette opp et Kubernetes-kluster med Ingress, Prometheus og Grafana pÄ dem.
Forberedelse av «bringebÊr»
Installasjon av OS og SSH
Jeg stresset ikke med valg av OS for installasjon: jeg tok bare den nyeste Raspberry Pi OS Lite med . Der finnes ogsÄ , alle handlingene som mÄ utfÞres pÄ alle noder i det fremtidige klustret. Deretter mÄ fÞlgende manipulasjoner utfÞres (ogsÄ pÄ alle noder).
NÄr man har koblet til en skjerm og et tastatur, mÄ man fÞrst konfigurere nettverket og SSH:
- For at klusteret skal fungere mÄ masteren ha en statisk IP-adresse, mens pÄ arbeidsnoder kan det vÊre valgfritt. Jeg foretrakk statiske adresser overalt av hensyn til enkelheten i konfigurasjonen.
- En statisk adresse kan konfigureres i OS (i filen
/etc/dhcpcd.conffinnes et passende eksempel) eller ved Ă„ fikse lease i DHCP-serveren til den brukte (i mitt tilfelle â hjemme) ruteren. - ssh-server aktiveres enkelt i raspi-config (grensesnittalternativer â ssh).
Etter dette kan man logge inn via SSH (standard innlogging er pi, og passordet er raspberry eller det man har endret til) og fortsette konfigurasjonen.
Andre innstillinger
- Vi setter vertsnavnet. I mitt eksempel vil det bli brukt
pi-contrologpi-worker. - Vi sjekker at filsystemet er utvidet til hele disken (
df -h /). Om nÞdvendig kan den utvides ved hjelp av raspi-config. - Vi endrer det forhÄndsinstallerte brukernavnet i raspi-config.
- Vi deaktiverer swap-filen (dette er et krav fra Kubernetes; hvis du er interessert i detaljer om dette, se ):
dphys-swapfile swapoff systemctl disable dphys-swapfile - Vi oppdaterer pakkene til de nyeste versjonene:
apt-get update && apt-get dist-upgrade -y - Vi installerer Docker og tilleggsprogrammer:
apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistentVed installasjon
iptables-persistentmĂ„ vi lagre iptables-innstillingene for ipv4, og i filen/etc/iptables/rules.v4â legge til regler i kjedenFORWARD, slik:# Generated by xtables-save v1.8.2 on Sun Jul 19 00:27:43 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -s 10.1.0.0/16 -j ACCEPT -A FORWARD -d 10.1.0.0/16 -j ACCEPT COMMIT - Det gjenstĂ„r bare Ă„ starte pĂ„ nytt.
NĂ„ er alt klart for installasjon av Kubernetes-klyngen.
Installasjon av Kubernetes
I dette trinnet har jeg bevisst utsatt alt arbeidet fra vÄre egne og vÄre bedrifts automatiseringer for installasjon og konfigurasjon av K8s-klyngen. I stedet vil vi bruke den offisielle dokumentasjonen med (litt supplert med kommentarer og forkortelser).
La oss legge til Kubernetes-repositoriet:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get updateVidere anbefales det i dokumentasjonen Ä installere CRI (container runtime interface). Siden Docker allerede er installert, gÄr vi videre og installerer de grunnleggende komponentene:
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni I trinnet for installasjon av de grunnleggende komponentene la jeg umiddelbart til kubernetes-cni, som er nÞdvendig for at klyngen skal fungere. Og her er det et viktig punkt: pakken kubernetes-cni av en eller annen grunn ikke oppretter standardkatalogen for CNI-innstillinger, sÄ jeg mÄtte opprette den manuelt:
mkdir -p /etc/cni/net.dFor Ä fÄ network-backend til Ä fungere, som omtales nedenfor, er det nÞdvendig Ä installere en CNI-plugin. Jeg valgte den kjente og forstÄelige plugin portmap (for en fullstendig liste, se ):
curl -sL https://github.com/containernetworking/plugins/releases/download/v0.7.5/cni-plugins-arm-v0.7.5.tgz | tar zxvf - -C /opt/cni/bin/ ./portmapKonfigurering av Kubernetes
Noden med control plane
Installasjonen av selve klyngen gjĂžres ganske enkelt. For Ă„ fremskynde denne prosessen og sjekke at Kubernetes-bildene er tilgjengelige, kan vi fĂžrst utfĂžre:
kubeadm config images pullNĂ„ gjennomfĂžrer vi selve installasjonen â vi initialiserer control plane i klyngen:
kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16 --upload-certsVÊr oppmerksom pÄ at subnett for tjenester og pod'er ikke skal overlappe hverandre eller eksisterende nettverk.
Til slutt vil vi se en melding som bekrefter at alt er i orden, og samtidig gi oss instruksjoner om hvordan vi kan koble til arbeidsnoder til kontrollplanet:
Kontrollplanet ditt for Kubernetes har blitt initialisert vellykket!
For Ä begynne Ä bruke klyngen din, mÄ du kjÞre fÞlgende som en vanlig bruker:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Du bÞr nÄ distribuere et pod-nettverk til klyngen.
KjÞr "kubectl apply -f [podnetwork].yaml" med ett av alternativene som er oppfÞrt pÄ:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Du kan nÄ koble til et hvilket som helst antall kontrollsenter-noder ved Ä kjÞre fÞlgende kommando pÄ hver som root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050
--contrl-plane --certificate-key 72a3c0a14c627d6d7fdade1f4c8d7a41b0fac31b1faf0d8fdf9678d74d7d2403
VÊr oppmerksom pÄ at sertifikattasten gir tilgang til sensitive data i klyngen, hold den hemmelig!
Som en sikkerhetsforanstaltning vil opplastede sertifikater bli slettet om to timer; hvis nĂždvendig kan du bruke
"kubeadm init phase upload-certs --upload-certs" for Ä laste opp sertifikater pÄ nytt etterpÄ.
Deretter kan du koble til et hvilket som helst antall arbeidsnoder ved Ä kjÞre fÞlgende pÄ hver som root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050La oss fĂžlge anbefalingene for Ă„ legge til konfigurasjonen for brukeren. Og samtidig er det lurt Ă„ legge til autofullfĂžring for kubectl:
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profilePÄ dette punktet kan vi allerede se den fÞrste noden i klyngen (selv om den ennÄ ikke er klar):
root@pi-control:~# kubectl get no
NAME STATUS ROLES AGE VERSION
pi-control NotReady master 29s v1.18.6Nettverkskonfigurasjon
Som nevnt i meldingen etter installasjonen, mÄ vi deretter sette opp nettverkslÞsning i klyngen. Dokumentasjonen tilbyr valg mellom Calico, Cilium, contiv-vpp, Kube-router og Weave Net⊠Her avviker jeg fra den offisielle instruksjonen og velger en mer kjent og forstÄelig lÞsning for meg: i host-gw-modus (les mer om tilgjengelige bakender i ).
Ă installere det i klyngen er ganske enkelt. FĂžrst - last ned manifestene:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml Deretter endrer vi innstillingen fra vxlan En funksjon har blitt host-gw:
sed -i 's/vxlan/host-gw/' kube-flannel.yml⊠og subnettet for pod'er - fra standardverdien til den som ble angitt under initialiseringen av klyngen:
sed -i 's#10.244.0.0/16#10.1.0.0/16#' kube-flannel.ymlEtter dette oppretter vi ressursene:
kubectl create -f kube-flannel.yml Klar! Etter en stund vil den fĂžrste K8s-noden endre status til Klar:
NAME STATUS ROLES AGE VERSION
pi-control Ready master 2m v1.18.6Legge til en arbeidsnode
NĂ„ kan du legge til en worker. For dette, pĂ„ den â etter Ă„ ha installert Kubernetes i henhold til scenariet beskrevet ovenfor â mĂ„ du bare kjĂžre den tidligere mottatte kommandoen:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050NĂ„ kan vi si at klyngen er klar:
root@pi-control:~# kubectl get no
NAME STATUS ROLES AGE VERSION
pi-control Ready master 28m v1.18.6
pi-worker Ready 2m8s v1.18.6Jeg hadde bare to Raspberry Pi tilgjengelig, sÄ jeg Þnsket ikke Ä gi bort en av dem kun til kontrollplanet. Derfor fjernet jeg den automatisk installerte tainten fra noden pi-control ved Ä kjÞre:
root@pi-control:~# kubectl edit node pi-control⊠og fjernet linjene:
- effect: NoSchedule
key: node-role.kubernetes.io/masterFylling av klyngen med minimum nĂždvendige komponenter
FĂžrst trenger vi Helm. SelvfĂžlgelig kan man gjĂžre alt uten det, men Helm tillater deg Ă„ konfigurere noen komponenter uten Ă„ redigere filer. Og det er faktisk bare en binĂŠr fil som "ikke krever noe".
SÄ, vi gÄr til i seksjonen docs/installation og utfÞrer kommandoen derfra:
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bashEtter dette legger vi til chart-repositoriet:
helm repo add stable https://kubernetes-charts.storage.googleapis.com/NĂ„ vil vi installere infrastrukturkomponentene i henhold til planen:
- Ingress-kontroller;
- Prometheus;
- Grafana;
- cert-manager.
Ingress-kontroller
Den fĂžrste komponenten â Ingress-kontroller â installeres ganske enkelt og er klar til bruk "rett ut av esken". For dette mĂ„ du bare gĂ„ til og utfĂžre installasjonskommandoen derfra:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yamlMen pÄ dette tidspunktet begynte "malinen" Ä slite og stange mot diskens IOPS. Det viser seg at sammen med Ingress-kontrolleren installeres det mange ressurser, mange forespÞrselene gÄr til API, og som et resultat skrives det mye data til etcd. Generelt, enten er minnekortet i klasse 10 ikke veldig effektivt, eller SD-kortene er generelt utilstrekkelige for sÄ hÞy belastning. Likevel, etter omtrent 5 minutter startet alt.
Et namespace ble opprettet, og i det dukket det opp en kontroller og alt det trenger:
root@pi-control:~# kubectl -n ingress-nginx get pod
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-2hwdx 0/1 Completed 0 31s
ingress-nginx-admission-patch-cp55c 0/1 Completed 0 31s
ingress-nginx-controller-7fd7d8df56-68qp5 1/1 Running 0 48sPrometheus
De neste to komponentene er ganske enkle Ă„ installere via Helm fra chart repo.
Vi finner Prometheus, vi oppretter namespace og installerer i det:
helm search repo stable | grep prometheus
kubectl create ns monitoring
helm install prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"}Som standard bestiller Prometheus 2 disker: en for dataene til selve Prometheus og en for dataene til AlertManager. Siden det ikke er opprettet en storage class i klyngen, vil diskene ikke bli bestilt og podâene vil ikke starte. For bare metal-installasjoner av Kubernetes bruker vi vanligvis Ceph rbd, men i tilfelle av Raspberry Pi er det Ă„penbart overkill.
Derfor skal vi opprette en enkel local storage pÄ hostpath. Manifestene for PV (persistent volume) for prometheus-server og prometheus-alertmanager er slÄtt sammen i filen prometheus-pv.yaml i . Katalogen for PV mÄ opprettes pÄ forhÄnd pÄ disken til den noden vi Þnsker Ä binde Prometheus til: i eksemplet er det angitt nodeAffinity etter hostname pi-worker og det er opprettet kataloger pÄ den /data/localstorage/prometheus-server og /data/localstorage/prometheus-alertmanager.
Vi laster ned (kloner) manifestet og legger det til Kubernetes:
kubectl create -f prometheus-pv.yamlPĂ„ dette stadiet mĂžtte jeg for fĂžrste gang problemet med ARM-arkitektur. Kube-state-metrics, som standard installeres med Prometheus-chartet, nektet Ă„ starte. Den ga feilmeldingen:
root@pi-control:~# kubectl -n monitoring logs prometheus-kube-state-metrics-c65b87574-l66d8
standard_init_linux.go:207: exec user process caused "exec format error"Poenget er at kube-state-metrics bruker bildet fra prosjektet CoreOS, som ikke bygges for ARM:
kubectl -n monitoring get deployments.apps prometheus-kube-state-metrics -o=jsonpath={.spec.template.spec.containers[].image}
quay.io/coreos/kube-state-metrics:v1.9.7Jeg mÄtte google litt og finne for eksempel . For Ä bruke det, oppdaterer vi utgivelsen og angir hvilket bilde som skal brukes for kube-state-metrics:
helm upgrade prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"} --set kube-state-metrics.image.repository=carlosedp/kube-state-metrics --set kube-state-metrics.image.tag=v1.9.6Vi sjekker at alt har startet:
root@pi-control:~# kubectl -n monitoring get po
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-df65d99d4-6d27g 2/2 Running 0 5m56s
prometheus-kube-state-metrics-5dc5fd89c6-ztmqr 1/1 Running 0 5m56s
prometheus-node-exporter-49zll 1/1 Running 0 5m51s
prometheus-node-exporter-vwl44 1/1 Running 0 4m20s
prometheus-pushgateway-c547cfc87-k28qx 1/1 Running 0 5m56s
prometheus-server-85666fd794-z9qnc 2/2 Running 0 4m52sGrafana og cert-manager
For grafer og dashboards installerer vi Grafana:
helm install grafana --namespace monitoring stable/grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}PÄ slutten av utdataene vil vi se hvordan vi fÄr passordet for tilgang:
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoFor Ă„ bestille sertifikater installerer vi cert-manager. For installasjonen henviser vi til , som tilbyr passende kommandoer for Helm:
helm repo add jetstack https://charts.jetstack.io
helm install
cert-manager jetstack/cert-manager
--namespace cert-manager
--version v0.16.0
--set installCRDs=trueFor selvsignerte sertifikater for hjemmebruk er dette mer enn tilstrekkelig. Hvis man derimot Ăžnsker Ă„ fĂ„ samme Letâs Encrypt, mĂ„ man sette opp en cluster issuer. Detaljer om dette kan man finne i vĂ„r artikkel «».
Selv valgte jeg alternativet fra , og bestemte meg for at staging-alternativet fra LE ville vĂŠre tilstrekkelig. Vi endrer e-posten i eksempelet, lagrer det i fil og legger det til i klyngen ():
kubectl create -f cert-manager-cluster-issuer.yamlNÄ kan vi bestille sertifikatet, for eksempel for Grafana. For dette trenger vi et domene og ekstern tilgang til klyngen. Jeg har domenet, og trafikken er satt opp ved Ä videresende porter 80 og 443 pÄ hjemme-ruteren i henhold til den opprettede ingress-controller-tjenesten:
kubectl -n ingress-nginx get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.2.206.61 80:31303/TCP,443:30498/TCP 23dPort 80 omdirigeres i dette tilfellet til 31303, og 443 til 30498. (Porter genereres tilfeldig, sÄ de vil vÊre forskjellige for deg.)
Her er et eksempel pÄ sertifikatet ():
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: grafana
namespace: monitoring
spec:
dnsNames:
- grafana.home.pi
secretName: grafana-tls
issuerRef:
kind: ClusterIssuer
name: letsencrypt-stagingVi legger det til i klyngen:
kubectl create -f cert-manager-grafana-certificate.yamlEtter dette vil det opprettes en Ingress-ressurs, gjennom hvilken valideringen skjer med Letâs Encrypt:
root@pi-control:~# kubectl -n monitoring get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
cm-acme-http-solver-rkf8l grafana.home.pi 192.168.88.31 80 72s
grafana grafana.home.pi 192.168.88.31 80 6d17h
prometheus-server prometheus.home.pi 192.168.88.31 80 8d Etter at valideringen er fullfĂžrt, vil vi se at ressursen certificate er klar, og i den angitte hemmeligheten grafana-tls er sertifikat og nĂžkkel. Man kan umiddelbart sjekke hvem som utstedte sertifikatet:
root@pi-control:~# kubectl -n monitoring get certificate
NAME READY SECRET AGE
grafana True grafana-tls 13m
root@pi-control:~# kubectl -n monitoring get secrets grafana-tls -ojsonpath="{.data['tls.crt']}" | base64 -d | openssl x509 -issuer -noout
issuer=CN = Fake LE Intermediate X1La oss gÄ tilbake til Grafana. Vi mÄ gjÞre noen justeringer i Helm-utgivelsen vÄr, og endre innstillingene for TLS i samsvar med det opprettede sertifikatet.
For Ă„ gjĂžre dette laster vi ned diagrammet, redigerer og oppdaterer fra den lokale katalogen:
helm pull --untar stable/grafana Vi redigerer i filen grafana/values.yaml TLS-parametrene:
tls:
- secretName: grafana-tls
hosts:
- grafana.home.pi Her kan vi ogsÄ konfigurere den installerte Prometheus som datasource:
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server:80
access: proxy
isDefault: trueNĂ„ oppdaterer vi Grafana-diagrammet fra den lokale katalogen:
helm upgrade grafana --namespace monitoring ./grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"} Vi sjekker at Ingress grafana har fÄtt port 443 og har tilgang via HTTPS:
root@pi-control:~# kubectl -n monitoring get ing grafana
NAME CLASS HOSTS ADDRESS PORTS AGE
grafana grafana.home.pi 192.168.88.31 80, 443 63m
root@pi-control:~# curl -kI https://grafana.home.pi
HTTP/2 302
server: nginx/1.19.1
date: Tue, 28 Jul 2020 19:01:31 GMT
content-type: text/html; charset=utf-8
cache-control: no-cache
expires: -1
location: /login
pragma: no-cache
set-cookie: redirect_to=; Path=/; HttpOnly; SameSite=Lax
x-frame-options: deny
strict-transport-security: max-age=15724800; includeSubDomainsFor Ă„ demonstrere Grafana i aksjon kan du laste ned og legge til . Slik ser det ut:

Jeg anbefaler ogsÄ Ä legge til dashboard for node exporter: det vil gi en detaljert oversikt over hva som skjer med «malinen» (CPU-belastning, minnebruk, nettverk, disk osv.).
Etter dette mener jeg at klusteret er klart til Ă„ ta imot og kjĂžre applikasjoner!
Merk om bygging
For Ă„ bygge applikasjoner for ARM-arkitektur er det minst to alternativer. For det fĂžrste kan man bygge pĂ„ en ARM-enhet. Men etter Ă„ ha sett pĂ„ den nĂ„vĂŠrende bruken av to Raspberry Pi, innsĂ„ jeg at de ikke hadde kapasitet til Ă„ hĂ„ndtere byggingen heller. SĂ„ jeg bestilte en ny Raspberry Pi 4 (den er kraftigere og har sĂ„ mye som 4 GB minne) â jeg planlegger Ă„ bygge pĂ„ den.
Det andre alternativet er Ä bygge et multi-arkitektur Docker-bilde pÄ en kraftigere maskin. For dette finnes det . Dersom appen er skrevet i et kompilert sprÄk, vil det vÊre nÞdvendig med krysskompilering for ARM. Jeg vil ikke beskrive alle innstillingene for en slik tilnÊrming, da det ville blitt en egen artikkel. Ved Ä implementere en slik tilnÊrming kan man oppnÄ "universelle" bilder: Docker, som kjÞrer pÄ ARM-maskinen, vil automatisk laste ned det riktige bildet for arkitekturen.
Konklusjon
Eksperimentet overgikk alle mine forventninger: [minst] "vanilje" Kubernetes med nÞdvendig database fungerer ganske bra pÄ ARM, og det oppsto bare et par smÄ problemer under konfigurasjonen.
Selv Raspberry Pi 3B+ hÄndterer belastningen pÄ CPU, men SD-kortene deres er et klart flaskehals. Kollegaene mine har gitt tips om at det i visse versjoner er mulig Ä boote fra USB, hvor man kan tilkoble SSD: da vil situasjonen trolig bli bedre.
Her er et eksempel pÄ CPU-lasten under installasjonen av Grafana:

For eksperimentering og "for moro skyld" mener jeg at Kubernetes-klusteret pÄ "smÄ datamaskiner" gir en mye bedre opplevelse enn det samme Minikube, fordi alle klusterkomponenter installeres og fungerer "som en proff".
Det er en fremtidig idé om Ä legge hele CI/CD-syklusen til klusteret, fullt implementert pÄ Raspberry Pi. Jeg vil ogsÄ sette pris pÄ hvis noen deler sin erfaring med Ä sette opp K8s pÄ AWS Graviton.
P.S. Ja, "produksjon" kan vĂŠre nĂŠrmere enn jeg trodde:

P.P.S.
Also read in our blog:
- «».
Kilde: habr.com
