Slide 1

Slide 1 text

logica X: @logica0419 GitHub: @logica0419 kube-vipと kube-proxy置き換え Ciliumを積んだ究極の K3sクラスタを建てる

Slide 2

Slide 2 text

自己紹介 ● logica (ろじか) ● 千葉工業大学 情報科学部 情報ネットワーク学科 3年 ● ネットワークコンテンツ研究会 所属 ○ 数人の自宅サーバーをVPNで繋いでクラウド基盤 作ろうとしてます ● 最近はKWOKへのコントリビューションや セキュリティ・ミニキャンプ講師などを やってました

Slide 3

Slide 3 text

HAクラスタの Control Plane ロードバランシング問題

Slide 4

Slide 4 text

Control Planeが複数あるクラスタ Plane Plane Plane

Slide 5

Slide 5 text

どこ接続すればいいか、わからない Plane Plane Plane ???

Slide 6

Slide 6 text

固定してしまったら Plane Plane Plane

Slide 7

Slide 7 text

死んだとき Plane Plane Plane

Slide 8

Slide 8 text

一巻の終わり Plane Plane Plane 💥

Slide 9

Slide 9 text

死んだときには Plane Plane Plane

Slide 10

Slide 10 text

別の所に接続できるように欲しい Plane Plane Plane

Slide 11

Slide 11 text

Control Planeのロードバランシング ● コントロールプレーンを冗長化した際、外部から apiserverに常に接続できる状態を維持する ○ どこかのノードが死んだらフォールバックする ○ 同一のIPアドレスで常に接続できる ● Kubernetesエコシステムの中にはツールが無い ○ “Since this is not part of Kubernetes or kubeadm, this must be taken care of separately.” とドキュメントに書いてある

Slide 12

Slide 12 text

ロードバランサーの選択肢 https://github.com/kubernetes/kubeadm/blob/main /docs/ha-considerations.md#options-for-software- load-balancing で取れる選択肢が提示されている 1. Keepalived と HAProxy 2. kube-vip

Slide 13

Slide 13 text

Keepalived と HAProxy keepalived keepalived keepalived keepalived

Slide 14

Slide 14 text

Keepalived と HAProxy keepalived keepalived keepalived keepalived 仮想 IP

Slide 15

Slide 15 text

Keepalived と HAProxy keepalived keepalived keepalived keepalived 仮想 IP

Slide 16

Slide 16 text

Keepalived と HAProxy keepalived keepalived keepalived keepalived 仮想 IP

Slide 17

Slide 17 text

Keepalived と HAProxy keepalived keepalived keepalived keepalived 仮想 IP 仮想 IP

Slide 18

Slide 18 text

Keepalived と HAProxy 仮想IP HAProxy Plane Plane Plane

Slide 19

Slide 19 text

Keepalived と HAProxy HAProxy Plane Plane Plane keepalived 仮想IP HAProxy keepalived HAProxy keepalived

Slide 20

Slide 20 text

kube-vip ● Kubernetes用に設計された、keepalivedとHAProxyの 代替ソフトウェア ○ どちらの機能も備えている ● Keepalived & HAProxyと比べて設定が楽 ○ Keepalived & HAProxy ■ KeepalivedとHAProxyの設定をする知識が必要 ○ kube-vip ■ kube-vipのCLIによって設定の生成が可能

Slide 21

Slide 21 text

デプロイについて ● Static Pod ○ Kubeletベースの機能 (K3sとかは対応してない) ○ Kubernetesと別のライフサイクルを持つコンテナ をKubeletが建てて、保全してくれる ● それぞれのデプロイ事情 ○ K & HA: スタンドアロン (Planeと別マシン) か Static Pod (Planeと同マシン) ○ kube-vip: Static PodかDaemonset (同マシンのみ)

Slide 22

Slide 22 text

ICTSCの Kubernetesクラスタ これまでのあゆみ

Slide 23

Slide 23 text

ICTSC ● ICTSC (ICTトラブルシューティングコンテスト) ○ (主に) 学生が運営する、学生向けのIT大会 ○ ネットワークやらOSやらにトラブルの起こった VM環境が与えられ、それを解決するコンテスト ● Kubernetesクラスタの運用 ○ 競技ポータルやVMを監視するためのOSSをホスト するためにクラスタを建てている ○ (興味ベースなのであまり効率は考えてない)

