Upgrade to Pro — share decks privately, control downloads, hide ads and more …

高可用性、省力運用を目指す 自宅 Kubernetes クラスタ ([email protected] #1)

Kazuki Suda
October 12, 2022

高可用性、省力運用を目指す 自宅 Kubernetes クラスタ ([email protected] #1)

私が趣味として自宅で飼っている Kubernetes ラズパイクラスタを紹介します。ここでは工夫ポイントとして次の3点についてお話します。

→ 工夫その1: HA なコントロールプレーン、MetalLB + BGP による kube-apiserver の負荷分散
→ 工夫その2: モニタリングをそれなりにちゃんとやっとく
→ 工夫その3: Renovate によるアドオンのアップグレードの省力化

[email protected] #1 (2022/10/12) - https://k8shome.connpass.com/event/259491/

Kazuki Suda

October 12, 2022
Tweet

More Decks by Kazuki Suda

Other Decks in Technology

Transcript

  1. @superbrothers [email protected] #1 (2022/10/12) Kazuki Suda (@superbrothers) ⾼可⽤性、省⼒運⽤を⽬指す ⾃宅 Raspberry

    Pi Kubernetes クラスタ
  2. @superbrothers 2 SUDA Kazuki / @superbrothers ▶ Preferred Networks, Inc.

    / エンジニア ▶ Scalar, Inc. / 技術アドバイザ ▶ Kubernetes Meetup Tokyo 共同主催者 ▶ Cloud Native Ambassador (CNCF) ▶ 技術評論社「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ オライリー「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書 ▶ stern ツールメンテナ(https://github.com/stern/stern)
  3. @superbrothers アジェンダ 1. なぜ⾃宅 Kubernetes クラスタ? 2. クラスタ構築時の基本⽅針 3. クラスタの環境と構成

    4. クラスタ構築とアップグレード⽅法 5. そのほか! 6. まとめ 3
  4. @superbrothers なぜ⾃宅 Kubernetes クラスタ?

  5. @superbrothers おれが考えた最強の Kubernetes クラスタ😎 ▶ 好き勝⼿にできる + 業務では試せていない/使っていない構成、ツール、アドオンを使える環境がほしい + 業務ではいろんな制約がある、歴史的な事情とか

    + 業務では使えていない CNI プラグインやアドオンを採⽤してみて感触を得られる + こんなこともあろうかと!ができる(こともある) + Kind ツールで試すこともできるけど、実際に運⽤/継続して使ってみないとってこともある + ⾯倒になったらいつでもやめられる ▶ ローカルやクラウドでもいいけど、物理でやるのはただ楽しいから + 趣味なので、好きがいちばん優先 5
  6. @superbrothers クラスタ構築時の基本⽅針

  7. @superbrothers クラスタ構築時の基本⽅針 → ⾼可⽤性、省⼒運⽤ ▶ 壊れて⼀から構築し直しになると、そのタイミングで放置しちゃいがち + クラスタ全体がダウンするのをできる限り避ける ▶ ⽇々のアドオンのメンテに時間を取られたくない

    + アニメも⾒たいし、読書もしたいしで、こればかりやってるわけにもいかない(趣味なので) → ⼯夫その1: HA なコントロールプレーン、MetalLB + BGP による kube-apiserver の負荷分散 → ⼯夫その2: モニタリングをそれなりにちゃんとやっとく → ⼯夫その3: Renovate によるアドオンのアップグレードの省⼒化 7 !"#$%&'()*+,-. /"012345678,%9:;<=>[email protected];
  8. @superbrothers クラスタの環境と構成

  9. @superbrothers ハードウェア構成 9 Control plane Worker Raspberry Pi 4 4GB

    + PoE hat M.2 SSD 250GB Raspberry Pi 4 8GB + PoE hat M.2 SSD 500GB TP-Link PoE ハブ Raspberry Pi 4 8GB + PoE hat M.2 SSD 500GB Raspberry Pi 4 8GB + PoE hat M.2 SSD 500GB Raspberry Pi 4 4GB + PoE hat M.2 SSD 250GB Raspberry Pi 4 4GB + PoE hat M.2 SSD 250GB TP-Link PoE ハブ EdgeRouter X DEFGHFIFJKLIMNOPQJRSTU) VWXJ2YZ5[(\ J]^KJ_#`a)bc)[email protected]\ e#fg#hij4+k57
  10. @superbrothers WLLPMNOlJmnoJppq. JJ0$r#stuv#h XNwJx^y z{|5}

  11. @superbrothers ハードウェア構成 11 Raspberry Pi 4 4GB メモリ 3 Raspberry

    Pi 4 8GB メモリ 3 Raspberry Pi PoE+ HAT 6 Geekworm M.2 SATA SSD ストレージ拡張ボード 100206-TB 6 Western Digital SSD 250GB WDS250G2B0B-EC 3 Western Digital M.2 SSD 500GB 
 WDS500G2B0B-EC 3 TP-Link PoE ハブ TL-SG1005P 2 EdgeRouter X 1 ~•i€•k‚ƒ„=j4+…†2\k5‡ˆ🙃 e#fg#h%‰Šk‚(‹Œ•Ž•k57•
  12. @superbrothers 下駄箱クラスタ ▶ ⾃宅の下駄箱にクラスタを設置 ▶ メリット + ⾳が気にならない + ファンがうるさいので⾃室に置きたくなかった

    ▶ デメリット + 熱がこもりがち。扉を締め切らないようにしてる + ⽞関まで⼈が⼊ったときにめっちゃ⾒られる + 砂埃が若⼲気になる 12 ‘’SJ“HELO”LILQ. JJJJJ/"01_#0}😎 DEFGHFI•KLIMNOPQS–~a#1
  13. @superbrothers erx $ ip r ... 192.168.1.1 proto zebra nexthop

    via 192.168.0.12 dev eth1 weight 1 nexthop via 192.168.0.11 dev eth1 weight 1 nexthop via 192.168.0.10 dev eth1 weight 1 pi02 (192.168.0.12) pi01 (192.168.0.11) ソフトウェア構成 / コントロールプレーン冗⻑化 13 pi00 (192.168.0.10) EdgeRouter X kube-apiserver kubelet metallb-controller kube-apiserver metallb-speaker kube-apiserver metallb-speaker etcd etcd etcd BGP https://192.168.1.1:16443 metallb-speaker kubelet kubelet EdgeRouter X —˜™š›$‡Sœ• mLIžŸ]VJ JVWXJ)SJPHEL¡ž¢FQLO£LOJS¤¥¦ LI§¨J©ª«¬>-œ«®>5© /"01¯›°%±²)45[(\
  14. @superbrothers pi12 (192.168.10.12) pi11 (192.168.10.11) ソフトウェア構成 / ワーカノード、Ingress 14 pi10

    (192.168.10.10) EdgeRouter X ingress-nginx kubelet metallb-speaker metallb-speaker BGP Service namespace: ingress-nginx type: LoadBalancer externalIP: 192.168.2.0 selector: app=ingress-nginx ports: 80, 443 erx $ ip r ... 192.168.2.0 proto zebra nexthop via 192.168.10.12 dev eth1 weight 1 nexthop via 192.168.10.11 dev eth1 weight 1 nexthop via 192.168.10.10 dev eth1 weight 1 https://grafana.home.example.com/ metallb-speaker kubelet kubelet Ingress namespace: monitoring hosts: grafana.home.example.com svc: grafana tls: ingress-cert ingressClass: nginx grafana cert-manager Let’s Encrypt Google Cloud DNS external-dns
  15. @superbrothers Pi cluster Rook Ceph Google Cloud Managed Prometheus ソフトウェア構成

    / モニタリング 15 kube-prometheus-stack promtail alertmanager-to-github kubernetes-event-exporter snmp-exporter Grafana Cloud PV Edge Router GitHub Slack PV —˜™š›$‡So• ‡>³\´µ¶(,k‚·¸1¯›°2)47¹ˆ´}
  16. @superbrothers 16 Prometheus ¥º»¼´*½k)Yd5¾57 メトリクス監視 / Prometheus Google Cloud Managed

    Prometheus Rook Ceph PV gmp-frontend Grafana WmXJ¿ÀSJXONlLIÁLHQJ%YˆÂì\} žOlÄÅJšÆ#s2³6S)‘Ç)Èahk57 `ÉÊ/0$r#s)É#fa)©Æ$¯/0%Ë̦
  17. @superbrothers 17 promtail Grafana Cloud ͯ#Î"›)©ÏÐÑWFV?)ÒÓ)YZ5[(\ ログ監視 / Grafana Loki

  18. @superbrothers アラート通知 / pfnet-research/alertmanager-to-github 18 alertmanager-to-github !"#$%JWFIxHEJÔQQHLJ¦} ¿ÀÕÖ%š×Ø#´»Ù)47•‘Ú/É#Û´©¿À} GitHub alertmanager

    Prometheus Slack §OFIF§žŸJiš×Ø#¦ ÜžO”F”ÝJiJpŸž§PJ´Þ@‹Œ)ßàáâ
  19. @superbrothers resmoio/kubernetes-event-exporter 19 kubernetes-event-exporter Slack “HELO”LILQJL£L”IQJ%JpŸž§PJ´ãä} ]F£L”LQQJ¢ONELJ2åæ´çèk57³#„= ¯é#0Ãê…Sëì@4d„Œ´k‚\ ßàiáâ)-!"#$2†2d‚=¿À•

  20. @superbrothers 20 ネットワーク Cilium, MetalLB, Ingress-nginx ストレージ Rook Ceph モニタリング

    metrics-server, 
 kube-prometheus-stack (Prometheus, Alertmanager, Grafana, 
 node-exporter, kube-state-metrics), 
 promtail, alertmanager-to-github, 
 snmp-exporter, kubernetes-event-exporter GitOps Flux v2 シークレット管理 sealed-secret そのほか external-dns (Cloud DNS), kubelet-csr-approver, descheduler, remo- exporter, hubot, Crossplane (GCP), cert-manager アドオン íÍîa$S!"#$a#a266;<³S)- ï\³6ðÇ%¬,„=ïk56+S2*@@ñ
  21. None
  22. @superbrothers クラスタ構築とアップグレード⽅法

  23. @superbrothers ノードのプロビジョニング ▶ Ansible + kubeadm でやってる + ⼯夫といっても CI

    で ansible-lint と yamllint を使ってるくらい ▶ cluster-api-provider-bringyourownhost が気になっている + プロビジョニング済みのホストを対象とした Cluster API のインフラストラクチャプロバイダ + ⾃宅のクラスタでも Cluster API を使ってクラスタアップグレード等が可能になる + Kubernetes バージョンのアップグレードがプロバイダに縛られちゃう + メンテ状況があまりよくない雰囲気なので、⾃分で作っちゃってもいいかなという気持ちもある 23 ñdµ¶ò«ˆ)@ óô)JõŸHQILOJ^XÔJSš›Í"0$"/ö÷ÎÉøšù%’d57S)-äëi¬7😎
  24. @superbrothers Kubernetes アップグレード⽅法 ▶ Ansible Playbook を新しいバージョンに修正 + Kubernetes, containerd,

    nerdctl ▶ ⼿動で⼀台ずつ順繰りに更新 + kubectl drain <node> —ignore-daemonsets —delete-emptydir-data + kubectl delete node <node> + sudo apt update && sudo apt upgrade && sudo reboot + ansible-playbook site.yml -K --limit pi10 + コントロールプレーンノード上で kubeadm token create コマンドを実⾏ + 対象のノード上で kubeadm join コマンドを実⾏ 24 ¨LŸLÝžILúINJ)û›$É#aÎr#›g#h)10/%üý 8dµ©?¬ò«ˆ)@ !Êΰr#hS‚þ´ÿk54>6´k567
  25. @superbrothers そのほか!

  26. @superbrothers Renovate による 
 アドオンのアップグレード省⼒化 26 —˜‡Sª!JxLŸlJõÁžOIJ´"#2¬7,$%´JX&J%«+7} ‘'/"01)&(¾%«+d5óô´©²µ'(‹• xLŸlJõÁžOIJi)*´JÁLŸlJILl¢ŸžILJ)+,k5-¸Í.0$Í/ša,k50² õÔJ)1Ç%23)47¹ˆ´k545k5-#s)47

    6»o«S!/×7›)ûÆ›[email protected]•*@@ñ} ¡JF”Iœo:;ÁF¨L¡§NllL”I¡ž§IFN”<£œ ¡JF”Iœo:;§NllL”I¡ž§IFN”<£œ
  27. @superbrothers kenfdev/remo-exporter 27 Nature Remo =>[email protected]´A6S)BC2D6,!"#$} EF¦FGHC©Æ$¯/0¦k5!"#[email protected]¹56 repo-exporter Prometheus KžIHOLJ&LlNJ^XÔJSr0™›0%J^XÔJ¦k5+>7

  28. @superbrothers まとめ

  29. @superbrothers ⾼可⽤性、省⼒運⽤を⽬指す、⾃宅ラズパイクラスタ ▶ ⼯夫その1: HA なコントロールプレーン、MetalLB + BGP による kube-apiserver

    の負荷分散 + クラスタ全体がダウンすると復旧が⾯倒で放置しがちなので + HA にしとけば1台死んでも楽に復旧できる ▶ ⼯夫その2: モニタリングをそれなりにちゃんとやっとく + 気づいたら死んでたを回避 + ⽇々少しずつチューニングできるように ▶ ⼯夫その3: Renovate によるアドオンのアップグレードの省⼒化 + ⽇々のアドオンのメンテに時間を取られたくないけど、最新を使ってはいきたい 29
  30. @superbrothers Appendix ▶ 周りと差をつけよう!Kubernetes 型 Raspberry Pi クラスタケースのつくりかた - Qiita

    + https://qiita.com/superbrothers/items/0fa69a9554654388f2d2 ▶ vmware-tanzu/cluster-api-provider-bringyourownhost: Kubernetes Cluster API Provider BYOH for already-provisioned hosts running Linux. + https://github.com/vmware-tanzu/cluster-api-provider-bringyourownhost ▶ renovatebot/renovate: Universal dependency update tool that fi ts into your work fl ows. + https://github.com/renovatebot/renovate 30