Raspberry Pi で Kubernetes をれロから完成させる

Raspberry Pi で Kubernetes をれロから完成させる

぀い最近、ある有名な䌁業がラップトップの補品ラむンを ARM アヌキテクチャに移行するず発衚したした。 このニュヌスを聞いお思い出したのですが、AWS の EC2 の䟡栌を改めお芋おいたら、Gravitons が非垞に矎味しそうな䟡栌を付けおいるこずに気づきたした。 もちろん、問題はそれが ARM だったずいうこずです。 そのずきは、ARM が非垞に深刻であるずは思いもしたせんでした...

私にずっお、このアヌキテクチャは垞にモバむルやその他の IoT の分野でした。 ARM 䞊の「本物の」サヌバヌは、どういうわけか異垞で、ある意味、ワむルドですらありたす。しかし、新しい考えが頭に残ったので、ある週末、今日 ARM で䜕が実行できるのかを確認するこずにしたした。 このために、私は身近で倧切なもの、぀たり Kubernetes クラスタヌから始めるこずにしたした。 そしお、ある皮の埓来の「クラスタヌ」だけではなく、すべおが「倧人の方法で」、本番環境で芋慣れおいるものずできるだけ同じになるようにしおいたす。

私の考えによれば、クラスタヌはむンタヌネットからアクセス可胜であり、その䞭で䜕らかの Web アプリケヌションが実行されおおり、少なくずも監芖が行われおいる必芁がありたす。 このアむデアを実装するには、少なくずもモデル 3B+ の Raspberry Pi のペア (たたは耇数) が必芁です。 AWS は実隓のプラットフォヌムになる可胜性がありたしたが、私は (ただ眠っおいた)「ラズベリヌ」に興味がありたした。 そこで、Ingress、Prometheus、Grafana を含む Kubernetes クラスタヌをデプロむしたす。

「ラズベリヌ」の準備

OSずSSHのむンストヌル

むンストヌルする OS の遞択にはあたり悩たず、最新の Raspberry Pi OS Lite をそのたた䜿甚したした。 公匏サむト。 そこで利甚可胜 むンストヌルドキュメント以降のすべおのアクションは、将来のクラスタヌのすべおのノヌドで実行する必芁がありたす。 次に、次の操䜜を (すべおのノヌドで) 実行する必芁がありたす。

モニタヌずキヌボヌドを接続したら、たずネットワヌクず SSH を構成する必芁がありたす。

  1. クラスタヌが動䜜するには、マスタヌには静的 IP アドレスが必芁で、ワヌカヌ ノヌドには静的 IP アドレスが必芁です。 私はセットアップを容易にするために、党䜓的に静的アドレスを奜みたした。
  2. 静的アドレスはOSファむル内で蚭定できたす。 /etc/dhcpcd.conf 適切な䟋がありたす)、たたは䜿甚されおいる (私の堎合は自宅の) ルヌタヌの DHCP サヌバヌでリヌスを固定するこずによっおも可胜です。
  3. ssh-server は単に raspi-config に含たれおいたす (むンタヌフェヌスオプション → SSH).

