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
510
EKS勉強会
y_sera15
1
130
自宅k8s構築日記 冬休み編
y_sera15
0
220
自宅k8sクラスター構築日記
y_sera15
0
200
EKSを動かしてみた話
y_sera15
0
100
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
240
小江戸らぐ 自宅にkubernetesクラスターを構築した話
y_sera15
0
41
Other Decks in Technology
See All in Technology
クラウドセキュリティを支える技術と運用の最前線 / Cutting-edge Technologies and Operations Supporting Cloud Security
yuj1osm
2
250
ここ一年のCCoEとしてのAWSコスト最適化を振り返る / CCoE AWS Cost Optimization devio2025
masahirokawahara
1
1.1k
Vault meets Kubernetes
mochizuki875
0
150
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
1
990
Nstockの一人目エンジニアが 3年間かけて向き合ってきた セキュリティのこととこれから〜あれから半年〜
yo41sawada
0
170
攻撃と防御で実践するプロダクトセキュリティ演習~導入パート~
recruitengineers
PRO
3
1.8k
ガチな登山用デバイスからこんにちは
halka
1
200
Automating Web Accessibility Testing with AI Agents
maminami373
0
290
2025年になってもまだMySQLが好き
yoku0825
6
2.5k
新規案件の立ち上げ専門チームから見たAI駆動開発の始め方
shuyakinjo
0
640
『FailNet~やらかし共有SNS~』エレベーターピッチ
yokomachi
1
190
実践データベース設計 ①データベース設計概論
recruitengineers
PRO
4
2k
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
173
14k
Writing Fast Ruby
sferik
628
62k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
How to train your dragon (web standard)
notwaldorf
96
6.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Speed Design
sergeychernyshev
32
1.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
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 ドキュメントが英語なのと、何が分からないか分からないので難しい…