2023/2/11 小江戸らぐ 2月のオフな集まり(第247回)
当日作ったスライドなので、一部未完でアドリブで乗り切ってます(が、そのまま公開します)。
自宅k8sクラスター構築日記2023/2/11小江戸らぐ 1月のオフな集まり(第247回)世良泰明
View Slide
自己紹介名前:世良 泰明 (せら やすあき)職業:ひよっこインフラエンジニア (2年目)名古屋の某SIer所属AWS上でインフラ構築・運用趣味:囲碁, サイクリング, 散歩, etc…twitter: @y_sera15自宅K8sクラスター
今日の話お家で育てているk8sクラスターコンテナアプリをIPを持たせて(自宅LAN内で)公開したいそのための試行錯誤の記録やったこと・BGP不通の検証・新規LAN構築・クラスター移行・ESXi管理用NWとVM用NWの分離
構成物理マシン3台の上に仮想マシンを立てた(Ubuntu22.04)・control plane node 3台・worker node 3台・ロードバランサー(haproxy+ keepalive) 2台NUC1ESXicontrol plane1worker1haproxy1NUC2ESXicontrol plane2worker2haproxy2NUC3ESXicontrol plane3worker3
worker3やりたいことcontrol plane1haproxy1control plane2worker2haproxy2control plane3APIへのアクセスデスクトップ端末6443/tcpkubectlkube-apiserverLoadBalancerkubernetesのクラスターを制御するノード6443/tcpコンテナを動かすノードworker1kubernetes上で動かすコンテナにアクセスしたい
worker3やりたいことkubernetes上で動かすコンテナにアクセスしたいcontrol plane1worker1haproxy1control plane2worker2haproxy2control plane3APIへのアクセスデスクトップ端末6443/tcpkubectlkube-apiserverLoadBalancerkubernetesのクラスターを制御するノード6443/tcpコンテナを動かすノードコンテナのアプリにアクセスできるようにしたいhttp:80
当時の構成の前に前提知識・kubernetesのネットワーク・コンテナへのアクセス方法
kubernetesのネットワーク・各ノードのネットワーク 192.168.100.0/24・コンテナの世界のネットワーク 10.0.0.0/8worker3worker1 worker2192.168.100.0/24192.168.100.34 192.168.100.66 192.168.100.98kubernetesは2つの層のネットワークがある10.0.0.0/8ノード間でコンテナの世界のネットワークを繋げる機能⇒ CNIというプラグインにより提供
コンテナへのアクセス方法方法としては(ざっくり)3つ1.ノードのポートと紐づける⇒ノード依存する, ポート被りを意識しないといけないから嫌2.外部のロードバランサーを利用する⇒ 管理対象が増えるのは面倒3.k8s上でロードバランサーとして機能するアプリを利用する(例:metallb)⇒ これを使いたいworkerworkerworker8080:80デスクトップ端末8080デスクトップ端末Loadbarancerworkerworkerデスクトップ端末Loadbarancer
metallbベアメタルなkubernetesに構築できる, クラスター外のIPでアクセス可能なロードバランサーhttps://metallb.universe.tf/L2プロトコルかBGPを利用.(L2だと負荷分散はできない)
ciliumk8s用のネットワークプラグインの1つhttps://cilium.io/get-startedeBPFという, カーネルに動的にプログラムを埋め込む機能を利用している.metallbと同様の機能も提供.今回のクラスター構築で採用.
やったこと・BGP不通の検証・新規LAN構築・クラスター移行・ESXi管理用NWとVM用NWの分離
前回までの進捗ciliumを用いてクラスター再構築↓ルータのBGPの設定方法分からん ←1月小江戸らぐ 昼の部↓ルータのBGP設定したけどつながらん ←1月小江戸らぐ 夜の部今回は原因調査からスタート
原因調査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
原因調査 結果
原因調査 結果要点・TCP通信は疎通している・BGP通信の開始を試みて, 失敗している・Optional BGPのパラメータエラーと怒られている.・Optional パラメータとして, Multiprotocol Extentionというワードあり
原因調査 裏付け調査自宅ルータ(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
Edgeルータ購入EdgeRouter X・k8s自宅クラスタ勢がよく使用してるルータ・業務用ルータ並みの豊富な機能・価格は安め(amazonで1.6万円くらい)・ベースOSはlinux
自宅LAN拡張FWの設定で躓くも, 無事開通
クラスター移行(失敗)せっかくなので, k8sクラスターを生きたまま移行させようと試みたetcd内の設定が悪さをしたか何かでmasterノードは移行失敗.(etcd, apiServerのpodが上がりきらない)諦めてゼロから再構築へ.・master3, worker3をシャットダウン・ESXiホスト3をEdgeRouter配下へ移動・master3, worker3の起動・再度クラスターへ参加
再構築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/c83554dd055ef0f4253a
おまけESXiの管理用NWとVM用NWの分離
まとめ自宅k8sクラスタでアプリ公開ができるLBを立てたやったこと・パケット解析・自宅LANを拡張・k8sクラスターライブマイグレーション(失敗)・アプリ用, VM用, ESXi管理用のセグメント分離やり残したこと・各セグメントのFW設定・現在のBGP設定は
まとめ&現状/今後まとめ&現状metallbをBGPを利用して動作させるため, CNIを入れ替えてkubernetesクラスターをドキュメントが英語なのと、何が分からないか分からないので難しい…