Kubernetes上のWindows Server
コンテナーのマイクロサービス間分離
2018年10月27日
System Center User Group Japan
金井 崇
自己紹介
• 名前:金井 崇
• 所属:株式会社IDCフロンティア
• 仕事:IaaSの基盤設計・構築・運用・提案を担当
• 興味:最近はKubernetes、コンテナなどコンピューティングの
最適な利用方法に興味があります。
• MVP:Cloud and Data Center Management (2017/03~)
• SNSなど:
• Facebook https://www.facebook.com/anikundesu
• Blog http://www.takanyan.net/
• Twitter @anikundesu
• LinkedIn https://jp.linkedin.com/in/takashikanai/ja
• SlideShare https://www.slideshare.net/anikundesu/presentations
2Copyright © 2018 System Center User Group Japan. All Rights Reserved.
注意事項
本セッションは、Windows Server Version 1709、Windows Server Inside Preview build 17744
とKubernetes 1.9.2での検証結果をもとに記述をしています。バージョンによっては挙動が異なり
ますので、ご留意ください。
本セッション資料は、個人で準備した環境において、個人的に実施した検証・結果を基に記載して
います。あくまで個人の意見・見解であり、所属する会社・組織及びマイクロソフト社とは関係が
ございません。所属する会社・組織・マイクロソフト社の正式な回答・見解ではない事に留意して
ください。
本資料を閲覧した事により問題が生じた場合、または問題が発生しかけた場合、または生じた一切
の不利益について、発表者は一切の責任を負う事はできませんのでご了承ください。
3Copyright © 2018 System Center User Group Japan. All Rights Reserved.
本日のアジェンダ
Calico Network PolicyのWindows対応状況2
WindowsコンテナーでのNetwork Policy動作デモ3
まとめ:今後のKubernetesのWindows対応予定4
Kubernetesクラスタ内のネットワーク分離の課題1
4Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Kubernetesクラスタ内のネットワーク
分離の課題
Section 1
5Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Microserviceアーキテクチャの内部
機能ごとにServerとNWとLBができる
6Copyright © 2018 System Center User Group Japan. All Rights Reserved.
LB
App Server
機能A
機能B
機能C
App Server
機能A
機能B
機能C
App Server
機能A
機能B
機能C
DB DB
LB LB
Aコンテナ
DB DB
LB
Aコンテナ Aコンテナ
Bコンテナ Bコンテナ Bコンテナ
Cコンテナ Cコンテナ Cコンテナ
コンテナ間NW・LB
コンテナ間NW・LB
スケール
アウト
スケール
アウト
スケール
アウト
スケール
アウト
クラスタ内のネットワーク分離とは
マイクロサービスの通信要件に合わせ制限をかけること
7Copyright © 2018 System Center User Group Japan. All Rights Reserved.
LB
Aコンテナ
DB DB
LB
Aコンテナ Aコンテナ
Bコンテナ Bコンテナ Bコンテナ
Cコンテナ Cコンテナ Cコンテナ
コンテナ間NW・LB
コンテナ間NW・LB
スケール
アウト
スケール
アウト
機能A,B,Cの間で必要な通信の例
・A⇔B間のTCP/80の通信
・B⇔C間のTCP/3306の通信
・A,Bは中から外への通信許可
・Cは中から外への通信拒否
・その他の通信はすべて拒否
Kubernetesでは「Network Policy」
で設定する。
Network Policyの実装「Calico」
CalicoはKubernetes等に対応するSDNコントロール
プレーン
8Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Windows
(Beta状態)
Linux
各NodeにRouting、
Policyなどを設定
各コンテナ間に必要
な通信情報を伝達
コンテナ間通信要件
からNode用設定生成
or
Calicoの特徴
• BGPを用いたPure L3ネットワーク構成
• Policyベースのmicro-segmentation
• いろいろなOrchestratorに対応
– Kubernetes
– OpenStack
– Docker などなど
• 環境に応じた複数の展開方法への対応
– Networkingのみ、Network Policyのみ、Flannelとの連携
• 大規模環境での利用実績
※日本での大規模事例:Yahoo!JAPAN
https://techblog.yahoo.co.jp/infrastructure/kubernetes_calico_networking/
9Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Calico Network Policyの
Windows対応状況
Section 2
10Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Calico、Flannel、WinCNIの守備範囲
CalicoはNetwork関連機能を広範囲にカバー
11Copyright © 2018 System Center User Group Japan. All Rights Reserved.
機能 Calico Flannel WinCNI
Kubernetes
Network Policy
対応 ー (※) ー
Node間ルーティング
自動設定
対応(iBGP) 対応 ー
Node内L2Bridge 対応 対応 対応
Overlay Network (IPIP) VXLAN ー
※ CalicoのNetwork Policy + Flannelのコンテナ間NW機能を組み合わせる「Canal」が存在。
https://github.com/projectcalico/canal
Calico、Flannel、WinCNIのWindows対応
今のところCalico+WinCNIのみが実際に動く
12Copyright © 2018 System Center User Group Japan. All Rights Reserved.
機能 Calico Flannel WinCNI
Kubernetes
Network Policy
対応
ー (CalicoとFlannelが
競合)
ー
Node間ルーティング
自動設定
ー 対応 ー
Node内L2Bridge ー 対応 対応
Overlay Network ー ー (まだ不安定?) ー
CalicoはまだWindowsのコンテナ間NW設定に非対応
Calico+Flannel on Windowsで起きた問題
13Copyright © 2018 System Center User Group Japan. All Rights Reserved.
• CalicoとFlannelは
どちらもCNIを介
して設定を実施
• 2つのCNIプラグイ
ンが競合し、コン
テナ用仮想NICと
ルーティング設定
が消えてしまう。
出典:https://github.com/projectcalico/canal/blob/master/Canal%20Phase%201%20Diagram.png
Windowsバージョンごとの動作状況
まだWindows Server 2019では正常動作していない・・・
14Copyright © 2018 System Center User Group Japan. All Rights Reserved.
バージョン Calico+WinCNIでのNetwork Policy 動作
Windows Server version 1709 〇
Windows Server 2019 Insider Preview build 17744 ×
症状:Calico-felix.exeが起動した後、vEthernet(Ethernet)を何回も作り替える。
作り変えるたびにMTUが50ずつ減少し、最後は作り変え失敗。
ホストのIPを持つ
InterfaceのMTUが
どんどん小さく
Windowsコンテナーでの
Network Policy動作デモ
Section 3
15Copyright © 2018 System Center User Group Japan. All Rights Reserved.
本日構築するデモ環境
16Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Kubernetes Master
(Ubuntu 17.10)
Worker Node1
(Windows 1709)
Worker Node2
(build 17744)
Worker Node3
(build 17744)
外部NW
192.168.1.0/24
vSwitch
NAT
コンテナNW
172.16.3.0/24
172.16.3.2
192.168.1.33
vSwitch
NAT
コンテナNW
172.16.2.0/24
172.16.2.2
192.168.1.32
vSwitch
NAT
コンテナNW
172.16.1.0/24
172.16.1.2
192.168.1.31
iptables
NAT
コンテナNW
172.16.0.0/24
172.16.0.1
192.168.1.20
Calico
Calico Calico
デモ環境セットアップの流れ
• Wincni.exeを使うL2Bridge構成の
Kubernetesクラスタを構築
過去資料参照
https://www.slideshare.net/anikundesu/kubernetes19windows
https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/getting-started-
kubernetes-windows
• KubernetesへのCalico導入
• Windowsノード向けCalicoの導入
17Copyright © 2018 System Center User Group Japan. All Rights Reserved.
KubernetesへのCalico導入:Master側
18Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Kubernetes Master
(Ubuntu 17.10)
Worker Node1
(Windows 1709)
Worker Node2
(build 17744)
Worker Node3
(build 17744)
外部NW
192.168.1.0/24
vSwitch
NAT
コンテナNW
172.16.3.0/24
172.16.3.2
192.168.1.33
vSwitch
NAT
コンテナNW
172.16.2.0/24
172.16.2.2
192.168.1.32
vSwitch
NAT
コンテナNW
172.16.1.0/24
172.16.1.2
192.168.1.31
iptables
NAT
コンテナNW
172.16.0.0/24
172.16.0.1
192.168.1.20 Calico Calico
Calico
Calico設定YAMLのダウンロード
MicrosoftのNick WoodさんのgithubレポジトリからYAMLファイル生成
Scriptを取得。
参照:https://github.com/nwoodmsft/SDN/blob/docs/Calico/CalicoFelix.md
19Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ sudo apt-get install python2.7
$ git clone https://github.com/nwoodmsft/SDN.git /tmp/calicowin/scripts
$ cd /tmp/calicowin/scripts
$ git checkout docs
$ cd Calico/Linux
$ chmod +x generate.py
$ mkdir ~/kube/calico
$ mv * ~/kube/calico
$ cd ~/kube/calico
Calico設定YAMLの編集
• ClusterCIDRを環境に合わせてYAMLを生成
• Calico-nodeコンテナはLinuxのみ対応
– Windowsでは起動しないようYAML編集
20Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ python2.7 generate.py 172.16.0.0/16 ←ClusterCIDRを引数に渡す
$ vi calico.yaml
(181行目, DaemonSetのspec > template > specの下に以下2行を追記)
nodeSelector:
beta.kubernetes.io/os: linux
Calico導入用YAML適用
• 下記のコマンドで設定を投入
• 設定後、calico-nodeが起動したか確認
21Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f ~/kube/calico/calico.yaml
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-gbwj7 2/2 Running 0 2d
Windows用Calico導入:Woker側
22Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Worker Node1
(Windows 1709)
Worker Node2
(build 17744)
Worker Node3
(build 17744)
外部NW
192.168.1.0/24
vSwitch
NAT
コンテナNW
172.16.3.0/24
172.16.3.2
192.168.1.33
vSwitch
NAT
コンテナNW
172.16.2.0/24
172.16.2.2
192.168.1.32
vSwitch
NAT
コンテナNW
172.16.1.0/24
172.16.1.2
192.168.1.31
iptables
NAT
コンテナNW
172.16.0.0/24
172.16.0.1
192.168.1.20
Calico
Kubernetes Master
(Ubuntu 17.10)
Calico Calico
ここでWindows
用バイナリを
Cross Compile
Windows用calico-felix.exeコンパイル
• Windows用calico-felix.exeのコンパイル
23Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ sudo apt-get install make
$ git clone https://github.com/projectcalico/felix.git
/tmp/calicowin/src
$ cd /tmp/calicowin/src
$ make bin/calico-felix.exe
(コンパイルされたbin/calico-felix.exeをWindows Workerへコピー)
WinCNIベースのWorker設定(復習)
• NIC名変更後にDockerインストール
24Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> Rename-NetAdapter -Name "イーサネット" -NewName "Ethernet“
Dockerのインストール(省略)
PS C:¥> wget https://github.com/Microsoft/SDN/archive/master.zip -o master.zip
PS C:¥> Expand-Archive master.zip -DestinationPath master
PS C:¥> mkdir C:¥k¥
PS C:¥> mv master¥SDN-master¥Kubernetes¥windows¥* C:¥k¥
PS C:¥> cd C:¥k
Insider Buildイメージ利用のための設定
• Insider Buildのイメージ入手とタグ付け
⇒Insider Buildを本家のコンテナイメージのように
使うための設定手順
25Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥k> docker pull mcr.microsoft.com/nanoserver-insider:10.0.17744.1001
PS C:¥k> docker pull mcr.microsoft.com/windowsservercore-insider:10.0.17744.1001
PS C:¥k> docker tag mcr.microsoft.com/nanoserver-insider:10.0.17744.1001
microsoft/nanoserver:latest
PS C:¥k> docker tag mcr.microsoft.com/windowsservercore-insider:10.0.17744.1001
microsoft/windowsservercore:latest
Windows Worker設定(復習)
• Kubernetes Masterにある~/.kube/configファイルを
保存
26Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥k¥> notepad
• メモ帳で上記の出力結果をすべて貼り付ける
• 保存する際、拡張子を「すべてのファイル」にしたうえで「config」というファ
イル名で保存する
$ cat ~/.kube/config
(出力結果をすべてコピー)
calico-felix.exeの実行
• Start.ps1スクリプトの引数
• 実際の実行例(Windows Node 1)
• Calico-felix.exeとstart-calico.ps1を配置
27Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥k> .¥start-calico.ps1
PS C:¥k¥> .¥start.ps1 -ManagementIP 192.168.1.31 -ClusterCIDR 172.16.0.0/16
start.ps1 -ManagementIP <Windows Node IP> -ClusterCIDR <Cluster CIDR>
DEMO:デフォルトNetwork Policy設定
Network Policy定義でPodからのEgress通信、Podへの
Ingress通信を両方拒否
28Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ cat default-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
DEMO:デフォルトNetwork Policy設定
Network Policy適用と状態確認
29Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f default-deny.yaml
$ kubectl get netpol -o wide
NAME POD-SELECTOR AGE
default-deny <none> 2d ←この行が追加される
DEMO:1つのサービスのみ通信許可
win-webserverアプリへのTCP/80許可
30Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ cat allow-winwebserver.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-winwebserver
spec:
podSelector:
matchLabels:
app: win-webserver
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 80
DEMO:1つのサービスのみ通信許可
Network Policy適用と状態確認
31Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f allow-winwebserver.yaml
$ kubectl get netpol -o wide
NAME POD-SELECTOR AGE
allow-winwebserver app=win-webserver 2d ←この行が追加される
default-deny <none> 2d
DEMO:デフォルトPolicyの変更
Network Policy定義でPodからのEgress通信、
PodへのIngress通信を両方許可に変更
32Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ cat default-allow.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-allow
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- {}
egress:
- {}
DEMO:デフォルトPolicyの変更
1. デフォルト許可のNetwork Policyを適用(許可が優先)
2. デフォルト拒否のNetwork Policyを削除(変化なし)
3. デフォルト拒否のNetwork Policyを再適用(変化なし)
33Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f default-allow.yaml
$ kubectl delete -f default-deny.yaml
$ kubectl get netpol -o wide
NAME POD-SELECTOR AGE
allow-winwebserver app=win-webserver 2d
default-allow <none> 2d ←この行が変更される
まとめ:今後のKubernetesの
Windows対応予定
Section 4
34Copyright © 2018 System Center User Group Japan. All Rights Reserved.
まとめ
• KubernetesのNetwork Policyはコンテナ間の通信の分離に利用する。
• 現状CalicoはWindowsコンテナ上ではNetwork Policyの設定にのみ利
用可能。
• 今後のロードマップとして、Calicoによるコンテナ間ネットワーク設定
を実装予定。
• Windowsコンテナでのコンテナ間ネットワークを設定するFlannelとの
連携(canalプロジェクト)はまだ動かない。
35Copyright © 2018 System Center User Group Japan. All Rights Reserved.
復習:WindowsコンテナでのPod実装
• Workerは利用者が作っ
たアプリ実行コンテナ
• Infrastructureは
Kubernetesで自動的に
作られるコンテナ(ただ
Pingしてるだけ・・・)
36Copyright © 2018 System Center User Group Japan. All Rights Reserved.
出典:Windowsのコンテナーネットワーク(ネットワークとセ
キュリティの分離)
https://docs.microsoft.com/ja-
jp/virtualization/windowscontainers/container-networking/network-
isolation-security
コンテナ間通信
はlocalhost経由vNICはInfra側
のみ所有
Windows Admin Centerでコンテナも見れる
37Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Admin CenterはKubernetesを認識
38Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Admin CenterでKubernetesクラスターに
属しているかどうかを自動検知

Kubernetes上のWindows Server コンテナーのマイクロサービス間分離