VMware Photon Controllerの使い方


#TL;DR
Photon Controllerのリリースと同時に公開されたDevBoxを利用して、Nested ESXi環境にSwarmクラスターを作成して、Windowsワークステーションのdockerクライアントから利用してみた。

#Photon Controllerとは
クラウドネイティブアプリケーションやコンテナの実行環境として最適化された、VMwareのPhotoon Platformのコントローラー。[オープンソースとして公開](https://github.com/vmware/photon-controller)されている。
VMware ESXiハイパーバイザーを上にMesos/Kubernetes/Swarmのクラスターを簡単に構成することができる。
Photon Controllerの詳細は[VMwareのJapan Cloud Infrastructure Blog](https://blogs.vmware.com/jp-cim/2015/11/photon-controller.html)に詳しく書かれている。

#DevBoxとは
Photon Platformの機能をラップトップやPCなどの最低限(16GB RAM + 50GB HDD)の環境で試すことができる。DevBoxはOVAとして提供されており、[Photon OS](https://github.com/vmware/photon)を利用している。

##DevBox環境のデプロイ方法
[Getting Started Guide](http://blogs.vmware.com/cloudnative/files/2015/11/Photon-Controller-Getting-Started-Guide-20151116.pdf)では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を使って構成する場合のネットワーク構成例
![network.png](https://qiita-image-store.s3.amazonaws.com/0/27668/8dc30198-2310-56f0-858c-202fcf56dd3a.png)

##DevBoxのデプロイ
[DevBox](https://bintray.com/artifact/download/photon-controller/public/UserWorkflow/PhotonControllerDevbox-11-12-15.ova)をダウンロードして、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用](https://bintray.com/artifact/download/photon-controller/public/UserWorkflow/photon)
- [Windows用](https://bintray.com/artifact/download/photon-controller/public/UserWorkflow/photon.exe)

ダウンロードした後、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の場合は[ここ](https://github.com/docker/toolbox/releases)から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[]' }]
```