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
小江戸らぐ kubernetesクラスターを再構築した話
Search
世良泰明
January 14, 2023
Technology
0
210
小江戸らぐ kubernetesクラスターを再構築した話
2023/1/14
小江戸らぐ1月のオフな集まり(第246回)
世良泰明
January 14, 2023
Tweet
Share
More Decks by 世良泰明
See All by 世良泰明
ラズパイ奮闘記 その1
y_sera15
0
54
metrics-serverをセキュアなTLSでデプロイしてみた
y_sera15
0
500
EKS勉強会
y_sera15
1
130
自宅k8s構築日記 冬休み編
y_sera15
0
220
自宅k8sクラスター構築日記
y_sera15
0
190
EKSを動かしてみた話
y_sera15
0
100
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
240
小江戸らぐ 自宅にkubernetesクラスターを構築した話
y_sera15
0
39
Other Decks in Technology
See All in Technology
Eval-Centric AI: Agent 開発におけるベストプラクティスの探求
asei
0
110
金融サービスにおける高速な価値提供とAIの役割 #BetAIDay
layerx
PRO
1
800
LLMでAI-OCR、実際どうなの? / llm_ai_ocr_layerx_bet_ai_day_lt
sbrf248
0
450
アカデミーキャンプ 2025 SuuuuuuMMeR「燃えろ!!ロボコン」 / Academy Camp 2025 SuuuuuuMMeR "Burn the Spirit, Robocon!!" DAY 1
ks91
PRO
0
130
生成AIによるソフトウェア開発の収束地点 - Hack Fes 2025
vaaaaanquish
3
160
LTに影響を受けてテンプレリポジトリを作った話
hol1kgmg
0
350
Lambda management with ecspresso and Terraform
ijin
2
160
反脆弱性(アンチフラジャイル)とデータ基盤構築
cuebic9bic
3
170
AI関数が早くなったので試してみよう
kumakura
0
250
OPENLOGI Company Profile for engineer
hr01
1
37k
2025新卒研修・HTML/CSS #弁護士ドットコム
bengo4com
3
13k
Kiroでインフラ要件定義~テスト を実施してみた
nagisa53
3
340
Featured
See All Featured
Site-Speed That Sticks
csswizardry
10
760
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Embracing the Ebb and Flow
colly
86
4.8k
Speed Design
sergeychernyshev
32
1.1k
Faster Mobile Websites
deanohume
308
31k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Building an army of robots
kneath
306
45k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Producing Creativity
orderedlist
PRO
347
40k
Transcript
kubernetesクラスターを再構築した話 2023/1/14 小江戸らぐ 1月のオフな集まり(第246回) 世良泰明
自己紹介 名前: 世良 泰明 (せら やすあき) 職業: ひよっこインフラエンジニア (2年目) 名古屋の某SIer所属
AWS上でインフラ構築・運用 趣味: 囲碁, サイクリング, 散歩, etc… twitter: @y_sera15 自宅K8sクラスター
今日の話 おうちで育てている放置しているkubernetesクラスター ネットワーク関係のプラグインを入れようとして壊してしまい、 クラスターごと再構築した
構成 物理マシン3台の上に仮想マシンを立てた(Ubuntu22.04) ・control plane node 3台 ・worker node 3台 ・ロードバランサー(haproxy+
keepalive) 2台 NUC1 ESXi control plane 1 worker1 haproxy1 NUC2 ESXi control plane 2 worker2 haproxy2 NUC3 ESXi control plane 3 worker3
worker3 きっかけ control plane 1 haproxy1 control plane 2 worker2
haproxy2 control plane 3 APIへのアクセス デスクトップ 端末 6443/tcp kubectl kube-apiserver Load Balancer kubernetesの クラスターを制御 するノード 6443/tcp コンテナを動かす ノード worker1 kubernetes上で動かすコンテナにアクセスしたい
worker3 きっかけ kubernetes上で動かすコンテナにアクセスしたい control plane 1 worker1 haproxy1 control plane
2 worker2 haproxy2 control plane 3 APIへのアクセス デスクトップ 端末 6443/tcp kubectl kube-apiserver Load Balancer kubernetesの クラスターを制御 するノード 6443/tcp コンテナを動かす ノード コンテナのアプリ にアクセスできる ようにしたい http:80
当時の構成の前に 前提知識 ・kubernetesのネットワーク ・コンテナへのアクセス方法
kubernetesのネットワーク ・各ノードのネットワーク 192.168.100.0/24 ・コンテナの世界のネットワーク 10.0.0.0/8 worker3 worker1 worker2 192.168.100.0/24 192.168.100.34
192.168.100.66 192.168.100.98 kubernetesは2つの層のネットワークがある 10.0.0.0/8 ノード間でコンテナの世界のネットワークを繋げる機能 ⇒ CNIというプラグインにより提供
CNI選定 CNI(Container Network Interface)とは ・kubernetesで異なるNode上のPod間ネットワークを構築するソフトウェア Flannel, Calico等、さまざまなCNIが存在する 流行り廃り、ネットワーク構成で選ぶ 図の引用 https://www.netstars.co.jp/kubestarblog/k8s-3/
ノード間のやり取りの仕組み ・L2トンネリング ・BGP
コンテナへのアクセス方法 方法としては(ざっくり)3つ 1.ノードのポートと紐づける ⇒ノード依存する, ポート被りを意識しないといけないから嫌 2.外部のロードバランサーを利用する ⇒ 管理対象物が増えるのは面倒 3.k8s上でロードバランサーとして機能するアプリを利用する(metallb) ⇒
これを使いたい worker worker worker 8080:80 デスクトップ 端末 8080 デスクトップ 端末 Loadbarancer worker worker デスクトップ 端末 Loadbarancer
metallb ベアメタルなkubernetesクラスター上に外部からアクセス可能なロードバランサーを構築する https://metallb.universe.tf/
当時の構成 CNI: Calicoを利用(L2トンネリング?) Metallbを利用しても, L2トンネリングではnodeの ポートを内部的に紐づける形になってしまう ノードに紐づく形になり, ロードバランシングはして くれない https://blog.framinal.life/entry/2020/04/16/022042
→ BGPを使用したい BGPだとCalicoプラグインは一部既知の不具合あり… ⇒ BGP利用可能な別のCNIを検討へ https://www.tigera.io/project-calico/ metallbのCNI対応表
CNI選定 ・Flannel → L2トンネリングしか提供が無いので不採用 ・Cilium BGP対応, ポッド間通信のオーバーヘッドも少ないとのことで採用 (他のCNIは目に入らず) https://www.tigera.io/project-calico/ metallbのCNI対応表
eBPF(拡張バークレーパケットフィルター)という機能を利用しており, kernel内でパケット処理をすることができる https://cilium.io/blog/2020/11/10/ebpf-future-of-networking/
やったこと CalicoからCiliumに乗り換えようとしたところ、失敗。 切り戻しもできずPod間通信不可に。 ⇒ ゼロからクラスター再構築. ・kubernetesクラスター削除 ・CNI用のポート穴あけ ・CNI用カーネルパラメータ変更 ・kubernetes再インストール ・Ciliumインストール
kubernetesクラスター削除 # クラスター削除 sudo kubeadm reset # CNI情報のリセット sudo rm
–rf /etc/cni/net.d
カーネルパラメータ変更 #カーネルパラメータの変更 # https://docs.cilium.io/en/v1.12/operations/system_requirements/#linux-kernel sudo vi /etc/sysctl.d/cilium.conf sudo sysctl --system
# eBPFを利用する場合の最低限 ``` CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_NET_CLS_BPF=y CONFIG_BPF_JIT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_SCH_INGRESS=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CGROUPS=y CONFIG_CGROUP_BPF=y ```
カーネルパラメータ変更 #他にも色々あるのでとりあえず全部のせ CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_NET_CLS_BPF=y CONFIG_BPF_JIT=y CONFIG_NET_CLS_ACT=y CONFIG_NET_SCH_INGRESS=y CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CGROUPS=y CONFIG_CGROUP_BPF=y CONFIG_NETFILTER_XT_SET=m CONFIG_IP_SET=m CONFIG_IP_SET_HASH_IP=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_SOCKET=m CONFIG_XFRM=y CONFIG_XFRM_OFFLOAD=y CONFIG_XFRM_STATISTICS=y CONFIG_XFRM_ALGO=m CONFIG_XFRM_USER=m CONFIG_INET{,6}_ESP=m CONFIG_INET{,6}_IPCOMP=m CONFIG_INET{,6}_XFRM_TUNNEL=m CONFIG_INET{,6}_TUNNEL=m CONFIG_INET_XFRM_MODE_TUNNEL=m CONFIG_CRYPTO_AEAD=m CONFIG_CRYPTO_AEAD2=m CONFIG_CRYPTO_GCM=m CONFIG_CRYPTO_SEQIV=m CONFIG_CRYPTO_CBC=m CONFIG_CRYPTO_HMAC=m CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_AES=m CONFIG_NET_SCH_FQ=m
ポート開放 #firewallの設定変更 sudo ufw allow 8472/udp sudo ufw allow 4240/tcp
sudo ufw allow icmp sudo ufw allow 4244/tcp sudo ufw allow 4245/tcp sudo ufw allow 6060/tcp sudo ufw allow 6061/tcp sudo ufw allow 6062/tcp sudo ufw allow 9879/tcp sudo ufw allow 9890/tcp sudo ufw allow 9891/tcp sudo ufw allow 9892/tcp sudo ufw allow 9893/tcp sudo ufw allow 9962/tcp sudo ufw allow 9963/tcp sudo ufw allow 9964/tcp sudo ufw allow 51871/tcp sudo ufw reload
クラスター構築 #1台目構築 # https://docs.cilium.io/en/stable/gettingstarted/kubeproxy-free/#kubeproxy-free sudo kubeadm init --control-plane-endpoint "192.168.100.4:6443" --upload-certs
-- skip-phases=addon/kube-proxy # 2台目以降構築(コントロールプレーンノード) kubeadm join 192.168.100.4:6443 --token wzwlie.hdrvl4awhtrl8rex ¥ --discovery-token-ca-cert-hash sha256:6bfe2d8d0802e3e58fad51efaf8b671cd8af06bc10e2bd5f3d949c90ae82b6a3 ¥ --control-plane --certificate-key 106b45bc222e698a78390236f7e1730c258134d7573d1c5c23eea8d114e72746 # ワーカーノード構築 kubeadm join 192.168.100.4:6443 --token wzwlie.hdrvl4awhtrl8rex ¥ --discovery-token-ca-cert-hash sha256:6bfe2d8d0802e3e58fad51efaf8b671cd8af06bc10e2bd5f3d949c90ae82b6a3
ciliumインストール # BGP設定をkubectl apply ``` apiVersion: v1 kind: ConfigMap metadata:
name: bgp-config namespace: kube-system data: config.yaml: | peers: - peer-address: 10.0.0.1 peer-asn: 64512 my-asn: 64512 address-pools: - name: default protocol: bgp addresses: - 192.168.100.0/24 ```
ciliumインストール # helm経由でインストール # https://docs.cilium.io/en/stable/gettingstarted/bgp/#bgp helm repo add cilium https://helm.cilium.io/
helm update # BGPを有効化してインストール API_SERVER_IP="192.168.100.4" API_SERVER_PORT="6443" helm install cilium cilium/cilium --version 1.12.5 ¥ --namespace kube-system ¥ --set bgp.enabled=true ¥ --set bgp.announce.loadbalancerIP=true ¥ --set bgp.announce.podCIDR=true ¥ --set kubeProxyReplacement=strict ¥ --set k8sServiceHost=${API_SERVER_IP} ¥ --set k8sServicePort=${API_SERVER_PORT}
まとめ&現状/今後 まとめ&現状 metallbをBGPを利用して動作させるため, CNIを入れ替えてkubernetesクラスターを再構 築した. ただ, BGPモードで動いているのか怪しい (BGPモードはBGPルータが必要だが, ルータのBGPが無効なのにPod間通信ができている) 今後やること
・ルータ(Yamaha RTX1220)のBGPを有効化して再検証(躓いてる) ・metallbの導入方法調べる(ciliumに内包されてる?) https://docs.cilium.io/en/stable/gettingstarted/bgp/#bgp ドキュメントが英語なのと、何が分からないか分からないので難しい…