Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
徹底比較!HA Kubernetes ClusterにおけるControl Plane Loa...
Search
logica / Takuto Nagami
November 07, 2024
Technology
2
240
徹底比較!HA Kubernetes ClusterにおけるControl Plane LoadBalancerの選択肢
2024/11/7 CloudNative Days Winter 2024 プレイベントにて登壇した際の資料です。
logica / Takuto Nagami
November 07, 2024
Tweet
Share
More Decks by logica / Takuto Nagami
See All by logica / Takuto Nagami
Kubernetesを知る
logica0419
18
5.6k
Resizing Animated GIFs Without CGO or Third-Party Libraries
logica0419
2
27
外部カンファレンスで登壇しよう! 〜「強い」エンジニアへの一歩を踏み出す〜
logica0419
4
200
kube-vipとkube-proxy置き換えCiliumを積んだ究極のK3sクラスタを建てる
logica0419
4
490
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
9
1.4k
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
4
650
標準ライブラリの奥深アップデートを掘り下げよう!
logica0419
2
720
超アナログ中心な印刷会社で「エンジニアリング」を見直す
logica0419
4
240
Pure GoでアニメーションGIFのリサイズを実装する
logica0419
0
510
Other Decks in Technology
See All in Technology
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
righttouch
PRO
0
110
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
0
150
Jetpack Composeで始めるServer Cache State
ogaclejapan
2
170
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
330
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
100
podman_update_2024-12
orimanabu
1
260
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
100
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1.1k
KnowledgeBaseDocuments APIでベクトルインデックス管理を自動化する
iidaxs
1
260
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
220
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Typedesign – Prime Four
hannesfritz
40
2.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Docker and Python
trallard
42
3.1k
Making the Leap to Tech Lead
cromwellryan
133
9k
Adopting Sorbet at Scale
ufuk
73
9.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Writing Fast Ruby
sferik
628
61k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
A better future with KSS
kneath
238
17k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Transcript
Takuto Nagami X: @logica0419 GitHub: @logica0419 徹底比較! HA Kubernetes Cluster
におけるControl Plane LoadBalancerの選択肢
自己紹介 • Takuto Nagami (logica) • 千葉工業大学 情報科学部 情報ネットワーク学科 3年
• ネットワークコンテンツ研究会 所属 ◦ 数人の自宅サーバーをVPNで繋いでクラウド基盤 作ろうとしてます • 最近はTraefikへのコントリビューション をしたり、さくらのクラウドでDual Stack クラスタに挑戦したりしていました
Highly AvailableなK8sクラスタ • コントロールプレーンが複数台あるクラスタのこと ◦ 公式ドキュメントの中では「Highly Available Topology」と呼ばれている ◦ etcd入りのコントロールプレーンを複数のタイプと
etcdを外部に持つタイプがある • コントロールプレーンが何個か落ちても大丈夫 ◦ 3台以上のコントロールプレーンが必要とされる
HAクラスタを 使ってるよって人? (仕事 / 趣味 問わず)
HAクラスタを 構築した経験が ある人? (マネージドを除く)
このプロポーザルが 落ちた原因が分かりましたね! (と言えるくらいの比率になる予定) 正直マネージドが多いので需要が少ないとは思ってた
HAクラスタの Control Plane ロードバランシング問題
Control Planeが複数ある Plane Plane Plane
どこ接続すればいいか、わからない Plane Plane Plane ???
固定してしまったら Plane Plane Plane
死んだとき Plane Plane Plane
一巻の終わり Plane Plane Plane 💥
死んだときには Plane Plane Plane
別の所に接続できるように欲しい Plane Plane Plane
Worker Nodeからも apiserverに接続が必要なので、 これはクラスタ自体の死活問題 意外とちゃんとやらないとダメな問題なんです
Control Planeのロードバランシング • コントロールプレーンを冗長化した際、apiserverに 常に接続できる状態を維持する ◦ 常に生きているプレーンにアクセスできる ◦ 同一のIPアドレスで常に接続できる •
Kubernetesエコシステムの中にはツールが無い ◦ “Since this is not part of Kubernetes or kubeadm, this must be taken care of separately.” とドキュメントに書いてある
何が必要でしょう?
何が必要でしょう? 1. Virtual IPアドレスの割り当て / 広報 2. VIPにきた通信のロードバランシング
Virtual IPの割り当て / 広報 192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3
Virtual IPの割り当て / 広報 仮想IP 192.168.0.5 192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3
192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3 仮想IP 192.168.0.5 Virtual IPの割り当て / 広報
192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3 仮想IP 192.168.0.5 Virtual IPの割り当て / 広報
192.168.0.5に 来た通信は ここに届けろ!!!
192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3 仮想IP 192.168.0.5 Virtual IPの割り当て / 広報
Virtual IPの割り当て / 広報 192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3 仮想IP 192.168.0.5
仮想IP 192.168.0.5
Virtual IPの割り当て / 広報 192.168.0.1 192.168.0.2 192.168.0.4 192.168.0.3 仮想IP 192.168.0.5
仮想IP 192.168.0.5 192.168.0.5に 来た通信は ここに届けろ!!!
Virtual IPの割り当て / 広報 • コントロールプレーンへの通信の「受け口」を定める ◦ 生きているマシンのどれかに必ず到達する ◦ 「同一のIPアドレスで常に接続できる」を満たす
• 参考: DNSラウンドロビン ◦ これは条件を満たさない ▪ 死活監視ができず、生きている保証ができない ◦ 死活監視をいれた高度なDNSなら満たすが、セルフ ホスト界隈でスタンダードな手法ではない
VIPにきた通信のロードバランシング 仮想IP 適当なLB Plane Plane Plane
• 来た通信を複数台のコントロールプレーンにロードバラ ンシングする ◦ VIPとコントロールプレーンを繋ぐ ◦ 落ちていれば別の所に自動的に振り分ける • 一般的なHTTPリバースプロキシなら条件を満たす ◦
kube-apiserverのAPIはHTTPなので ◦ 設定のしやすさで選ぶのが良さそう VIPにきた通信のロードバランシング
デプロイについて • デプロイの方法 ◦ 受け口は、コントロールプレーンと別でも良い ◦ LB専用のマシンを設けるか、コントロールプレーン と同居させるかという選択 • Static
Pod - 同居の場合使える技術 ◦ Kubeletベースの機能 (K3sとかは対応してない) ◦ Kubernetesと別のライフサイクルを持つコンテナ をKubeletが建てて、保全してくれる
VIP割り当てとLBを組み合わせる LB Plane Plane Plane VIP割り当て 仮想IP LB VIP LB
VIP
VIP割り当ての選択肢
マネージドサービスの場合 例えばEKSなら、EKS public endpoint と ENI
Keepalived • VRRP (Virtual Router Redundancy Protocol)を用いて VIPを割り当ててくれるOSS ◦ 本来はルーターの冗長化などに使うプロトコル
• 「Keepalivedクラスタ」を構築し、そのクラスタ内で Masterのマシンに通信を振り分ける ◦ 全てのLB用マシンが同じL2ネットワーク上にいる必 要があり、そのL2ネットワークに広報 ▪ インターネットへの広報はネットワーク次第
kube-vip • Kubernetes用に設計されたVIPの割り当てOSS ◦ ARPとBGPが選べる ◦ ARPはL2ネットワークのみに広報だが、BGPならば 外部のルータに対して広報できる • Kubernetes本体に強く依存
◦ コントロールプレーン同居型セットアップのみ ◦ Kubernetes APIへの接続が必要 ▪ これが問題となった事件がある
唐突にv1.29で壊れたkube-vip https://github.com/kube-vip/kube-vip/issues/684
v1.29で何が起こったか • admin.confの権限変更と、super-admin.confの追加が 行われた ◦ 無駄に高い権限がついていた所なので良いこと 設定ファイル ユーザグループ 権限 備考
admin.conf kubeadm:cluster- admins cluster- admin system:masters だった super-admin .conf system:masters 組み込み 権限 新設
kube-vipからのapiserver参照 • kube-vipはkube-apiserverに接続する必要がある ◦ 通常Podからアクセスするときは、Podに置かれた 認証情報でアクセスできる ◦ Static Podはセットされない (K8s管理じゃない)
• これまでの接続方法 ◦ kubeadmが生成するadmin.confを使っていた ◦ /etc/kubernetes/admin.conf に置かれる
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" 権限が…!足りない…!!!!!!
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
残念ながら… Plane + kube-vip Plane + kube-vip Plane + kube-vip
admin.conf admin.conf admin.conf super- admin.conf initしたやつ joinしたやつ joinしたやつ
これによって kube-vip on kubeadmは 非常に苦しくなった まだ解決の兆しが立っていません
その他 • lelastic ◦ LinodeというAkamaiの子会社クラウドが開発した BGPベースの仮想IP割り当てOSS ◦ Linode内で使う事しか想定されてなさそう • とにかくソリューションが少ない!
◦ 現状これが欲しいユースケースが少なそう ◦ BGPを用いた、Keepalivedの完全代替みたいなOSS が欲しいなぁという思いがあります
ロードバランサーの選択肢
あらゆるHTTPリバースプロキシで良い • HAProxy • Nginx • Caddy • Envoy •
kube-vip ◦ なんとロードバランサー機能も備えている などなど
これらを組み合わせた ユースケース
Kubernetes公式ドキュメント • https://github.com/kubernetes/kubeadm/blob/main /docs/ha-considerations.md#options-for-software- load-balancing で公式のオススメが提示されている ◦ Keepalived + HAProxy
◦ kube-vip • Keepalived + HAProxy が安定していてオススメ ◦ HAProxyの部分は、自分の設定しやすいリバース プロキシに置き換えるのが良いでしょう
kubespray • kubesprayでは、HAクラスタを自動構築できる ◦ Worker Nodeからコントロールプレーンへの接続は ロードバランシングが必要 • localhost +
Nginx を使用 ◦ Worker Node上でlocalhostをlistenするNginxを 用意し、Nginxでロードバランシング ◦ localhostがVirtual IPとして働く • 外部からの接続は考えていない
まとめ
ありがとう ございました 参考になれば幸いです