TL;DR
Photon Controllerのリリースと同時に公開されたDevBoxを利用して、Nested ESXi環境にSwarmクラスターを作成して、Windowsワークステーションのdockerクライアントから利用してみた。
Photon Controllerとは
クラウドネイティブアプリケーションやコンテナの実行環境として最適化された、VMwareのPhotoon Platformのコントローラー。オープンソースとして公開されている。
VMware ESXiハイパーバイザーを上にMesos/Kubernetes/Swarmのクラスターを簡単に構成することができる。
Photon Controllerの詳細はVMwareのJapan Cloud Infrastructure Blogに詳しく書かれている。
DevBoxとは
Photon Platformの機能をラップトップやPCなどの最低限(16GB RAM + 50GB HDD)の環境で試すことができる。DevBoxはOVAとして提供されており、Photon OSを利用している。
DevBox環境のデプロイ方法
Getting Started GuideではVMware FusionもしくはVMware Workstationの利用方法が記載されているが、16GB RAMと50GB HDDをラップトップで用意するのは難しいので、vSphere + NSX環境で作ってみた。DNSやDHCPサービスはNSXがあるとEdge Service Gatewayで簡単に用意できる。
DevBoxに必要なネットワーク
DevBoxは予めIPアドレスが設定されており、Photon Controllerを構成する各種サービスもIPアドレスが構成されているため、以下のネットワーク上で構成する必要がある。
- Network : 192.168.209.0/24
- Default Gateway : 192.168.209.2
- DNS : 192.168.209.2
- DHCP Pool : 192.168.209.129 - 192.168.209.254
NSXを使って構成する場合のネットワーク構成例
DevBoxのデプロイ
DevBoxをダウンロードして、vSphere環境にデプロイする。IPアドレスは事前定義されているため、デプロイ時にはIPアドレスなどのOVFプロパティの指定は不要。PhotonControllerDevbox-11-12-15.ovaは、4vCPU/3GB RAM/80GB HDD。
Nested ESXiの用意
Photon Controllerによって管理するESXiホストをNested ESXiとして用意する。メモリ割り当ては8GB以上。大きいほうがクラスターをたくさん作れるので、16GB程度割り当てるのが望ましい。
Nested ESXiを接続するポートグループはpromiscuousに設定する必要があるので注意。
Photon Controller CLIのインストール
Photon Controller CLIはDevBox上で動作するPhoton ControllerのクライアントCLI。Windows用とMac版が提供されている。(ビルド済みのLinux向けバイナリは公開されていない模様)
- Mac用
- Windows用
ダウンロードした後、PATHが通っている場所に移動すること。(C:¥Windows¥system32 等)
Photon Platformの準備
Photon Controller CLIの接続先指定
Photon Controller CLIの接続先としてDevBoxのPhoton Controllerを指定する
PS C:\> photon target set https://192.168.209.29:443
API target set to 'https://192.168.209.29:443'
Certificate (with below fingerprint) presented by server (192.168.209.29:443) isn't trusted.
MD5 = B9D1D2C1B764B5CB415D00457A7A7312
SHA1 = 433A5D8736000E39EADFF4F700BF37D8DDE307F1
Do you trust this certificate for future communication? (yes/no): yes
Saved your preference for future communicaition with 192.168.209.29:443
ESXiホストの登録
Photon ControllerにNested ESXiを登録する。
PS C:\> photon host create --username root --password [esxpassword] --tag CLOUD --address 192.168.209.31
Host Metadata ({'key':'value'}. required by host of 'MGMT' tag):
Using target 'https://192.168.209.29:443'
Host with ip '192.168.209.31' created: ID = ef86128a-140f-4325-a474-4236fa07cc32
登録したホストの確認
PS C:\> photon host list
Using target 'https://192.168.209.29:443'
ID State IP Tags
ef86128a-140f-4325-a474-4236fa07cc32 READY 192.168.209.31 CLOUD
Total: 1
ESXiホストにはPhoton ControllerのLeaf SchedulerがVIBとしてインストールされ、データストアに必要なフォルダが作成される。
[root@esxi:~] esxcli software vib list | grep Community
photon-controller-agent 0.1.0.dev-5.5.0 VMware CommunitySupported 2015-11-16
ベースイメージの登録
VMDKとして配布されるMesos/Kubernetes/Swarmのベースイメージを登録する。登録したベースイメージはESXiのデータストア(datastore1)に保存される。
PS C:\> photon image create C:\photon-kubernetes-vm-disk1.vmdk -n photon-kubernetes-vm.vmdk -i EAGER
Using target 'https://192.168.209.29:443'
Created image 'photon-kubernetes-vm.vmdk' ID: 32daa1e4-0a71-4326-a24d-59fc6489eb14
PS C:\> photon image create C:\photon-swarm-vm-disk1.vmdk -n photon-swarm-vm.vmdk -i EAGER
Using target 'https://192.168.209.29:443'
Created image 'photon-swarm-vm.vmdk' ID: 612d079e-e166-4fb5-870e-e74d9f9ea78e
PS C:\> photon image create C:\photon-mesos-vm-disk1.vmdk -n photon-mesos-vm.vmdk -i EAGER
Using target 'https://192.168.209.29:443'
Created image 'photon-mesos-vm.vmdk' ID: 45217e98-ddbf-4999-b449-45b4e9ca1d65
PS C:\> photon image list
Using target 'https://192.168.209.29:443'
ID Name State Size(Byte) Replication_type
32daa1e4-0a71-4326-a24d-59fc6489eb14 photon-kubernetes-vm.vmdk READY 85899345968 EAGER
45217e98-ddbf-4999-b449-45b4e9ca1d65 photon-mesos-vm.vmdk READY 85899345968 EAGER
612d079e-e166-4fb5-870e-e74d9f9ea78e photon-swarm-vm.vmdk READY 85899345968 EAGER
Total: 3
Photon Platformの利用
Swarm、Kubernetes、Mesosのクラスター作成が可能。
Swarmクラスターの作成
SwarmクラスターをSlave2台で作成する。Swarmクラスターはmasterとetcd、複数台のSlaveの仮想マシンで構成される。
PS C:\> photon cluster create -n Swarm2 -k Swarm --dns 192.168.209.2 --gateway 192.168.209.2 --netmask 255.255.255.0 --etcd1 192.168.209.55 -s 2
Using target 'https://192.168.209.29:443'
etcd server 2 static IP address (leave blank for none):
Creating cluster: Swarm2 (SWARM)
Slave count: 2
作成したクラスターの確認
作成したクラスターが表示される。
PS C:\> photon cluster list
Using target 'https://192.168.209.29:443'
ID Name Type State Slave Count
0db6bb43-5537-4ece-98c2-d0ae17a0e54a Swarm2 SWARM READY 2
Total: 1
READY: 1
クラスターの詳細情報
「master-xxxx」(192.168.209.173)の仮想マシンがSwarmのmasterとなっている。クラスターのノード(master/slave)はDHCPでIPアドレスを取得する。
PS C:\> photon cluster show 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Using target 'https://192.168.209.29:443'
Cluster ID: 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Name: Swarm2
State: READY
Type: SWARM
Slave count: 2
VM ID VM Name VM IP
d28726ff-ebd4-46a5-acf6-ba54e59a7508 master-505f1abd-3950-4e2a-abf2-a76d08324aac 192.168.209.173
91025592-362b-4c63-9040-0ade0b3d7fbf etcd-097b3dd1-4e8b-4a0c-bf84-95ad3ab8fb00 192.168.209.55
クラスターを構成するVMの確認
PS C:\> photon cluster list_vms 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Using target 'https://192.168.209.29:443'
ID Name State
d28726ff-ebd4-46a5-acf6-ba54e59a7508 master-505f1abd-3950-4e2a-abf2-a76d08324aac STARTED
51d6e7d1-3652-4c42-987d-38c58e3425cf slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85 STARTED
bda835f9-e223-495e-a660-0a6252c6437b slave-f9102f1a-7acf-4f07-9b57-b79eb0c0402e STARTED
91025592-362b-4c63-9040-0ade0b3d7fbf etcd-097b3dd1-4e8b-4a0c-bf84-95ad3ab8fb00 STARTED
Total: 4
STARTED: 4
masterにssh(ユーザー名:root/パスワード:vmware)して確認すると、作成されたSwarmクラスターはSwarm 0.4.0、Docker version 1.8.1。
root@master-505f1abd-3950-4e2a-abf2-a76d08324aac [ ~ ]# export DOCKER_HOST="tcp://localhost:2375"
root@master-505f1abd-3950-4e2a-abf2-a76d08324aac [ ~ ]# docker version
Client:
Version: 1.8.1
API version: 1.20
Go version: go1.4.2
Git commit: d12ea79
Built: Thu Aug 13 02:49:29 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.8.1
API version: 1.20
Go version: go1.4.2
Git commit: d12ea79
Built: Thu Aug 13 02:49:29 UTC 2015
OS/Arch: linux/amd64
root@master-505f1abd-3950-4e2a-abf2-a76d08324aac [ ~ ]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0effdfd20fdb swarm:0.4.0 "/swarm manage etcd:/" 21 minutes ago Up 21 minutes 0.0.0.0:8333->2375/tcp clever_mestorf
0af98e8449df swarm:0.4.0 "/swarm join --addr=1" 21 minutes ago Up 21 minutes 2375/tcp goofy_archimedes
Dockerのインストール
ワークステーションにDockerクライアントをインストールする。最新のDocker 1.9.xをインストールしてしまうとAPIミスマッチのエラーが出てしまうので注意。
Error response from daemon: client is newer than server (client API version: 1.21, server API version: 1.20)
Windowsの場合はここからDocker Toolboxの1.8.xをダウンロードしてインストール。
Swarmクラスターの利用
DOCKER_HOSTとしてSwarm Master(ポート番号は8333)を指定して利用可能。
PS C:\> $env:DOCKER_HOST="tcp://192.168.209.173:8333"
クラスターの状態を見てみる。指定した通りMasterとSlaveが2台できている。
PS C:\> docker info
Containers: 4
Images: 6
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
master-505f1abd-3950-4e2a-abf2-a76d08324aac: 192.168.209.173:2375
└ Containers: 2
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 513.9 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85: 192.168.209.174:2375
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 249.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
slave-f9102f1a-7acf-4f07-9b57-b79eb0c0402e: 192.168.209.175:2375
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 249.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
CPUs: 4
Total Memory: 1013 MiB
Name: 3e44d2b43116
コンテナの確認
3台のVM上でSwarm用のコンテナが起動している。
PS C:\> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09bf640d2360 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp slave-f9102f1a-7acf-4f07-9b57-b79eb0c0402e/high_einstein
f7357b931ea7 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85/lonely_mahavira
3e44d2b43116 swarm:0.4.0 "/swarm manage etcd:/" About an hour ago Up About an hour 192.168.209.173:8333->2375/tcp master-505f1abd-3950-4e2a-abf2-a76d08324aac/cocky_varahamihira
0a1498b816a2 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp master-505f1abd-3950-4e2a-abf2-a76d08324aac/hungry_mestorf
コンテナの起動
Swarm経由でnginxコンテナを起動してみる。
PS C:\> docker run -itd --name nginx -p 8000:80 nginx
ba8ba9590796a88bcd49b0ac6ddca6ea381fc60dd3a1b1b330b71619e61fae87
起動したコンテナの確認。nginxコンテナはslave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85(192.168.207.174)の8000番で起動しているので、ブラウザで接続可能。
PS C:\> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba8ba9590796 nginx "nginx -g 'daemon off" 5 seconds ago Up 2 seconds 443/tcp, 192.168.209.174:8000->80/tcp slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85/nginx
09bf640d2360 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp slave-f9102f1a-7acf-4f07-9b57-b79eb0c0402e/high_einstein
f7357b931ea7 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85/lonely_mahavira
3e44d2b43116 swarm:0.4.0 "/swarm manage etcd:/" About an hour ago Up About an hour 192.168.209.173:8333->2375/tcp master-505f1abd-3950-4e2a-abf2-a76d08324aac/cocky_varahamihira
0a1498b816a2 swarm:0.4.0 "/swarm join --addr=1" About an hour ago Up About an hour 2375/tcp master-505f1abd-3950-4e2a-abf2-a76d08324aac/hungry_mestorf
クラスターのスケールアウト
一度作ったクラスターのSlave台数は後から変更可能。Slave台数を3台に増やしてみる。
PS C:\> photon cluster resize 0db6bb43-5537-4ece-98c2-d0ae17a0e54a 3
Using target 'https://192.168.209.29:443'
Resizing cluster 0db6bb43-5537-4ece-98c2-d0ae17a0e54a to slave count 3
Are you sure [y/n]? y
Cluster resized: ID = 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Note: A background task is running to gradually resize the cluster to its target capacity.
You may continue to use the cluster. You can run 'cluster show '
to see the state of the cluster. If the resize operation is still in progress, the cluster state
will show as RESIZING. Once the cluster is resized, the cluster state will show as READY.
クラスターの状態を確認。「RESIZING」となっている。
PS C:\> photon cluster show 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Using target 'https://192.168.209.29:443'
Cluster ID: 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Name: Swarm2
State: RESIZING
Type: SWARM
Slave count: 3
VM ID VM Name VM IP
d28726ff-ebd4-46a5-acf6-ba54e59a7508 master-505f1abd-3950-4e2a-abf2-a76d08324aac 192.168.209.173
91025592-362b-4c63-9040-0ade0b3d7fbf etcd-097b3dd1-4e8b-4a0c-bf84-95ad3ab8fb00 192.168.209.55
しばらく待ってもう一度確認すると、「READY」になる。
PS C:\> photon cluster show 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Using target 'https://192.168.209.29:443'
Cluster ID: 0db6bb43-5537-4ece-98c2-d0ae17a0e54a
Name: Swarm2
State: READY
Type: SWARM
Slave count: 3
VM ID VM Name VM IP
d28726ff-ebd4-46a5-acf6-ba54e59a7508 master-505f1abd-3950-4e2a-abf2-a76d08324aac 192.168.209.173
91025592-362b-4c63-9040-0ade0b3d7fbf etcd-097b3dd1-4e8b-4a0c-bf84-95ad3ab8fb00 192.168.209.55
docker infoで確認すると、slaveが3台に増えている。
PS C:\> docker info
Containers: 5
Images: 12
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 4
master-505f1abd-3950-4e2a-abf2-a76d08324aac: 192.168.209.173:2375
└ Containers: 2
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 513.9 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
slave-3eaa99ae-ee0f-46ac-a0ed-bca2e5af7a85: 192.168.209.174:2375
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 249.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
slave-f9102f1a-7acf-4f07-9b57-b79eb0c0402e: 192.168.209.175:2375
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 249.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
slave-f93ca2e3-74a2-467a-b416-f5beb4b08463: 192.168.209.183:2375
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 249.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=4.0.9, operatingsystem=VMware Photon/Linux, storagedriver=overlay
CPUs: 5
Total Memory: 1.233 GiB
Name: 3e44d2b43116
クラスターのスケールイン
残念ながら今のところサポートされていない模様。
PS C:\> photon cluster resize 0db6bb43-5537-4ece-98c2-d0ae17a0e54a 2
Using target 'https://192.168.209.29:443'
Resizing cluster 0db6bb43-5537-4ece-98c2-d0ae17a0e54a to slave count 2
Are you sure [y/n]? y
2015/11/20 12:42:28 esxcloud: Task '5f9046cd-3754-4323-aeb2-ea6f82953d02' is in error state. Examine task for full details.
API Errors: [esxcloud: { HTTP status: '0', code: 'InternalError', message: 'Reducing cluster size is not supported. Current cluster size: 3. New cluster size: 2.', data: 'map[]' }]