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.3k
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
0
71
コンテナセキュリティの基本と脅威への対策
kyohmizu
4
1.1k
安全な Kubernetes 環境を目指して
kyohmizu
4
840
Unlocking Cloud Native Security
kyohmizu
5
1k
コンテナ × セキュリティ × AWS
kyohmizu
10
3.4k
コンテナセキュリティ
kyohmizu
10
4k
コンテナイメージのマルウェア検出とその実用性について
kyohmizu
4
2.6k
Play with 🐐 in Kubernetes
kyohmizu
1
1.1k
Security Command Center × PagerDuty 自動アラート通知の取り組み
kyohmizu
0
520
Other Decks in Technology
See All in Technology
dxd2024-生成AIに振り回された3か月間の成功と失敗/dxd2024-link-and-motivation
lmi
2
260
フルリモートワークはエンジニアの夢を叶えたか? #cm_odyssey
mamohacy
2
600
コンテナ・K8s研修 - 前半 コンテナ基礎・ハンズオン【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
170
[I/O Extended Android 2024] What`s new in Android 2024
kyeongwan
0
220
Git 研修 Basic【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
310
AIエージェントを現場に導入する目線とは
masahiro_nishimi
1
1.5k
可視化プラットフォームGrafanaの基本と活用方法の全て
hamadakoji
0
230
Azure Pipelinesを使用したCICDベースラインアーキテクチャ実践
yuriemori
0
190
サービスの持続的な成長と技術負債について
siva_official
PRO
10
4.4k
AWSサービスメニュー開発をしていてAWSを好きだ!と感じた瞬間
toru_kubota
0
130
E2Eテスト自動化プラットフォームにおけるAIの活用
shift_evolve
0
180
ここがすごいよ! AWS Systems Manager!
saichan11
0
1.8k
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
35
4.4k
Rails Girls Zürich Keynote
gr2m
93
13k
Thoughts on Productivity
jonyablonski
64
4.1k
YesSQL, Process and Tooling at Scale
rocio
166
14k
Automating Front-end Workflow
addyosmani
1362
200k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
277
13k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
16
1.6k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
How to name files
jennybc
67
96k
Docker and Python
trallard
37
2.9k
Designing for Performance
lara
604
67k
10 Git Anti Patterns You Should be Aware of
lemiorhan
652
58k
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!