More Related Content Similar to Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Similar to Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション (20) More from Takashi Kanai (7) Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション2. 自己紹介
• 名前:金井 崇
• 所属:株式会社フロンティア
• 仕事: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.
3. 注意事項
本セッションは、Windows Server Version 1803 英語版とKubernetes 1.10.3での検証結果をもと
に記述をしています。バージョンによっては挙動が異なる場合がありますので、ご留意ください。
本セッション資料は、個人で準備した環境において、個人的に実施した検証・結果を基に記載して
います。あくまで個人の意見・見解であり、所属する会社・組織及びマイクロソフト社とは関係が
ございません。所属する会社・組織・マイクロソフト社の正式な回答・見解ではない事に留意して
ください。
本資料を閲覧した事により問題が生じた場合、または問題が発生しかけた場合、または生じた一切
の不利益について、発表者は一切の責任を負う事はできませんのでご了承ください。
3Copyright © 2018 System Center User Group Japan. All Rights Reserved.
6. Microserviceアーキテクチャの特徴
6
出典:Microservices - a definition of this new architectural term
https://martinfowler.com/articles/microservices.html
Copyright © 2018 System Center User Group Japan. All Rights Reserved.
<従来のアーキテクチャの特徴>
• 1つのプロセス(実行ファイル)内に必要な
機能すべてを実装(Monolithic)
• スケールアウトは機能全体を複製して実現
<Microserviceアーキテクチャの特徴>
• 必要な機能を1つずつ小さなサービスとし
て分離(Microservice)
• スケールアウトはMicroserviceを機能単位
に複製して実現
従来のアーキテクチャ
(Monolithic)
Microcervice
アーキテクチャ
7. Microserviceアーキテクチャの内部
機能ごとにServerとNWとLBができる
7Copyright © 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
スケール
アウト
スケール
アウト
スケール
アウト
スケール
アウト
8. コンテナ管理ソフト:Kubernetes
8Copyright © 2018 System Center User Group Japan. All Rights Reserved.
出典:Kubernetes https://kubernetes.io/
• Googleが2014年から公開したコンテナ管理用の
オープンソースソフトウェア
• コンテナ間NWやStorageの管理などを行う
Management Planeソフトウェア
• コンテナのデファクトになったDockerでは
Docker SwarmだけではなくKubernetesも同梱す
るようになった
コンテナ管理のほぼデファクト
10. コンテナ間ネットワークのトポロジー設計
10Copyright © 2018 System Center User Group Japan. All Rights Reserved.
トポロジー 実装状況 特徴
上位L3ルーティング L3スイッチでStatic Routing 手動でStatic Routingを設定
Host-Gateway 各コンテナホストでStatic
Routing
各ホストで他ホスト向け
Static Routeを手動設定
Open vSwitch(OVS)& OVN
with Overlay
STTなどのOverlayプロトコ
ルをOVS上で実装
Hyper-V vSwitchがあるのに
OVSを入れるとか・・・
FlannelとCNIプラグインに
よるHost Local or Overlay
各コンテナホストでStatic
Routing or VXLANカプセル化
Host Gatewayモードは大体
動く
Calicoによるルーティング BGPでL3ルーティング設定 開発途中
今回は開発が進んだFlannel構成を選択
参照:Using Windows Server Containers in Kubernetes ( https://kubernetes.io/docs/getting-started-guides/windows/ )
13. Pod, Daemon Set
• Pod:Kubernetesで管理されるApplicationの最小単位
以下の構成要素をまとめたもの
– コンテナ:一つもしくは密に連携した複数のコンテナのセット
– ストレージ:Pod内のコンテナでストレージは共有
– ネットワーク:Podに1つのIP。Pod内部はlocalhostで通信
– 設定・属性:作成方法、Labelなど
• DaemonSet:全Nodeで1つずつ実行されるPod
– たとえばNode監視Agentなど。
– Windowsには非対応。AgentなどはホストOS上で実行
13Copyright © 2018 System Center User Group Japan. All Rights Reserved.
14. 実際のPod一覧を見てみる
14Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl get pods -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default win-webserver-6d56b868b5-7pfqd 1/1 Running 1 20d 10.244.5.37 winworker11
kube-system etcd-kube-flannel-master 1/1 Running 4 33d 192.168.1.40 kube-flannel-master
kube-system kube-apiserver-kube-flannel-master 1/1 Running 3 26d 192.168.1.40 kube-flannel-master
kube-system kube-controller-manager-kube-flannel-master 1/1 Running 3 26d 192.168.1.40 kube-flannel-master
kube-system kube-dns-86f4d74b45-z8jx2 3/3 Running 14 33d 10.244.0.6 kube-flannel-master
kube-system kube-flannel-ds-zxpzz 1/1 Running 2 26d 192.168.1.41 linuxworker11
kube-system kube-flannel-ds-zxtpm 1/1 Running 4 33d 192.168.1.40 kube-flannel-master
kube-system kube-proxy-2h982 1/1 Running 2 26d 192.168.1.41 linuxworker11
kube-system kube-proxy-9dq5p 1/1 Running 2 26d 192.168.1.40 kube-flannel-master
kube-system kube-scheduler-kube-flannel-master 1/1 Running 3 26d 192.168.1.40 kube-flannel-master
DaemonSet(Linux Nodeでのみ稼働)
15. Windowsコンテナーネットワーク
• コンテナNWはHyper-V vSwitchにつな
がる。
• Windows Serverコンテナの場合はホス
トOSのvNIC、Hyper-Vコンテナの場合は
仮想マシンNICを利用
• HNS(Host Network Service)がvSwitch
の設定・NAT、VFPなどを設定する。
15Copyright © 2018 System Center User Group Japan. All Rights Reserved.
出典:Windowsのコンテナーネットワーク(コンテナーネットワークの概要)
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/container-networking/architecture
18. 本日構築するデモ環境
18Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Kubernetes Master
(Ubuntu 16.04.4)
Worker Node1
(Windows 1803)
Worker Node2
(Windows 1803)
外部NW
192.168.1.0/24
vSwitch
NAT
コンテナNW
10.244.6.0/24
10.244.6.2
192.168.1.52
vSwitch
NAT
コンテナNW
10.244.5.0/24
10.244.5.2
192.168.1.51
iptables
NAT
コンテナNW
10.244.0.0/24
10.244.0.1
192.168.1.40
Flannel
kube-dns
Flanneld Flanneld
20. 環境のバージョン
20Copyright © 2018 System Center User Group Japan. All Rights Reserved.
ソフトウェア バージョン
Ubuntu(Master Node用) 16.04.4
Ubuntu(Worker Node用) 18.04
Windows Server 英語版(日本語版NG) 1803 (KB未適用)
Kubernetes v1.10.3
Flannel v0.10.0
21. Worker Node1
(Windows 1803)
Worker Node2
(Windows 1803)
vSwitch
NAT
コンテナNW
10.244.6.0/24
10.244.6.2
192.168.1.52
vSwitch
NAT
コンテナNW
10.244.5.0/24
10.244.5.2
192.168.1.51 Flanneld Flanneld
ここで設定する部分
21Copyright © 2018 System Center User Group Japan. All Rights Reserved.
Kubernetes Master
(Ubuntu 16.04.4)
外部NW
192.168.1.0/24
iptables
NAT
コンテナNW
10.244.0.0/24
10.244.0.1
192.168.1.40
Flannel
kube-dns
22. 1-1. Kubernetes Masterのインストール①
• Ubuntu Server 16.04のOSをインストール
• OSに最新パッチ適用とDockerインストール
• Swapの無効化(必須)
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y docker.io
$ sudo vi /etc/fstab
(swapに関するマウント行をコメントアウト)
$ sudo swapoff -a
22Copyright © 2018 System Center User Group Japan. All Rights Reserved.
23. 1-2. Kubernetes Masterのインストール②
• Kubernetesインストールリポジトリ設定
• Kubernetes、kubeadmのインストール
23Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ sudo -I
# apt-get update && apt-get install -y apt-transport-https curl
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
25. 1-4. Kubernetes初期設定②
• Kubectl実行用認証情報の作成
• kubectl動作確認
25Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.40:6443
KubeDNS is running at https://192.168.1.40:6443/api/v1/namespaces/kube-
system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
26. 1-5. Kubernetes初期設定③
• DaemonSetのUpdateStrategy設定確認
• Kube-proxyがLinux NodeのDaemonSetでの
み稼働するよう設定変更
26Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl get ds/kube-proxy -o go-template='{{.spec.updateStrategy.type}}{{"¥n"}}' --
namespace=kube-system
RollingUpdate ←結果がRolling Updateであることを確認
$ wget
https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/l2bridg
e/manifests/node-selector-patch.yml
$ kubectl patch ds/kube-proxy --patch "$(cat node-selector-patch.yml)" -n=kube-system
27. 2‐1. Flannelのインストール準備①
• iptablesでのBridge許可(デフォルトのはず)
• Flannelインストール用YAMLダウンロード
27Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ wget
https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-
flannel.yml
28. 2‐2. Flannelのインストール準備②
• Kube-flannel.ymlの変更
28Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ vi kube-flannel.yml
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": “host-gw"
}
(中略)
nodeSelector:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
追記
Cluster-CIDRと同じであることを確認
デフォルトの”vxlan”から
”host-gw”に修正
29. 2‐3. Flannelのインストール
• Kube-flannel.ymlのapply
• (数分後)Flannel用Podが起動したことを確認
29Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f kube-flannel.yml
$ kubectl get pods -o wide --all-namespaces | egrep "NAMESPACE|kube-flannel-ds"
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kube-flannel-ds-zxtpm 1/1 Running 4 33d
31. 3-1. Windows Worker設定情報取得
• Master NodeでService CIDR情報取得
• Master Nodeでkube-dnsのService IP取得
31Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl cluster-info dump | grep -i service-cluster-ip-range
"--service-cluster-ip-range=10.96.0.0/12"
$ kubectl describe svc/kube-dns -n kube-system
Name: kube-dns
(中略)
IP: 10.96.0.10
(以下略)
33. 3-2. DockerのインストールとOS再起動
• PowerShellでDockerのインストール
• Dockerのサービス起動がうまくいかない
ので、OSを「2回」再起動させる
33Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
PS C:¥> Install-Package -Name Docker -ProviderName DockerMsftProvider
(Yes/Noを聞かれたら「Y」と明示的に入力する)
PS C:¥> Restart-Computer -Force
【2回OS再起動する】
34. 3-3. Windowsコンテナイメージの準備
• WindowsコンテナImageの取得
• Dockerイメージへのタグ付け
34Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> docker pull microsoft/windowsservercore:1803
PS C:¥> docker pull microsoft/nanoserver:1803
PS C:¥> docker tag microsoft/windowsservercore: 1803
microsoft/windowsservercore:latest
PS C:¥> docker tag microsoft/nanoserver: 1803 microsoft/nanoserver:latest
35. 3-4. Kubernetesのインストール①
• 「C:¥k¥」フォルダ以下にKubernetes設
定用Scriptをダウンロード
※ 設定Scriptは保存フォルダがC:¥k¥である前提のため、他の名称は使わない
35Copyright © 2018 System Center User Group Japan. All Rights Reserved.
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¥flannel¥l2bridge¥* C:¥k¥
PS C:¥> rm -recurse -force master,master.zip
PS C:¥> Unblock-File C:¥k¥* ←ダウンロードしたScriptの実行を許可する
36. 3-5. Kubernetesのインストール②
• KubernetesのWindowsバイナリのダウン
ロードと展開
URL: https://storage.googleapis.com/kubernetes-
release/release/v1.10.3/kubernetes-node-windows-amd64.tar.gz
※tar.gz形式なので、Linuxで展開するかツールを別途取得。
• 共有フォルダに展開後、Nodeに保存
36Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> cd C:¥k¥
PS C:¥k¥> cp ¥¥(共有ファイルサーバーのIP)¥(フォルダのパス)¥kube*.exe .¥
37. 3-6. Kubernetesのインストール③
• Kubernetes Masterにある
~/.kube/configファイルを保存
37Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> cd C:¥k¥
PS C:¥k¥> notepad
• メモ帳で上記の出力結果をすべて貼り付ける
• 保存する際、拡張子を「すべてのファイル」にしたうえで「config」というファ
イル名で保存する
$ cat ~/.kube/config
(出力結果をすべてコピー)
38. 3-7. Kubernetesの実行
• Start.ps1スクリプトの引数
• 実際の実行例(Windows Node 1)
38Copyright © 2018 System Center User Group Japan. All Rights Reserved.
PS C:¥> cd C:¥k¥
PS C:¥k¥> .¥start.ps1 -ManagementIP 192.168.1.51 -ClusterCIDR 10.244.0.0/24 -
ServiceCIDR 10.0.96.0/12 -KubeDnsServiceIP 10.96.0.10
start.ps1 -ManagementIP <Windows Node IP> -ClusterCIDR <Cluster CIDR> -ServiceCIDR
<Service CIDR> -KubeDnsServiceIP <Kube-dns Service IP>
39. DEMO:KubernetesでWindowsコンテナ管理
• Windows用サンプルServiceのデプロイ
39Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ kubectl apply -f
https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/l2bridge/
manifests/simpleweb.yml
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
win-webserver-6d56b868b5-7pfqd 1/1 Running 2 21d 10.244.5.47 winworker11
$ kubectl get service win-webserver
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
win-webserver NodePort 10.107.198.123 <none> 80:32283/TCP 26d
$ curl "http://10.107.198.123/"
<html><body><H1>Windows Container Web Server</H1><p>IP 192.168.1.40 callerCount 1
</body></html>
40. 実際のデモ
• Service IPへの疎通確認
• コンテナ内部から外部への疎通確認
• コンテナ内部からの名前解決
40Copyright © 2018 System Center User Group Japan. All Rights Reserved.
41. 補足:MasterがUbuntu 18.04の場合
• コンテナ内部からの名前解決が失敗します。
• KubernetesのコンフィグにDNSリゾルバを明示
的に指定することで解決可能。
41Copyright © 2018 System Center User Group Japan. All Rights Reserved.
$ vi kube-dns.yml (以下の内容で作成)
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
upstreamNameservers: |
[“8.8.8.8", “1.1.1.1"]
$ kubectl apply -f kube-dns.yml
44. 今後の動き
• Kubernetes、Flannel、CNIといったOpen Sourceエコシステムに
Windows Serverコンテナも対応してきた。
• 今後は機能拡充のために以下のような計画がある。
– Network Policy制御に対応するCalicoへの対応
– KubernetesのHyper-Vコンテナ対応(Kubernetes v1.10で実験的サポート開始)
– LCOW(Linux Container on Windows)対応
• 今回の手順もまだまだ面倒
⇒海外MVPの人がAnsibleで全自動構築できるように活動中
https://github.com/ptylenda/kubernetes-for-windows
44Copyright © 2018 System Center User Group Japan. All Rights Reserved.