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

自宅k8sクラスター構築日記

 自宅k8sクラスター構築日記

2023/2/11
小江戸らぐ 2月のオフな集まり(第247回)

当日作ったスライドなので、一部未完でアドリブで乗り切ってます(が、そのまま公開します)。

世良泰明

October 03, 2023
Tweet

More Decks by 世良泰明

Other Decks in Technology

Transcript

  1. 自宅k8sクラスター構築日記
    2023/2/11
    小江戸らぐ 1月のオフな集まり(第247回)
    世良泰明

    View Slide

  2. 自己紹介
    名前:
    世良 泰明 (せら やすあき)
    職業:
    ひよっこインフラエンジニア (2年目)
    名古屋の某SIer所属
    AWS上でインフラ構築・運用
    趣味:
    囲碁, サイクリング, 散歩, etc…
    twitter: @y_sera15
    自宅K8sクラスター

    View Slide

  3. 今日の話
    お家で育てているk8sクラスター
    コンテナアプリをIPを持たせて(自宅LAN内で)公開したい
    そのための試行錯誤の記録
    やったこと
    ・BGP不通の検証
    ・新規LAN構築
    ・クラスター移行
    ・ESXi管理用NWとVM用NWの分離

    View Slide

  4. 構成
    物理マシン3台の上に仮想マシンを立てた(Ubuntu22.04)
    ・control plane node 3台
    ・worker node 3台
    ・ロードバランサー(haproxy+ keepalive) 2台
    NUC1
    ESXi
    control plane
    1
    worker1
    haproxy1
    NUC2
    ESXi
    control plane
    2
    worker2
    haproxy2
    NUC3
    ESXi
    control plane
    3
    worker3

    View Slide

  5. worker3
    やりたいこと
    control plane
    1
    haproxy1
    control plane
    2
    worker2
    haproxy2
    control plane
    3
    APIへのアクセス
    デスクトップ
    端末
    6443/tcp
    kubectl
    kube-apiserver
    Load
    Balancer
    kubernetesの
    クラスターを制御
    するノード
    6443/tcp
    コンテナを動かす
    ノード
    worker1
    kubernetes上で動かすコンテナにアクセスしたい

    View Slide

  6. worker3
    やりたいこと
    kubernetes上で動かすコンテナにアクセスしたい
    control plane
    1
    worker1
    haproxy1
    control plane
    2
    worker2
    haproxy2
    control plane
    3
    APIへのアクセス
    デスクトップ
    端末
    6443/tcp
    kubectl
    kube-apiserver
    Load
    Balancer
    kubernetesの
    クラスターを制御
    するノード
    6443/tcp
    コンテナを動かす
    ノード
    コンテナのアプリ
    にアクセスできる
    ようにしたい
    http:80

    View Slide

  7. 当時の構成の前に
    前提知識
    ・kubernetesのネットワーク
    ・コンテナへのアクセス方法

    View Slide

  8. kubernetesのネットワーク
    ・各ノードのネットワーク 192.168.100.0/24
    ・コンテナの世界のネットワーク 10.0.0.0/8
    worker3
    worker1 worker2
    192.168.100.0/24
    192.168.100.34 192.168.100.66 192.168.100.98
    kubernetesは2つの層のネットワークがある
    10.0.0.0/8
    ノード間でコンテナの世界のネットワークを繋げる機能
    ⇒ CNIというプラグインにより提供

    View Slide

  9. コンテナへのアクセス方法
    方法としては(ざっくり)3つ
    1.ノードのポートと紐づける
    ⇒ノード依存する, ポート被りを意識しないといけないから嫌
    2.外部のロードバランサーを利用する
    ⇒ 管理対象が増えるのは面倒
    3.k8s上でロードバランサーとして機能するアプリを利用する(例:metallb)
    ⇒ これを使いたい
    worker
    worker
    worker
    8080:80
    デスクトップ
    端末
    8080
    デスクトップ
    端末
    Loadbarancer
    worker
    worker
    デスクトップ
    端末
    Loadbarancer

    View Slide

  10. metallb
    ベアメタルなkubernetesに構築できる, クラスター外のIPでアクセス可能なロードバランサー
    https://metallb.universe.tf/
    L2プロトコルかBGPを利用.
    (L2だと負荷分散はできない)

    View Slide

  11. cilium
    k8s用のネットワークプラグインの1つ
    https://cilium.io/get-started
    eBPFという, カーネルに動的にプログラムを埋め込む機能を利用している.
    metallbと同様の機能も提供.
    今回のクラスター構築で採用.

    View Slide

  12. やったこと
    ・BGP不通の検証
    ・新規LAN構築
    ・クラスター移行
    ・ESXi管理用NWとVM用NWの分離

    View Slide

  13. 前回までの進捗
    ciliumを用いてクラスター再構築

    ルータのBGPの設定方法分からん ←1月小江戸らぐ 昼の部

    ルータのBGP設定したけどつながらん ←1月小江戸らぐ 夜の部
    今回は原因調査からスタート

    View Slide

  14. 原因調査
    BGPパケットを送信しているpodに入り, tcpdumpをしてみた
    $ kubectl exec -n kube-system cilium-wmjw8 -it /bin/bash
    $ apt update
    $ apt install tcpdump
    $ tcpdump -n -v -i any tcp port 179

    View Slide

  15. 原因調査 結果

    View Slide

  16. 原因調査 結果
    要点
    ・TCP通信は疎通している
    ・BGP通信の開始を試みて, 失敗している
    ・Optional BGPのパラメータエラーと怒られている.
    ・Optional パラメータとして, Multiprotocol Extentionというワードあり

    View Slide

  17. 原因調査 裏付け調査
    自宅ルータ(RTX1220)が
    拡張BGPに対応してなかった
    Multiprotocol BGPとは
    ・複数のアドレスタイプを指定できるように拡張されたBGPのこと.
    ・BGP-4ではipv4のユニキャストしか利用できなかったが、
    MP-BGPではipv6及びマルチキャストを利用できる.
    ・RFC4760(現在はRFC7606にupdateされている)
    https://www.rfc-editor.org/rfc/rfc4760 (https://www.rfc-editor.org/rfc/rfc7606)
    利用していたルーター(YAMAHA RTX1220)
    http://www.rtpro.yamaha.co.jp/RT/docs/bgp/index.html#rt

    View Slide

  18. Edgeルータ購入
    EdgeRouter X
    ・k8s自宅クラスタ勢がよく使用してるルータ
    ・業務用ルータ並みの豊富な機能
    ・価格は安め(amazonで1.6万円くらい)
    ・ベースOSはlinux

    View Slide

  19. 自宅LAN拡張
    FWの設定で躓くも, 無事開通

    View Slide

  20. クラスター移行(失敗)
    せっかくなので, k8sクラスターを生きたまま移行させようと試みた
    etcd内の設定が悪さをしたか何かでmasterノードは移行失敗.
    (etcd, apiServerのpodが上がりきらない)
    諦めてゼロから再構築へ.
    ・master3, worker3をシャットダウン
    ・ESXiホスト3をEdgeRouter配下へ移動
    ・master3, worker3の起動
    ・再度クラスターへ参加

    View Slide

  21. 再構築
    ESXiホストを全てEdgeRouter配下へ移動
    各ノード, apiServer用ロードバランサのIP変更
    kubeadmで1台ずつノード構築
    ・kube-proxy無効化
    k8sクラスター設定
    ・BGP広報するCIDRレンジ登録
    ciliumインストール
    ・BGP設定有効化
    edgeRouter側のBGP設定
    ・AS番号, neighborのIP設定
    疎通確認
    ⇒無事疎通!!!
    参考(EdgeRouterのBGP設定)
    https://qiita.com/suzuyui/items/c83554
    dd055ef0f4253a

    View Slide

  22. おまけ
    ESXiの管理用NWとVM用NWの分離

    View Slide

  23. まとめ
    自宅k8sクラスタでアプリ公開ができるLBを立てた
    やったこと
    ・パケット解析
    ・自宅LANを拡張
    ・k8sクラスターライブマイグレーション(失敗)
    ・アプリ用, VM用, ESXi管理用のセグメント分離
    やり残したこと
    ・各セグメントのFW設定
    ・現在のBGP設定は

    View Slide

  24. まとめ&現状/今後
    まとめ&現状
    metallbをBGPを利用して動作させるため, CNIを入れ替えてkubernetesクラスターを
    ドキュメントが英語なのと、何が分からないか分からないので難しい…

    View Slide