$30 off During Our Annual Pro Sale. View Details »
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
200
徹底比較!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
17
4.7k
Resizing Animated GIFs Without CGO or Third-Party Libraries
logica0419
2
24
外部カンファレンスで登壇しよう! 〜「強い」エンジニアへの一歩を踏み出す〜
logica0419
4
180
kube-vipとkube-proxy置き換えCiliumを積んだ究極のK3sクラスタを建てる
logica0419
4
460
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
9
1.4k
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
3
630
標準ライブラリの奥深アップデートを掘り下げよう!
logica0419
2
710
超アナログ中心な印刷会社で「エンジニアリング」を見直す
logica0419
4
230
Pure GoでアニメーションGIFのリサイズを実装する
logica0419
0
500
Other Decks in Technology
See All in Technology
【AWS re:Invent 2024】Amazon Bedrock アップデート総まとめ
minorun365
PRO
3
150
日本全国・都市3D化プロジェクト「PLATEAU」とデータ変換OSS「PLATEAU GIS Converter」の公開
nokonoko1203
4
350
プロダクトマネージャーは 事業責任者の夢をみるのか pmconf2024
gimupop
1
7.5k
知らない景色を見に行こう チャンスを掴んだら道が開けたマネジメントの旅 / Into the unknown~My management journey~
kakehashi
8
1k
まだチケットを手動で書いてるの?!GitHub Actionsと生成AIでチケットの作成を自動化してみた話 / 20241207 Yoshinori Katayama
shift_evolve
1
540
論理レプリケーションを使ったDB統合
kkato1
0
160
ソフトウェアエンジニアとしてキャリアの螺旋を駆け上がる方法 - 経験と出会いが人生を変える / Career-Anchor-Drive
soudai
13
2.7k
ファインディの4年にわたる技術的負債の返済 / Repaying 4 Years of Technical Debt at Findy
ma3tk
7
3.6k
スパイクアクセス対策としての pitchfork 導入
riseshia
0
130
GeminiとUnityで実現するインタラクティブアート
hokkey621
0
570
検証と資産化を形にするプロダクト組織へ/tapple_pmconf2024
corin8823
1
8.1k
[GDG DevFest Bangkok 2024] - The Future of Retail E-commerce with Gemini AI
punsiriboo
0
290
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Designing for Performance
lara
604
68k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
The Language of Interfaces
destraynor
154
24k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Making Projects Easy
brettharned
116
5.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Gamification - CAS2011
davidbonilla
80
5.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
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として働く • 外部からの接続は考えていない
まとめ
ありがとう ございました 参考になれば幸いです