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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
世良泰明
January 14, 2023
Technology
0
230
小江戸らぐ kubernetesクラスターを再構築した話
2023/1/14
小江戸らぐ1月のオフな集まり(第246回)
世良泰明
January 14, 2023
Tweet
Share
More Decks by 世良泰明
See All by 世良泰明
Serendie Design Systemを使ってWebアプリケーションを開発してみた
y_sera15
0
120
Kubernetesの公式ドキュメントを翻訳してみた
y_sera15
0
50
ラズパイ奮闘記 その1
y_sera15
0
70
metrics-serverをセキュアなTLSでデプロイしてみた
y_sera15
0
610
EKS勉強会
y_sera15
1
150
自宅k8s構築日記 冬休み編
y_sera15
0
260
自宅k8sクラスター構築日記
y_sera15
0
230
EKSを動かしてみた話
y_sera15
0
110
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
280
Other Decks in Technology
See All in Technology
Kubernetesにおける推論基盤
ry
1
180
EMからVPoEを経てCTOへ:マネジメントキャリアパスにおける葛藤と成長
kakehashi
PRO
9
1.4k
白金鉱業Meetup_Vol.22_Orbital Senseを支える衛星画像のマルチモーダルエンベディングと地理空間のあいまい検索技術
brainpadpr
2
270
聲の形にみるアクセシビリティ
tomokusaba
0
160
us-east-1 に障害が起きた時に、 ap-northeast-1 にどんな影響があるか 説明できるようになろう!
miu_crescent
PRO
13
4.1k
Databricksアシスタントが自分で考えて動く時代に! エージェントモード体験もくもく会
taka_aki
0
370
Dr. Werner Vogelsの14年のキーノートから紐解くエンジニアリング組織への処方箋@JAWS DAYS 2026
p0n
1
120
楽しく学ぼう!コミュニティ入門 AWSと人が つむいできたストーリー
hiroramos4
PRO
1
180
プロジェクトマネジメントをチームに宿す -ゼロからはじめるチームプロジェクトマネジメントは活動1年未満のチームの教科書です- / 20260304 Shigeki Morizane
shift_evolve
PRO
1
150
Datadog の RBAC のすべて
nulabinc
PRO
3
410
JAWS DAYS 2026 ExaWizards_20260307
exawizards
0
380
管理者向けGitHub Enterpriseの運用Tips紹介: 人にもAIにも優しいプラットフォームづくり
yuriemori
0
180
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
250
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Code Reviewing Like a Champion
maltzj
528
40k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
200
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.9k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
280
How to Ace a Technical Interview
jacobian
281
24k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
180
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
82
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
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 ドキュメントが英語なのと、何が分からないか分からないので難しい…