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 に Windowsノードを0から追加してみた話
Search
Kyohei Mizumoto
December 24, 2019
Technology
0
1.6k
Kubernetes に Windowsノードを0から追加してみた話
Slides for a study meeting.
https://msdevjp.connpass.com/event/154913/
Kyohei Mizumoto
December 24, 2019
Tweet
Share
More Decks by Kyohei Mizumoto
See All by Kyohei Mizumoto
クラウドネイティブ環境の脅威モデリング
kyohmizu
2
500
コンテナサプライチェーンセキュリティ
kyohmizu
2
250
サイバーセキュリティの最新動向:脅威と対策
kyohmizu
1
300
コンテナセキュリティの基本と脅威への対策
kyohmizu
4
1.7k
安全な Kubernetes 環境を目指して
kyohmizu
4
1.2k
Unlocking Cloud Native Security
kyohmizu
5
1.4k
コンテナ × セキュリティ × AWS
kyohmizu
11
4k
コンテナセキュリティ
kyohmizu
10
4.2k
コンテナイメージのマルウェア検出とその実用性について
kyohmizu
4
3.8k
Other Decks in Technology
See All in Technology
ユーザーのプロフィールデータを活用した推薦精度向上の取り組み
yudai00
0
490
Workflows から Agents へ ~ 生成 AI アプリの成長過程とアプローチ~
belongadmin
3
170
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
150
Clineを含めたAIエージェントを 大規模組織に導入し、投資対効果を考える / Introducing AI agents into your organization
i35_267
4
1.4k
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
0
140
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
210
20250623 Findy Lunch LT Brown
3150
0
780
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
2
310
CI/CDとタスク共有で加速するVibe Coding
tnbe21
0
230
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
11
4.1k
AIのAIによるAIのための出力評価と改善
chocoyama
0
510
A2Aのクライアントを自作する
rynsuke
1
150
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
790
How GitHub (no longer) Works
holman
314
140k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
200
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
660
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Agile that works and the tools we love
rasmusluckow
329
21k
Statistics for Hackers
jakevdp
799
220k
The Language of Interfaces
destraynor
158
25k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
Transcript
Kubernetes に Windowsノードを 0から追加してみた話
Kyohei Mizumoto(@kyohmizu) C# Software Engineer Interests Cloud Native Docker Kubernetes
Golang Azure whoami
アドベントカレンダーに投稿しました https://qiita.com/kyohmizu/items/dffdd49123b1e47c3ac4
モチベーション アドカレの準備⼤変でした ネットワークの知識不⾜ 勢いよく減っていくAzureクレジット ⼿順通りに実⾏しても発⽣するエラーの数々 直前の⽅針転換と検証のやり直し ギリギリ (3時間遅れ) で投稿︕ ↓↓↓
得られた知⾒の共有 もし詳しい⽅がいたら話を聞きたい
今⽇話すこと Windows on Kubernetes Windowsノード追加の⼿順 トラブルシュート
Windows on Kubernetes
Windows on Kubernetes Kubernetes V1.14 でGA クラスタにノードを追加するだけで利⽤可能 対応されたのはワーカーノードのみ 未対応の機能もある TerminationGracePeriod
や Privileged Containers など コンテナネットワークには CNIプラグインを使⽤ kubenet は使⽤できない Windowsコンテナ、Linuxコンテナの適切なスケジューリングが必要 Windowsコンテナについては以前話をしました https://speakerdeck.com/kyohmizu/windowskontenaru-men
Windows on Kubernetes https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture
Windows on Kubernetes https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture
導⼊⽅法 マネージドサービスを利⽤する AKS の Windowsノードプール他 kubernetes.io のガイドに従う kubeadm + flannel
vxlan overlay を使⽤したノードの追加 Microsoft SDN の Kubernetes 導⼊⽤スクリプトを使⽤する flannel vxlan overlay (ドキュメントあり) wincni l2bridge (ドキュメントなし)
導⼊⽅法 マネージドサービスを利⽤する AKS の Windowsノードプール他 kubernetes.io のガイドに従う kubeadm + flannel
vxlan overlay を使⽤したノードの追加 Microsoft SDN の Kubernetes 導⼊⽤スクリプトを使⽤する flannel vxlan overlay (ドキュメントあり) wincni l2bridge (ドキュメントなし) ←こちらを採⽤
Windowsノード追加の⼿順
クラスタを準備 https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure $ az vm list -d -g kubernetes -o
table Name ResourceGroup PowerState PublicIps Location ------------ --------------- ------------ -------------- ---------- controller-0 kubernetes VM running XX.XXX.XXX.XXX japaneast controller-1 kubernetes VM running XX.XXX.XXX.XXX japaneast controller-2 kubernetes VM running XX.XXX.XXX.XXX japaneast worker-0 kubernetes VM running XX.XXX.XXX.XXX japaneast worker-1 kubernetes VM running XX.XXX.XXX.XXX japaneast worker-2 kubernetes VM running XX.XXX.XXX.XXX japaneast $ kubectl get no NAME STATUS ROLES AGE VERSION worker-0 Ready <none> 12m v1.15.0 worker-1 Ready <none> 7m26s v1.15.0 worker-2 Ready <none> 5m59s v1.15.0
ノード⽤ Windows Server VM を準備 Hyper-V 分離コンテナを使⽤する場合は VMサイズに注意しましょう https://docs.microsoft.com/en-us/azure/virtual-machines/windows/nested-virtualization
Windows Server の操作 https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/joining-windows-workers Docker をインストール Install-Module -Name DockerMsftProvider -Repository
PSGallery -Force Install-Package -Name Docker -ProviderName DockerMsftProvider Restart-Computer -Force インフラ⽤コンテナイメージを取得 docker pull mcr.microsoft.com/windows/nanoserver:1809 docker tag mcr.microsoft.com/windows/nanoserver:1809 ` mcr.microsoft.com/windows/nanoserver:latest
Windows Server の操作 kubeconfig と Kubernetes のノード⽤バイナリをC:\kに配置 ls config,*exe Directory:
C:\k Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 12/22/2019 11:49 AM 6254 config -a---- 12/11/2019 1:14 PM 40086016 kube-proxy.exe -a---- 12/11/2019 1:20 PM 47195136 kubectl.exe -a---- 12/11/2019 1:20 PM 119127552 kubelet.exe
スクリプトをダウンロード https://github.com/microsoft/SDN/blob/master/Kubernetes/windows/start.ps1 Start-BitsTransfer ` https://github.com/microsoft/SDN/raw/master/Kubernetes/windows/start.ps1 ドキュメントのない wincni ⽤のスクリプトを採⽤した理由︓ flannel は事前にクラスタにインストールが必要
hard way のクラスタは CNIプラグインを使⽤している https://github.com/containernetworking/plugins flannel を使う必要がない ちなみに flannel をインストールしても動作します (最初はこちらでやっていて、後で気づきましたorz)
スクリプトを実⾏ .\start.ps1 -masterIp 10.240.0.4 -clusterCIDR 10.200.0.0/16 1. 必要なバイナリ、スクリプト、Dockerfile をダウンロード 2.
コンテナイメージを作成(InstallImages.ps1) 3. HNS ネットワークを初期化 4. kubelet を起動(start-kubelet.ps1) 5. kube-proxy を起動(start-kubeproxy.ps1) 6. ルーティングテーブルに追加(AddRoutes.ps1) これだけで Kubernetes にノード追加できるはず︕
スクリプトを実⾏ .\start.ps1 -masterIp 10.240.0.4 -clusterCIDR 10.200.0.0/16 1. 必要なバイナリ、スクリプト、Dockerfile をダウンロード 2.
コンテナイメージを作成(InstallImages.ps1) 3. HNS ネットワークを初期化 4. kubelet を起動(start-kubelet.ps1) 5. kube-proxy を起動(start-kubeproxy.ps1) 6. ルーティングテーブルに追加(AddRoutes.ps1) これだけで Kubernetes にノード追加できるはず︕ →エラー (この時点でアドカレ当⽇の午後)
トラブルシュート
①ノードの podCIDR が未設定 # 何も表⽰されない $ kubectl get nodes -o
jsonpath='{.items[*].spec.podCIDR}' スクリプト内で podCIDR の⼀覧を取得できずエラー 本来はノード3台の podCIDR が取得できるはず kubelet-config.yaml には podCIDR を設定しているが… https://github.com/ivanfioravanti/kubernetes-the-hard-way-on-azure/blob/master/docs/09- bootstrapping-kubernetes-workers.md kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 ~ podCIDR: 10.200.0.0/24
①ノードの podCIDR が未設定 原因は kube-controller-manager のオプション設定漏れ kube-controller-manager.service を修正 [Service] ExecStart=/usr/local/bin/kube-controller-manager
\ --address=0.0.0.0 \ + --allocate-node-cidrs=true \ --cluster-cidr=10.200.0.0/16 \ これで cluster-cidr の設定が有効になる → ノードの podCIDR も有効になる $ kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' 10.200.0.0/24 10.200.1.0/24 10.200.2.0/24
②⾃ノードの podCIDR を取得できない ⾃ノード (Windows Server) の podCIDR が取得できずエラー そもそも
podCIDR を設定した覚えがないぞ︖ powershell モジュール (helper.psm1) を⾒てみる function Get-PodCIDR() { return c:\k\kubectl.exe --kubeconfig=c:\k\config get nodes/$($(hostname).ToLower()) -o custom-columns=podCidr:.spec.podCIDR --no-headers }
②⾃ノードの podCIDR を取得できない ⾃ノード (Windows Server) の podCIDR が取得できずエラー そもそも
podCIDR を設定した覚えがないぞ︖ powershell モジュール (helper.psm1) を⾒てみる function Get-PodCIDR() { return c:\k\kubectl.exe --kubeconfig=c:\k\config get nodes/$($(hostname).ToLower()) -o custom-columns=podCidr:.spec.podCIDR --no-headers } うん…︖
②⾃ノードの podCIDR を取得できない クラスタからノード情報を取得している…︖ まだクラスタに追加されていないので、当然取得できない ...... とりあえず、他ノードに倣って決めた podCIDR を返すよう修正 function
Get-PodCIDR() { - return c:\k\kubectl.exe --kubeconfig=c:\k\config get nodes/$($(hostname).ToLower()) - -o custom-columns=podCidr:.spec.podCIDR --no-headers + return "10.200.3.0/24" }
③ローカル変数の修正 kubelet の起動スクリプト (start-kubelet.ps1) に要修正なローカル変 数 # Todo : Get
these values using kubectl $KubeDnsSuffix ="svc.cluster.local" +$KubeDnsServiceIp="10.32.0.10" -$KubeDnsServiceIp="11.0.0.10" +$serviceCIDR="10.32.0.0/24" -$serviceCIDR="11.0.0.0/8" Todo とは せめて外から設定できるようにしておいてほしいなと
ノード追加完了︕ $ kubectl get no NAME STATUS ROLES AGE VERSION
win-server Ready <none> 173m v1.16.4 worker-0 Ready <none> 28h v1.15.0 worker-1 Ready <none> 28h v1.15.0 worker-2 Ready <none> 28h v1.15.0 $ kubectl get po,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE pod/busybox 1/1 Running 13 13h 10.200.2.4 worker-2 pod/nginx 1/1 Running 0 38h 10.200.1.3 worker-1 pod/ubuntu 1/1 Running 0 20h 10.200.1.4 worker-1 pod/win-webserver-784d66c84f-bqh9l 1/1 Running 0 10h 10.200.3.159 win-server pod/win-webserver-784d66c84f-ssxfr 1/1 Running 0 10h 10.200.3.39 win-server NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 38h <none> service/nginx NodePort 10.32.0.52 <none> 80:32121/TCP 37h run=nginx service/win-webserver NodePort 10.32.0.65 <none> 80:31663/TCP 10h app=win-webserver
今⽉はここまで…
スクリプト対応まとめ 要修正箇所 kube-controller-manager.service の起動オプション追加 helper.psm1 のGet-PodCIDRメソッド start-kubelet.ps1 のローカル変数 param名 設定値
$masterIp Windows Server VM のプライベートIP $clusterCIDR kube-controller-manager の cluster-cidr $podCIDR 10.200.3.0/24 $KubeDnsServiceIp kubectl get svc kube-dns -n kube-system $serviceCIDR kube-controller-manager の service-cluster-ip-range
参考 Intro to Windows support in Kubernetes https://kubernetes.io/docs/setup/production-environment/windows/intro-windows-in-kubernetes/ Kubernetes on
Windows https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/getting-started- kubernetes-windows Windows container networking https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture KubernetesとFlannelでWindows上にPod間VXLAN Overlayネットワークを構成 https://www.slideshare.net/anikundesu/kubernetesflannelwindowspodvxlan-overlay-152588125 Kubernetes Networking: Behind the scenes https://itnext.io/kubernetes-networking-behind-the-scenes-39a1ab1792bb
Thank you!