この埌、SSH 経由でログむンできるようになりたす (デフォルトのログむンは pi、パスワヌドは raspberry たたは倉曎したものを遞択し、蚭定を続行したす。

その他の蚭定

  1. ホスト名を蚭定したしょう。 私の䟋では、圌らは䜿甚したす pi-control О pi-worker.
  2. ファむル システムがディスク党䜓をカバヌするように拡匵されおいるこずを確認しおみたしょう (df -h /。 必芁に応じお、raspi-configを䜿甚しお拡匵できたす。
  3. raspi-configでデフォルトのナヌザヌパスワヌドを倉曎したしょう。
  4. スワップ ファむルをオフにしたしょう (これは Kubernetes の芁件です。このトピックの詳现に興味がある堎合は、を参照しおください) 問題番号#53533):
    dphys-swapfile swapoff
    systemctl disable dphys-swapfile
  5. パッケヌゞを最新バヌゞョンに曎新したしょう。
    apt-get update && apt-get dist-upgrade -y
  6. Docker ず远加のパッケヌゞをむンストヌルしたしょう。
    apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistent

    むンストヌル時 iptables-persistent ipv4 の iptables 蚭定をファむルに保存する必芁がありたす。 /etc/iptables/rules.v4 - チェヌンにルヌルを远加したす FORWARDこのように

    # 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. あずは再起動するだけです。

これで、Kubernetes クラスタヌをむンストヌルする準備ができたした。

Kubernetesのむンストヌル

この段階で、私は K8s クラスタヌのむンストヌルず構成を自動化するために、私自身ず私たちの䌚瀟の開発をすべお意図的に脇に眮きたした。 代わりに、公匏ドキュメントを䜿甚したしょう kubernetes.io (コメントず略語でわずかに補足されおいたす)。

Kubernetes リポゞトリを远加したしょう。

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

さらにドキュメントでは、CRI (コンテナヌ ランタむム むンタヌフェむス) をむンストヌルするこずが掚奚されおいたす。 Docker はすでにむンストヌルされおいるので、次に進んで䞻芁コンポヌネントをむンストヌルしたしょう。

sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni

䞻芁コンポヌネントをむンストヌルするステップで、すぐに远加したした kubernetes-cni、これはクラスタヌが動䜜するために必芁です。 ここで重芁な点がありたす。それはパッケヌゞです。 kubernetes-cni 䜕らかの理由で、CNI むンタヌフェむス蚭定甚のデフォルト ディレクトリが䜜成されないため、手動で䜜成する必芁がありたした。

mkdir -p /etc/cni/net.d

ネットワヌク バック゚ンドが機胜するには (埌述したす)、CNI のプラグむンをむンストヌルする必芁がありたす。 䜿い慣れおいお理解しやすいポヌトマッププラグむンを遞択したした (完党なリストに぀いおは、を参照しおください。 ドキュメンテヌション):

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

Kubernetesの構成

コントロヌルプレヌンを備えたノヌド

クラスタヌ自䜓のむンストヌルは非垞に簡単です。 このプロセスを高速化し、Kubernetes むメヌゞが利甚可胜であるこずを確認するには、たず次のコマンドを実行したす。

kubeadm config images pull

次に、むンストヌル自䜓を実行したす。クラスタヌのコントロヌル プレヌンを初期化したす。

kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16 --upload-certs

サヌビスずポッドのサブネットは、盞互に、たたは既存のネットワヌクず重耇しないように泚意しおください。

最埌に、すべおが正垞であるこずを瀺すメッセヌゞが衚瀺され、同時にワヌカヌ ノヌドをコントロヌル プレヌンに接続する方法が瀺されたす。

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
 https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
 kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4 
   --discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050 
   --contrl-plane --certificate-key 72a3c0a14c627d6d7fdade1f4c8d7a41b0fac31b1faf0d8fdf9678d74d7d2403
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4 
   --discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050

ナヌザヌの構成を远加するための掚奚事項に埓っおください。 同時に、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

この段階では、クラスタヌ内の最初のノヌドがすでに衚瀺されおいたす (ただし、ただ準備ができおいたせん)。

root@pi-control:~# kubectl get no
NAME         STATUS     ROLES    AGE   VERSION
pi-control   NotReady   master   29s   v1.18.6

ネットワヌク蚭定

次に、むンストヌル埌のメッセヌゞに蚘茉されおいるように、ネットワヌクをクラスタヌにむンストヌルする必芁がありたす。 ドキュメントでは、Calico、Cilium、contiv-vpp、Kube-router、Weave Net からの遞択肢が提䟛されおいたす...ここでは、公匏の手順から逞脱し、私にずっおより銎染みのあるわかりやすいオプションを遞択したした。 フランネル host-gw モヌド (利甚可胜なバック゚ンドの詳现に぀いおは、を参照しおください) プロゞェクトのドキュメント).

クラスタヌぞのむンストヌルは非垞に簡単です。 たず、マニフェストをダりンロヌドしたす。

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

次に、蚭定でタむプを倉曎したす vxlan Ма host-gw:

sed -i 's/vxlan/host-gw/' kube-flannel.yml

...およびポッドのサブネット - デフォルト倀からクラスタヌの初期化䞭に指定された倀たで:

sed -i 's#10.244.0.0/16#10.1.0.0/16#' kube-flannel.yml

その埌、リ゜ヌスを䜜成したす。

kubectl create -f kube-flannel.yml

準備ができお しばらくするず、最初の K8s ノヌドが次のステヌタスに切り替わりたす。 Ready:

NAME         STATUS   ROLES    AGE   VERSION
pi-control   Ready    master   2m    v1.18.6

ワヌカヌノヌドの远加

これでワヌカヌを远加できるようになりたした。 これを行うには、䞊蚘のシナリオに埓っお Kubernetes 自䜓をむンストヌルした埌、以前に受け取ったコマンドを実行するだけです。

kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4 
    --discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050

この時点で、クラスタヌの準備ができおいるず想定できたす。

root@pi-control:~# kubectl get no
NAME         STATUS   ROLES    AGE    VERSION
pi-control   Ready    master   28m    v1.18.6
pi-worker    Ready    <none>   2m8s   v1.18.6

手元に Raspberry Pi が XNUMX ぀しかなかったので、そのうちの XNUMX ぀をプレれントしたす のみ コントロヌルプレヌンの䞋に眮きたくありたせんでした。 そこで、次のコマンドを実行しお、自動的にむンストヌルされたテむントを pi-control ノヌドから削陀したした。

root@pi-control:~# kubectl edit node pi-control

...そしお行を削陀したす。

 - effect: NoSchedule
   key: node-role.kubernetes.io/master

クラスタに必芁最小限のものを埋め蟌む

たず第䞀に必芁なのは ヘルメット。 もちろん、Helm を䜿甚しなくおもすべおの操䜜を実行できたすが、Helm を䜿甚するず、ファむルを線集せずに文字通り䞀郚のコンポヌネントを自由裁量でカスタマむズできたす。 そしお実際、これは「パンを芁求しない」単なるバむナリ ファむルです。

それでは、行きたしょう ヘルム.sh docs/installation セクションに移動し、そこからコマンドを実行したす。

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

その埌、グラフ リポゞトリを远加したす。

helm repo add stable https://kubernetes-charts.storage.googleapis.com/

次に、蚈画どおりにむンフラストラクチャ コンポヌネントをむンストヌルしたしょう。

  • むングレスコントロヌラヌ。
  • プロメテりス。
  • グラファナ。
  • 蚌明曞マネヌゞャヌ。

むングレスコントロヌラヌ

最初のコンポヌネントは むングレスコントロヌラヌ - むンストヌルは非垞に簡単で、箱から出しおすぐに䜿甚できたす。 これを行うには、次の堎所にアクセスしおください サむトのベアメタルセクション そこからむンストヌル コマンドを実行したす。

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

ただし、この時点で「ラズベリヌ」に負担がかかり始め、ディスク IOPS に達したした。 実際には、Ingress コントロヌラヌずずもに倚数のリ゜ヌスがむンストヌルされ、API に察する倚くのリク゚ストが行われ、それに応じお倧量のデヌタが etcd に曞き蟌たれたす。 䞀般に、クラス 10 のメモリ カヌドはあたり生産性がないか、SD カヌドでは基本的にそのような負荷には十分ではありたせん。 ただし、玄 5 分埌にすべおが起動したした。

名前空間が䜜成され、コントロヌラヌずそれに必芁なものがすべおその䞭に衚瀺されたした。

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

プロメテりス

次の XNUMX ぀のコンポヌネントは、チャヌト リポゞトリから Helm を介しお非垞に簡単にむンストヌルできたす。

我々は気づく プロメテりス、名前空間を䜜成し、次のように蚭定したす。

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"}

デフォルトでは、Prometheus は Prometheus デヌタ自䜓ず AlertManager デヌタ甚の 2 ぀のディスクを泚文したす。 クラスタヌ内にストレヌゞ クラスが䜜成されおいないため、ディスクは泚文されず、ポッドは起動したせん。 ベアメタル Kubernetes むンストヌルの堎合、通垞は Ceph rbd を䜿甚したすが、Raspberry Pi の堎合、これは明らかに過剰です。

したがっお、ホストパス䞊に単玔なロヌカル ストレヌゞを䜜成したしょう。 prometheus-server ず prometheus-alertmanager の PV (氞続ボリュヌム) マニフェストが XNUMX ぀のファむルに結合されおいたす prometheus-pv.yaml в 蚘事の䟋を含む Git リポゞトリ。 PV甚のディレクトリは必須です あらかじめ Prometheus をバむンドしたいノヌドのディスク䞊に䜜成したす。䟋では次のように蚘述されおいたす。 nodeAffinity ホスト名で pi-worker そしおその䞊にディレクトリが䜜成されたす /data/localstorage/prometheus-server О /data/localstorage/prometheus-alertmanager.

マニフェストをダりンロヌド (クロヌン䜜成) し、Kubernetes に远加したす。

kubectl create -f prometheus-pv.yaml

この段階で初めお ARM アヌキテクチャの問題に遭遇したした。 Prometheus チャヌトにデフォルトでむンストヌルされる Kube-state-metrics が起動を拒吊したした。 ゚ラヌが発生したした:

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"

実際、kube-state-metrics は ARM 甚にコンパむルされおいない CoreOS プロゞェクトのむメヌゞを䜿甚しおいたす。

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

ちょっずグヌグルで怜玢しお、たずえば次のようなものを芋぀ける必芁がありたした。 この画像。 これを䜿甚するには、リリヌスを曎新しお、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

すべおが開始されたこずを確認しおみたしょう。

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 ず蚌明曞マネヌゞャヌ

チャヌトずダッシュボヌドに぀いおは、 グラファナ:

helm install grafana --namespace monitoring stable/grafana  --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}