Slide 24

Slide 24 text

僕が運営になったころ Plane Plane Plane HAProxy + keepalived HAProxy + keepalived 仮想IP

Slide 25

Slide 25 text

VM、要らないんじゃね? Plane Plane Plane HAProxy + keepalived HAProxy + keepalived 仮想IP

Slide 26

Slide 26 text

KeepalivedとHAProxyの設定が 全く理解できなかったため、 kube-vipの移行を決意 1年半くらい前のことなのでご勘弁を…

Slide 27

Slide 27 text

kube-vipに移行 Plane + kube-vip Plane + kube-vip Plane + kube-vip 仮想IP

Slide 28

Slide 28 text

kube-vipに移行 Plane + kube-vip Plane + kube-vip Plane + kube-vip 仮想IP これで良かったんです

Slide 29

Slide 29 text

kube-vipに移行 Plane + kube-vip Plane + kube-vip Plane + kube-vip 仮想IP v1.28までは

Slide 30

Slide 30 text

kube-vip、v1.29の悲劇

Slide 31

Slide 31 text

唐突にv1.29で壊れたkube-vip https://github.com/kube-vip/kube-vip/issues/684

Slide 32

Slide 32 text

v1.29で何が起こったか ● admin.confの権限変更と、super-admin.confの追加が 行われた ○ 無駄に高い権限がついていた所なので良いこと 設定ファイル ユーザグループ 権限 備考 admin.conf kubeadm:cluster- admins cluster- admin system:masters だった super-admin .conf system:masters 組み込み 権限 新設

Slide 33

Slide 33 text

kube-vipからのapiserver参照 ● kube-vipはkube-apiserverに接続する必要がある ○ 通常Podからアクセスするときは、Podに置かれた 認証情報でアクセスできる ○ Static Podはセットされない (K8s管理じゃない) ● これまでの接続方法 ○ kubeadmが生成するadmin.confを使っていた ○ /etc/kubernetes/admin.conf に置かれる

Slide 34

Slide 34 text

admin.conf終了のお知らせ E1214 09:30:38.907904 1 leaderelection.go:332] error retrieving resource lock kube-system/plndr-cp-lock: leases.coordination.k8s.io "plndr-cp-lock" is forbidden: User "kubernetes-admin" cannot get resource "leases" in API group "coordination.k8s.io" in the namespace "kube-system" 権限が…!足りない…!!!!!!

Slide 35

Slide 35 text

super-admin.confを使えばいいのでは? Plane + kube-vip Plane + kube-vip Plane + kube-vip admin.conf admin.conf admin.conf super- admin.conf super- admin.conf super- admin.conf

Slide 36

Slide 36 text

残念ながら… Plane + kube-vip Plane + kube-vip Plane + kube-vip admin.conf admin.conf admin.conf super- admin.conf initしたやつ joinしたやつ joinしたやつ

Slide 37

Slide 37 text

これによって kube-vip on kubeadmは 非常に苦しくなった 😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭

Slide 38

Slide 38 text

K3sへの移行

Slide 39

Slide 39 text

K3s ● 皆さんご存知のKubernetesディストリビューション ○ 動作も自身のバイナリも軽いK8s ○ 自宅サーバーなど、計算リソースがあまり強くない 場面でよく使われている ● containerdやCNIまで含め、全てのコンポーネントが 1つのバイナリに収められている ○ デバッグ・カスタマイズがしにくい

Slide 40

Slide 40 text

kube-vip on K3s ● Auto-Deploying Manifests ○ あるフォルダに置いてあるマニフェストをクラスタ セットアップ後に自動でデプロイ ○ Static Podと違い、Pod以外もOK ○ K3s公式のアドオンもこれを使ってデプロイされる ● kube-vipのDaemonsetデプロイ ○ Daemonsetとしてのコンフィグ生成がkube-vip 公式からサポートされている

Slide 41

Slide 41 text

これで勝った!!!!!

Slide 42

Slide 42 text

これで勝った!!!!! …と思っていました

Slide 43

Slide 43 text

Cilium CNI ● 最近話題のeBPFをフルに用いたCNI実装 ○ AWS / Google Cloudでも採用されている ○ ICTSCもCiliumを採用 ● kube-proxyの置き換えが最も大きな特徴 ○ iptables実装の弱い部分をeBPFで解決 ○ kube-proxyの無いクラスタを用意し、そこに Ciliumを投げ込む ○ (置き換えないこともできるが、面白くない)

