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
1
200
サイバーセキュリティの最新動向:脅威と対策
kyohmizu
1
250
コンテナセキュリティの基本と脅威への対策
kyohmizu
4
1.6k
安全な Kubernetes 環境を目指して
kyohmizu
4
1.1k
Unlocking Cloud Native Security
kyohmizu
5
1.3k
コンテナ × セキュリティ × AWS
kyohmizu
11
3.9k
コンテナセキュリティ
kyohmizu
10
4.2k
コンテナイメージのマルウェア検出とその実用性について
kyohmizu
4
3.6k
Play with 🐐 in Kubernetes
kyohmizu
1
1.3k
Other Decks in Technology
See All in Technology
OPENLOGI Company Profile
hr01
0
62k
YOLOv10~v12
tenten0727
3
830
バックオフィス向け toB SaaS バクラクにおけるレコメンド技術活用 / recommender-systems-in-layerx-bakuraku
yuya4
2
220
ソフトウェア開発現代史: "LeanとDevOpsの科学"の「科学」とは何か? - DORA Report 10年の変遷を追って - #DevOpsDaysTokyo
takabow
0
180
自分の軸足を見つけろ
tsuemura
2
570
Would you THINK such a demonstration interesting ?
shumpei3
1
140
Devinで模索する AIファースト開発〜ゼロベースから始めるDevOpsの進化〜
potix2
PRO
5
2.4k
食べログが挑む!飲食店ネット予約システムで自動テスト無双して手動テストゼロを実現する戦略
hagevvashi
1
150
Vision Pro X Text to 3D Model ~How Swift and Generative Al Unlock a New Era of Spatial Computing~
igaryo0506
0
250
Beyond {shiny}: The Future of Mobile Apps with R
colinfay
1
330
「それはhowなんよ〜」のガイドライン #orestudy
77web
9
2.4k
SREが実現する開発者体験の革新
sansantech
PRO
0
160
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
GraphQLとの向き合い方2022年版
quramy
46
14k
Designing for humans not robots
tammielis
252
25k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
4.9k
Code Review Best Practice
trishagee
67
18k
Building Adaptive Systems
keathley
41
2.5k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.6k
Speed Design
sergeychernyshev
29
880
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
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!