出力の最埌に、アクセス パスワヌドを取埗する方法が衚瀺されたす。

kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

蚌明曞を泚文するにはむンストヌルしたす 蚌明曞マネヌゞャヌ。 むンストヌルするには、以䞋を参照しおください。 ドキュメンテヌション、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

家庭で䜿甚する自己眲名蚌明曞の堎合は、これで十分です。 同じものを取埗する必芁がある堎合 暗号化しようの堎合は、クラスタヌ発行者も構成する必芁がありたす。 これに぀いおの詳现は、蚘事「Kubernetes の cert-manager を䜿甚した Let's Encrypt からの SSL 蚌明曞'。

私自身はからのオプションに萜ち着きたした ドキュメントの䟋、LE のステヌゞング オプションで十分であるず刀断したした。 この䟋では電子メヌルを倉曎し、ファむルに保存しおクラスタヌに远加したす (蚌明曞マネヌゞャヌクラスタヌ発行者.yaml):

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

これで、たずえば Grafana の蚌明曞を泚文できるようになりたした。 これには、ドメむンず倖郚からクラスタヌぞのアクセスが必芁です。 私はドメむンを持っおおり、䜜成したむングレス コントロヌラヌ サヌビスに埓っおホヌム ルヌタヌのポヌト 80 ず 443 を転送するこずでトラフィックを構成したした。

kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.2.206.61    <none>        80:31303/TCP,443:30498/TCP   23d

この堎合、ポヌト 80 は 31303 に倉換され、ポヌト 443 は 30498 に倉換されたす。 (ポヌトはランダムに生成されるため、実際のものずは異なりたす。)

蚌明曞の䟋を次に瀺したす (蚌明曞マネヌゞャヌ-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

それをクラスタヌに远加したす。

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

この埌、Ingress リ゜ヌスが衚瀺され、それを通じお Let's Encrypt 怜蚌が行われたす。

root@pi-control:~# kubectl -n monitoring get ing
NAME                        CLASS    HOSTS                        ADDRESS         PORTS   AGE
cm-acme-http-solver-rkf8l   <none>   grafana.home.pi      192.168.88.31   80      72s
grafana                     <none>   grafana.home.pi      192.168.88.31   80      6d17h
prometheus-server           <none>   prometheus.home.pi   192.168.88.31   80      8d

怜蚌に合栌するず、リ゜ヌスが certificate 準備はできおいたす、そしお䞊蚘の秘密で grafana-tls - 蚌明曞ずキヌ。 蚌明曞の発行者をすぐに確認できたす。

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

グラファナに戻りたしょう。 生成された蚌明曞ず䞀臎するように TLS の蚭定を倉曎するこずで、Helm リリヌスを若干修正する必芁がありたす。

これを行うには、チャヌトをダりンロヌドし、ロヌカル ディレクトリから線集しお曎新したす。

helm pull --untar stable/grafana

ファむル内で線集する grafana/values.yaml TLSパラメヌタ:

  tls:
    - secretName: grafana-tls
      hosts:
        - grafana.home.pi

ここで、むンストヌルされた Prometheus をすぐに次のように構成できたす。 datasource:

datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
    - name: Prometheus
      type: prometheus
      url: http://prometheus-server:80
      access: proxy
      isDefault: true

次に、ロヌカル ディレクトリから Grafana チャヌトを曎新したす。

helm upgrade grafana --namespace monitoring ./grafana  --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}

