Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

2024/10/01 Kubernetes Novice Tokyo #34にて発表した際の資料です。
kube-vipとkube-proxy置き換えCiliumをK3sに乗せる際引っかかったポイントを、前提となるHAコントロールプレーンの事情と合わせて解説しています。

logica / Takuto Nagami

October 01, 2024
Tweet

More Decks by logica / Takuto Nagami

Other Decks in Technology

Transcript

  1. 自己紹介 • logica (ろじか) • 千葉工業大学 情報科学部 情報ネットワーク学科 3年 •

    ネットワークコンテンツ研究会 所属 ◦ 数人の自宅サーバーをVPNで繋いでクラウド基盤 作ろうとしてます • 最近はKWOKへのコントリビューションや セキュリティ・ミニキャンプ講師などを やってました
  2. Control Planeのロードバランシング • コントロールプレーンを冗長化した際、外部から apiserverに常に接続できる状態を維持する ◦ どこかのノードが死んだらフォールバックする ◦ 同一のIPアドレスで常に接続できる •

    Kubernetesエコシステムの中にはツールが無い ◦ “Since this is not part of Kubernetes or kubeadm, this must be taken care of separately.” とドキュメントに書いてある
  3. kube-vip • Kubernetes用に設計された、keepalivedとHAProxyの 代替ソフトウェア ◦ どちらの機能も備えている • Keepalived & HAProxyと比べて設定が楽

    ◦ Keepalived & HAProxy ▪ KeepalivedとHAProxyの設定をする知識が必要 ◦ kube-vip ▪ kube-vipのCLIによって設定の生成が可能
  4. デプロイについて • Static Pod ◦ Kubeletベースの機能 (K3sとかは対応してない) ◦ Kubernetesと別のライフサイクルを持つコンテナ をKubeletが建てて、保全してくれる

    • それぞれのデプロイ事情 ◦ K & HA: スタンドアロン (Planeと別マシン) か Static Pod (Planeと同マシン) ◦ kube-vip: Static PodかDaemonset (同マシンのみ)
  5. ICTSC • ICTSC (ICTトラブルシューティングコンテスト) ◦ (主に) 学生が運営する、学生向けのIT大会 ◦ ネットワークやらOSやらにトラブルの起こった VM環境が与えられ、それを解決するコンテスト

    • Kubernetesクラスタの運用 ◦ 競技ポータルやVMを監視するためのOSSをホスト するためにクラスタを建てている ◦ (興味ベースなのであまり効率は考えてない)
  6. 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" 権限が…!足りない…!!!!!!
  7. 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
  8. 残念ながら… Plane + kube-vip Plane + kube-vip Plane + kube-vip

    admin.conf admin.conf admin.conf super- admin.conf initしたやつ joinしたやつ joinしたやつ
  9. kube-vip on K3s • Auto-Deploying Manifests ◦ あるフォルダに置いてあるマニフェストをクラスタ セットアップ後に自動でデプロイ ◦

    Static Podと違い、Pod以外もOK ◦ K3s公式のアドオンもこれを使ってデプロイされる • kube-vipのDaemonsetデプロイ ◦ Daemonsetとしてのコンフィグ生成がkube-vip 公式からサポートされている
  10. Cilium CNI • 最近話題のeBPFをフルに用いたCNI実装 ◦ AWS / Google Cloudでも採用されている ◦

    ICTSCもCiliumを採用 • kube-proxyの置き換えが最も大きな特徴 ◦ iptables実装の弱い部分をeBPFで解決 ◦ kube-proxyの無いクラスタを用意し、そこに Ciliumを投げ込む ◦ (置き換えないこともできるが、面白くない)
  11. Internal API server hostname • Kubernetesには、内部にkube-apiserverに繋がる Serviceが存在する ◦ Podからのアクセスはこれが用いられる •

    Serviceなのでkube-proxy相当の物が必要 ◦ Ciliumデプロイ時、直にapiserverのアドレスを 示してやる必要がある ◦ Cilium内部のapiserverアドレスは勝手に書き 換わらないので、仮想IPを指定したい
  12. とりあえずkubeadm時代と同じ感じで • kube-vipのマニュフェストを生成 ◦ Auto-Deployingのフォルダに置く • K3sをkube-proxy無しで立ち上げる ◦ --disable-kube-proxy というフラグで行ける

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

    ◦ ここでkube-vipが立ち上がっているはず • CiliumにVirtual IPを指定してデプロイ ◦ これでサービスが使用可能になり、カスタム コントローラーたちが正常に動くはず 一向にCiliumが 立ち上がってこない
  14. おさらい • kube-vipはkube-apiserverに接続する必要がある ◦ 通常Podからアクセスするときは、Podに置かれた 認証情報でアクセスできる ◦ Static Podはセットされない (K8s管理じゃない)

    • Kubernetesには、内部にkube-apiserverに繋がる Serviceが存在する ◦ Podからのアクセスはこれが用いられる daemonsetのkube-vipは Service経由で apiserverに接続する
  15. すなわち Cilium (kube-proxy 置き換え) Internal API server hostname kube-vip (付随して

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

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

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

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

    仮想IP) Serviceの 立ち上げに 必要 Daemonset からの参照に 必要