Full Kubernetes fra bunnen av pÄ Raspberry Pi

Full Kubernetes fra bunnen av pÄ Raspberry Pi

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 den offisielle nettsiden. Der finnes ogsÄ dokumentasjonen for installasjon, 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:

  1. 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.
  2. En statisk adresse kan konfigureres i OS (i filen /etc/dhcpcd.conf finnes et passende eksempel) eller ved Ă„ fikse lease i DHCP-serveren til den brukte (i mitt tilfelle — hjemme) ruteren.
  3. 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

  1. Vi setter vertsnavnet. I mitt eksempel vil det bli brukt pi-control og pi-worker.
  2. Vi sjekker at filsystemet er utvidet til hele disken (df -h /). Om nĂždvendig kan den utvides ved hjelp av raspi-config.
  3. Vi endrer det forhÄndsinstallerte brukernavnet i raspi-config.
  4. Vi deaktiverer swap-filen (dette er et krav fra Kubernetes; hvis du er interessert i detaljer om dette, se issue #53533):
    dphys-swapfile swapoff
    systemctl disable dphys-swapfile
  5. Vi oppdaterer pakkene til de nyeste versjonene:
    apt-get update && apt-get dist-upgrade -y
  6. Vi installerer Docker og tilleggsprogrammer:
    apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistent

    Ved installasjon iptables-persistent mĂ„ vi lagre iptables-innstillingene for ipv4, og i filen /etc/iptables/rules.v4 — legge til regler i kjeden FORWARD, 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
  7. 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 kubernetes.io (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 update

Videre 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.d

For Ä 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 dokumentasjonen):

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/ ./portmap

Konfigurering 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 pull

NĂ„ 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-certs

VÊ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:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050

La 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_profile

PÄ 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.6

Nettverkskonfigurasjon

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: flannel i host-gw-modus (les mer om tilgjengelige bakender i projektets dokumentation).

Å 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.yml

Etter 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.6

Legge 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:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050

NĂ„ 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.6

Jeg 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/master

Fylling 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 helm.sh i seksjonen docs/installation og utfÞrer kommandoen derfra:

curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

Etter 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 seksjonen bare-metal pĂ„ nettstedet og utfĂžre installasjonskommandoen derfra:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

Men 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          48s

Prometheus

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 Git-repositorier med eksempler til artikkelen. 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.yaml

PĂ„ 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.7

Jeg mÄtte google litt og finne for eksempel dette bildet. 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.6

Vi 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          4m52s

Grafana 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 ; echo

For Ă„ bestille sertifikater installerer vi cert-manager. For installasjonen henviser vi til dokumentasjonen, 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=true

For 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 «SSL-sertifikater fra Let’s Encrypt med cert-manager i Kubernetes».

Selv valgte jeg alternativet fra eksempelet i dokumentasjonen, 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 (cert-manager-cluster-issuer.yaml):

kubectl create -f cert-manager-cluster-issuer.yaml

NÄ 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   23d

Port 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 (cert-manager-grafana-certificate.yaml):

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-staging

Vi legger det til i klyngen:

kubectl create -f cert-manager-grafana-certificate.yaml

Etter 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 X1

La 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: true

NĂ„ 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; includeSubDomains

For Ă„ demonstrere Grafana i aksjon kan du laste ned og legge til dashboard for kube-state-metrics. Slik ser det ut:

Full Kubernetes fra bunnen av pÄ Raspberry Pi

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 utvidelsen docker buildx. 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:

Full Kubernetes fra bunnen av pÄ Raspberry Pi

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:

Full Kubernetes fra bunnen av pÄ Raspberry Pi

P.P.S.

Also read in our blog:

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster