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.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
190
コンテナセキュリティの基本と脅威への対策
kyohmizu
4
1.4k
安全な Kubernetes 環境を目指して
kyohmizu
4
1.1k
Unlocking Cloud Native Security
kyohmizu
5
1.2k
コンテナ × セキュリティ × AWS
kyohmizu
10
3.8k
コンテナセキュリティ
kyohmizu
10
4.1k
コンテナイメージのマルウェア検出とその実用性について
kyohmizu
4
3.2k
Play with 🐐 in Kubernetes
kyohmizu
1
1.3k
Security Command Center × PagerDuty 自動アラート通知の取り組み
kyohmizu
0
610
Other Decks in Technology
See All in Technology
統計データで2024年の クラウド・インフラ動向を眺める
ysknsid25
2
850
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
新機能VPCリソースエンドポイント機能検証から得られた考察
duelist2020jp
0
230
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
170
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
320
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
podman_update_2024-12
orimanabu
1
280
あの日俺達が夢見たサーバレスアーキテクチャ/the-serverless-architecture-we-dreamed-of
tomoki10
0
480
GitHub Copilot のテクニック集/GitHub Copilot Techniques
rayuron
37
15k
社内イベント管理システムを1週間でAKSからACAに移行した話し
shingo_kawahara
0
190
KubeCon NA 2024 Recap: How to Move from Ingress to Gateway API with Minimal Hassle
ysakotch
0
210
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Fireside Chat
paigeccino
34
3.1k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Bash Introduction
62gerente
608
210k
Designing for Performance
lara
604
68k
Optimising Largest Contentful Paint
csswizardry
33
3k
Documentation Writing (for coders)
carmenintech
66
4.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Writing Fast Ruby
sferik
628
61k
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!