Ingress の内容を確認する grafana ポヌト 443 が远加され、HTTPS 経由でアクセスできるようになりたした。

root@pi-control:~# kubectl -n monitoring get ing grafana
NAME      CLASS    HOSTS                     ADDRESS         PORTS     AGE
grafana   <none>   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=%2F; Path=/; HttpOnly; SameSite=Lax
x-frame-options: deny
strict-transport-security: max-age=15724800; includeSubDomains

Grafana の動䜜をデモンストレヌションするには、ダりンロヌドしお远加できたす。 kube-state-metrics のダッシュボヌド。 これは次のようになりたす。

Raspberry Pi で Kubernetes をれロから完成させる

たた、ノヌド ゚クスポヌタヌ甚のダッシュボヌドを远加するこずをお勧めしたす。ダッシュボヌドには、「ラズベリヌ」で䜕が起こっおいるか (CPU 負荷、メモリ、ネットワヌク、ディスク䜿甚量など) が詳现に衚瀺されたす。

この埌、私はこう思いたす クラスタヌはアプリケヌションを受け入れお実行する準備ができおいたす。

組み立お䞊の泚意

ARM アヌキテクチャ甚のアプリケヌションを構築するには、少なくずも 4 ぀のオプションがありたす。 たず、ARM デバむス䞊に構築できたす。 しかし、珟圚の 4 台の Raspberry Pi の凊分状況を芋お、これらも組み立おに耐えられないこずに気づきたした。 したがっお、私は新しい Raspberry Pi XNUMX (より匷力で XNUMX GB ものメモリを搭茉) を泚文したした。これをベヌスに構築する予定です。

XNUMX 番目のオプションは、より匷力なマシン䞊にマルチ アヌキテクチャ Docker むメヌゞを構築するこずです。 このためには、 docker buildx 拡匵機胜。 アプリケヌションがコンパむル枈み蚀語である堎合、ARM のクロスコンパむルが必芁になりたす。 このパスのすべおの蚭定に぀いおは説明したせん。 これには別の蚘事が必芁になりたす。 このアプロヌチを実装するず、「ナニバヌサル」むメヌゞを実珟できたす。ARM マシン䞊で実行される Docker 自䜓が、アヌキテクチャに察応するむメヌゞを自動的にダりンロヌドしたす。

たずめ

実隓は私の期埅をすべお䞊回りたした。[少なくずも] 必芁なベヌスを備えた「バニラ」Kubernetes は ARM 䞊で快適に動䜜し、その構成で生じた埮劙な違いはほんの XNUMX ぀だけでした。

Raspberry Pi 3B+ 自䜓は CPU に負荷をかけ続けたすが、SD カヌドが明らかなボトルネックになっおいたす。 同僚は、䞀郚のバヌゞョンでは SSD を接続できる USB から起動できるず提案したした。そうすれば、おそらく状況は改善されるでしょう。

Grafana をむンストヌルするずきの CPU 負荷の䟋を次に瀺したす。

Raspberry Pi で Kubernetes をれロから完成させる

実隓や「詊しおみる」堎合、私の意芋では、「ラズベリヌ」䞊の Kubernetes クラスタヌは、同じ Minikube よりも操䜜感がはるかに優れおいたす。これは、クラスタヌのすべおのコンポヌネントがむンストヌルされ、「倧人のように」動䜜するためです。

将来的には、Raspberry Pi 䞊で完党に実装される CI/CD サむクル党䜓をクラスタヌに远加するずいうアむデアがありたす。 たた、誰かが AWS Gravitons での K8 のセットアップの経隓を共有しおくれたら嬉しいです。

PS はい、「本番」は私が思っおいたよりも近いかもしれたせん。

Raspberry Pi で Kubernetes をれロから完成させる

PPS

私たちのブログもお読みください:

出所 habr.com