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
220
小江戸らぐ kubernetesクラスターを再構築した話
2023/1/14
小江戸らぐ1月のオフな集まり(第246回)
世良泰明
January 14, 2023
Tweet
Share
More Decks by 世良泰明
See All by 世良泰明
Serendie Design Systemを使ってWebアプリケーションを開発してみた
y_sera15
0
110
Kubernetesの公式ドキュメントを翻訳してみた
y_sera15
0
44
ラズパイ奮闘記 その1
y_sera15
0
65
metrics-serverをセキュアなTLSでデプロイしてみた
y_sera15
0
590
EKS勉強会
y_sera15
1
140
自宅k8s構築日記 冬休み編
y_sera15
0
260
自宅k8sクラスター構築日記
y_sera15
0
220
EKSを動かしてみた話
y_sera15
0
110
ちょっと大きめのOSSにコントリビュートしかけた話
y_sera15
0
270
Other Decks in Technology
See All in Technology
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
130
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
680
モダンUIでフルサーバーレスなAIエージェントをAmplifyとCDKでサクッとデプロイしよう
minorun365
4
230
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
780
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
190
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
こんなところでも(地味に)活躍するImage Modeさんを知ってるかい?- Image Mode for OpenShift -
tsukaman
1
170
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
340
制約が導く迷わない設計 〜 信頼性と運用性を両立するマイナンバー管理システムの実践 〜
bwkw
3
1.1k
ブロックテーマでサイトをリニューアルした話 / 2026-01-31 Kansai WordPress Meetup
torounit
0
480
Cloud Runでコロプラが挑む 生成AI×ゲーム『神魔狩りのツクヨミ』の裏側
colopl
0
150
ECS障害を例に学ぶ、インシデント対応に備えたAIエージェントの育て方 / How to develop AI agents for incident response with ECS outage
iselegant
4
450
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Mind Mapping
helmedeiros
PRO
0
90
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
140
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
150
Automating Front-end Workflow
addyosmani
1371
200k
We Are The Robots
honzajavorek
0
170
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
440
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 ドキュメントが英語なのと、何が分からないか分からないので難しい…