Slide 44

Slide 44 text

Internal API server hostname ● Kubernetesには、内部にkube-apiserverに繋がる Serviceが存在する ○ Podからのアクセスはこれが用いられる ● Serviceなのでkube-proxy相当の物が必要 ○ Ciliumデプロイ時、直にapiserverのアドレスを 示してやる必要がある ○ Cilium内部のapiserverアドレスは勝手に書き 換わらないので、仮想IPを指定したい

Slide 45

Slide 45 text

とりあえずkubeadm時代と同じ感じで ● kube-vipのマニュフェストを生成 ○ Auto-Deployingのフォルダに置く ● K3sをkube-proxy無しで立ち上げる ○ --disable-kube-proxy というフラグで行ける ○ ここでkube-vipが立ち上がっているはず ● Ciliumに仮想IPを指定してデプロイ ○ これでサービスが使用可能になり、カスタム コントローラーたちが正常に動くはず

Slide 46

Slide 46 text

とりあえずkubeadm時代と同じ感じで ● kube-vipのマニュフェストを生成 ○ Auto-Deployingのフォルダに置く ● K3sをkube-proxy無しで立ち上げる ○ --disable-kube-proxy というフラグで行ける ○ ここでkube-vipが立ち上がっているはず ● CiliumにVirtual IPを指定してデプロイ ○ これでサービスが使用可能になり、カスタム コントローラーたちが正常に動くはず 一向にCiliumが 立ち上がってこない

Slide 47

Slide 47 text

仮想IPアドレスが… サーバーに割り当たって… いない…!? 敗北を喫した

Slide 48

Slide 48 text

おさらい ● kube-vipはkube-apiserverに接続する必要がある ○ 通常Podからアクセスするときは、Podに置かれた 認証情報でアクセスできる ○ Static Podはセットされない (K8s管理じゃない) ● Kubernetesには、内部にkube-apiserverに繋がる Serviceが存在する ○ Podからのアクセスはこれが用いられる

Slide 49

Slide 49 text

おさらい ● kube-vipはkube-apiserverに接続する必要がある ○ 通常Podからアクセスするときは、Podに置かれた 認証情報でアクセスできる ○ Static Podはセットされない (K8s管理じゃない) ● Kubernetesには、内部にkube-apiserverに繋がる Serviceが存在する ○ Podからのアクセスはこれが用いられる daemonsetのkube-vipは Service経由で apiserverに接続する

Slide 50

Slide 50 text

すなわち Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP)

Slide 51

Slide 51 text

すなわち Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) 仮想IPが 欲しい

Slide 52

Slide 52 text

すなわち Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) 仮想IPが 欲しい Daemonset からの参照に 必要

Slide 53

Slide 53 text

すなわち Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) 仮想IPが 欲しい Serviceの 立ち上げに 必要 Daemonset からの参照に 必要

Slide 54

Slide 54 text

永久機関が完成しちまった Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) 仮想IPが 欲しい Serviceの 立ち上げに 必要 Daemonset からの参照に 必要 Deadlock

Slide 55

Slide 55 text

どこかを一番最初に 立ち上げなければ どうにもならない 色々な手段を探した

Slide 56

Slide 56 text

最終的に Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) Serviceの 立ち上げに 必要 Daemonset からの参照に 必要 「127.0.0.1」を指定して 立ち上げれば 常に自分のいるPlaneの apiserverを 参照するようになる (hostnetworkがtrueだから?)

Slide 57

Slide 57 text

デッドロック解消 Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して 仮想IP) Serviceの 立ち上げに 必要 Daemonset からの参照に 必要

Slide 58

Slide 58 text

ここを妥協することで 無事にクラスタを立ち上げる ことができた! めでたしめでたし

Slide 59

Slide 59 text

まとめ

Slide 60

Slide 60 text

ここまでK3sへの載せ替えを 頑張っていましたが…

Slide 61

Slide 61 text

結論: kube-vipをやめて、 Static PodでKeepalivedと HAProxyを整備しよう! 正直K3sは辛いので、我々もそっちにしようと思う

Slide 62

Slide 62 text

ありがとう ございました 参考になれば幸いです