$30 off During Our Annual Pro Sale. View Details »

高可用性、省力運用を目指す 自宅 Kubernetes クラスタ (K8s@home #1)

Kazuki Suda
October 12, 2022

高可用性、省力運用を目指す 自宅 Kubernetes クラスタ (K8s@home #1)

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

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

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

    View Slide

  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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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•

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. @superbrothers
    アラート通知 / pfnet-research/alertmanager-to-github
    18
    alertmanager-to-github
    !"#$%JWFIxHEJÔQQHLJ¦}


    ¿ÀÕÖ%š×Ø#´»Ù)47•‘Ú/É#Û´©¿À}
    GitHub
    alertmanager
    Prometheus
    Slack
    §OFIF§žŸJiš×Ø#¦
    ÜžO”F”ÝJiJpŸž§PJ´Þ@‹Œ)ßàáâ

    View Slide

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

    View Slide

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

    View Slide

  21. View Slide

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

    View Slide

  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😎

    View Slide

  24. @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

    View Slide

  25. @superbrothers
    そのほか!

    View Slide

  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›)ûÆ›$895?@•*@@ñ}


    ¡JF”Iœo:;ÁF¨L¡§NllL”I¡ž§IFN”<£œ


    ¡JF”Iœo:;§NllL”I¡ž§IFN”<£œ

    View Slide

  27. @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

    View Slide

  28. @superbrothers
    まとめ

    View Slide

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

    View Slide

  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

    View Slide