Slide 1

Slide 1 text

@superbrothers K8s@home #1 (2022/10/12) Kazuki Suda (@superbrothers) ⾼可⽤性、省⼒運⽤を⽬指す ⾃宅 Raspberry Pi Kubernetes クラスタ

Slide 2

Slide 2 text

@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)

Slide 3

Slide 3 text

@superbrothers アジェンダ 1. なぜ⾃宅 Kubernetes クラスタ? 2. クラスタ構築時の基本⽅針 3. クラスタの環境と構成 4. クラスタ構築とアップグレード⽅法 5. そのほか! 6. まとめ 3

Slide 4

Slide 4 text

@superbrothers なぜ⾃宅 Kubernetes クラスタ?

Slide 5

Slide 5 text

@superbrothers おれが考えた最強の Kubernetes クラスタ😎 ▶ 好き勝⼿にできる + 業務では試せていない/使っていない構成、ツール、アドオンを使える環境がほしい + 業務ではいろんな制約がある、歴史的な事情とか + 業務では使えていない CNI プラグインやアドオンを採⽤してみて感触を得られる + こんなこともあろうかと!ができる(こともある) + Kind ツールで試すこともできるけど、実際に運⽤/継続して使ってみないとってこともある + ⾯倒になったらいつでもやめられる ▶ ローカルやクラウドでもいいけど、物理でやるのはただ楽しいから + 趣味なので、好きがいちばん優先 5

Slide 6

Slide 6 text

@superbrothers クラスタ構築時の基本⽅針

Slide 7

Slide 7 text

@superbrothers クラスタ構築時の基本⽅針 → ⾼可⽤性、省⼒運⽤ ▶ 壊れて⼀から構築し直しになると、そのタイミングで放置しちゃいがち + クラスタ全体がダウンするのをできる限り避ける ▶ ⽇々のアドオンのメンテに時間を取られたくない + アニメも⾒たいし、読書もしたいしで、こればかりやってるわけにもいかない(趣味なので) → ⼯夫その1: HA なコントロールプレーン、MetalLB + BGP による kube-apiserver の負荷分散 → ⼯夫その2: モニタリングをそれなりにちゃんとやっとく → ⼯夫その3: Renovate によるアドオンのアップグレードの省⼒化 7 !"#$%&'()*+,-. /"012345678,%9:;<=>?@ABC;

Slide 8

Slide 8 text

@superbrothers クラスタの環境と構成

Slide 9

Slide 9 text

@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)45@d4\ e#fg#hij4+k57

Slide 10

Slide 10 text

@superbrothers WLLPMNOlJmnoJppq. JJ0$r#stuv#h XNwJx^y z{|5}

Slide 11

Slide 11 text

@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•

Slide 12

Slide 12 text

@superbrothers 下駄箱クラスタ ▶ ⾃宅の下駄箱にクラスタを設置 ▶ メリット + ⾳が気にならない + ファンがうるさいので⾃室に置きたくなかった ▶ デメリット + 熱がこもりがち。扉を締め切らないようにしてる + ⽞関まで⼈が⼊ったときにめっちゃ⾒られる + 砂埃が若⼲気になる 12 ‘’SJ“HELO”LILQ. JJJJJ/"01_#0}😎 DEFGHFI•KLIMNOPQS–~a#1

Slide 13

Slide 13 text

@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[(\

Slide 14

Slide 14 text

@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

Slide 15

Slide 15 text

@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¹ˆ´}

Slide 16

Slide 16 text

@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%Ë̦

Slide 17

Slide 17 text

@superbrothers 17 promtail Grafana Cloud ͯ#Î"›)©ÏÐÑWFV?)ÒÓ)YZ5[(\ ログ監視 / Grafana Loki

Slide 18

Slide 18 text

@superbrothers アラート通知 / pfnet-research/alertmanager-to-github 18 alertmanager-to-github !"#$%JWFIxHEJÔQQHLJ¦} ¿ÀÕÖ%š×Ø#´»Ù)47•‘Ú/É#Û´©¿À} GitHub alertmanager Prometheus Slack §OFIF§žŸJiš×Ø#¦ ÜžO”F”ÝJiJpŸž§PJ´Þ@‹Œ)ßàáâ

Slide 19

Slide 19 text

@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‚=¿À•

Slide 20

Slide 20 text

@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*@@ñ

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

@superbrothers クラスタ構築とアップグレード⽅法

Slide 23

Slide 23 text

@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😎

Slide 24

Slide 24 text

@superbrothers Kubernetes アップグレード⽅法 ▶ Ansible Playbook を新しいバージョンに修正 + Kubernetes, containerd, nerdctl ▶ ⼿動で⼀台ずつ順繰りに更新 + kubectl drain —ignore-daemonsets —delete-emptydir-data + kubectl delete 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

Slide 25

Slide 25 text

@superbrothers そのほか!

Slide 26

Slide 26 text

@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›)ûÆ›$895?@•*@@ñ} ¡JF”Iœo:;ÁF¨L¡§NllL”I¡ž§IFN”<£œ ¡JF”Iœo:;§NllL”I¡ž§IFN”<£œ

Slide 27

Slide 27 text

@superbrothers kenfdev/remo-exporter 27 Nature Remo =>i?@´A6S)BC2D6,!"#$} EF¦FGHC©Æ$¯/0¦k5!"#$@7¹56 repo-exporter Prometheus KžIHOLJ&LlNJ^XÔJSr0™›0%J^XÔJ¦k5+>7

Slide 28

Slide 28 text

@superbrothers まとめ

Slide 29

Slide 29 text

@superbrothers ⾼可⽤性、省⼒運⽤を⽬指す、⾃宅ラズパイクラスタ ▶ ⼯夫その1: HA なコントロールプレーン、MetalLB + BGP による kube-apiserver の負荷分散 + クラスタ全体がダウンすると復旧が⾯倒で放置しがちなので + HA にしとけば1台死んでも楽に復旧できる ▶ ⼯夫その2: モニタリングをそれなりにちゃんとやっとく + 気づいたら死んでたを回避 + ⽇々少しずつチューニングできるように ▶ ⼯夫その3: Renovate によるアドオンのアップグレードの省⼒化 + ⽇々のアドオンのメンテに時間を取られたくないけど、最新を使ってはいきたい 29

Slide 30

Slide 30 text

@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