Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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.5k
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
1
180
コンテナセキュリティの基本と脅威への対策
kyohmizu
4
1.4k
安全な Kubernetes 環境を目指して
kyohmizu
4
1k
Unlocking Cloud Native Security
kyohmizu
5
1.2k
コンテナ × セキュリティ × AWS
kyohmizu
10
3.7k
コンテナセキュリティ
kyohmizu
10
4.1k
コンテナイメージのマルウェア検出とその実用性について
kyohmizu
4
3.1k
Play with 🐐 in Kubernetes
kyohmizu
1
1.3k
Security Command Center × PagerDuty 自動アラート通知の取り組み
kyohmizu
0
600
Other Decks in Technology
See All in Technology
Will Positron accelerate us?
lycorptech_jp
PRO
1
120
.NET のUnified AI Building Blocks 入門...!
okazuki
0
190
Classmethod_regrowth_2024_tokyo_security_identity_governance_summary
hiashisan
0
190
開発者向けツールを魔改造してセキュリティ診断ツールを作っている話 - 第1回 セキュリティ若手の会 LT
pizzacat83
0
380
突き破って学ぶコンテナセキュリティ/container-breakout-cncj-lt
mochizuki875
6
1.1k
LY Accessibility Guidelines @fukuoka_a11yconf_前夜祭
lycorptech_jp
PRO
1
150
多様なロール経験が導いたエンジニアキャリアのナビゲーション
coconala_engineer
1
150
Oracle Base Database Service:サービス概要のご紹介
oracle4engineer
PRO
0
15k
イベントをどう管理するか
mikanichinose
1
110
ファインディの4年にわたる技術的負債の返済 / Repaying 4 Years of Technical Debt at Findy
ma3tk
7
3.7k
ソフトウェアエンジニアとしてキャリアの螺旋を駆け上がる方法 - 経験と出会いが人生を変える / Career-Anchor-Drive
soudai
13
2.8k
WED Company Deck for Engineer
wed
2
3.7k
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Gamification - CAS2011
davidbonilla
80
5.1k
Rails Girls Zürich Keynote
gr2m
94
13k
The Cost Of JavaScript in 2023
addyosmani
45
6.9k
A Modern Web Designer's Workflow
chriscoyier
693
190k
How GitHub (no longer) Works
holman
310
140k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
480
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Code Reviewing Like a Champion
maltzj
520
39k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
RailsConf 2023
tenderlove
29
920
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!