ラベル VIC の投稿を表示しています。 すべての投稿を表示
ラベル VIC の投稿を表示しています。 すべての投稿を表示

2018年3月30日金曜日

VMware Admiral で SSL を有効にする方法

概要

VMware Admiral で SSL 通信を有効にしてみました
ドメイン+証明書もちゃんと設定しています
ドメイン証明書の取得方法については過去の記事を参考にしてみてください

環境

  • Ubuntu 16.04
  • docker 18.03.0-ce, build 0520e24
  • admiral

SSL を有効にして admiral を起動

  • docker run -d -p 443:8383 --name admiral -e ADMIRAL_PORT=-1 -e XENON_OPTS="--securePort=8383 --certificateFile=/tmp/fullchain.key --keyFile=/tmp/private.key" -v /etc/letsencrypt/live/admiral.cm-system.ga/fullchain.pem:/tmp/fullchain.key -v /etc/letsencrypt/live/admiral.cm-system.ga/privkey.pem:/tmp/private.key vmware/admiral

コマンドがやや長いですが指定するのは SSL のポートと証明書、秘密鍵だけです
admiral 側は /tmp を指定しておきます
そしてローカル側に取得した SSL 証明書を配置しておいて、それをコンテナにマウントすることでコンテナに証明書を参照させます

上記の例は Let’s Encrypt で取得した証明書と秘密鍵を指定しています

ADMIRAL_PORT=-1 にすると SSL ではないポートでは LISTEN しなくなります

動作確認

あとはブラウザ https に接続するだけです

最後に

VMware Admiral で SSL を有効にする方法を紹介しました
docker コマンドでもできるようです

2018年1月29日月曜日

VMware Admiral で API を使ってテンプレートを docker-compose.yml としてエクスポートする方法

概要

Admiral は作成したテンプレートをエクスポートできる機能があります
管理画面からはテンプレートの一覧でエクスポートボタンを押せば YAML ファイルがダウンロードできます
API でも取得することができたのでその方法を紹介します

環境

  • Ubuntu 16.04.3
  • Admiral v1.3.0

API でテンプレートを取得する

docker-compose.yml を取得する場合はこんな感じでコールします

  • curl -H 'localhost:8282/resources/composite-templates/?selfLink=/resources/composite-descriptions/877dd4190ad5dc75563935eeacdb0&format=docker'

877dd4190ad5dc75563935eeacdb0 の部分はテンプレートの ID を入力してください
これで以下のような YAML 情報がテキストで取得できます

---
version: "2"
services:
  web:
    image: "registry.hub.docker.com/library/nginx"
    restart: "no"

上記のテンプレートは nginx イメージで作成したコンテナ定義を 1 つ追加した場合の YAML になります
ちなみにユーザ認証を有効にした場合は x-xenon-auth-token ヘッダを付与してコールしてください

また最後の format=docker を外すとテンプレート自体の定義をエクスポートすることができます
エクスポートした定義は Admiral 上にインポートすることでテンプレートとして使うことができます

最後に

Admiral でテンプレートから docker-compose.yml をエクスポートする方法を紹介しました
結構便利な機能かなと思います
ただ docker-compose のバージョンが 2 までしか対応してないのでバージョン 3 以上に対応する場合は取得したあと自分でコンバートする必要があります

参考サイト

2018年1月25日木曜日

VMware Admiral で docker-compose 的なことをしてみる

概要

VMware Admiral には docker-compose 的なことを実現するためにテンプレートという機能があります
今回はテンプレートを使った複数コンテナの起動方法を紹介します

環境

  • Ubuntu 16.04.3
  • docker 17.12.0-ce
  • Admiral v1.3.0

プロジェクトの作成

Admiral にはデフォルトで「default-project」というプロジェクトが用意されています
今回はそのプロジェクトを使って薦めます
なので、プロジェクトは必要であれば作成してください

作成の仕方は

管理 -> プロジェクト -> プロジェクトの追加

から新規でプロジェクトを作成できます

クラスタの登録

次にクラスタを登録しましょう
クラスタの登録には docker host or VCH が必要になります
今回は事前に Ubuntu 上に docker をインストールし tcp でのリモートコントロールを有効にしました

追加するには左メニューから

インフラストラクチャ -> クラスタ -> 新規

から追加できます
admiral_docker_compose1.png

テンプレートの登録

とりあえず空のテンプレートを作成しましょう
左メニューから

ライブラリ -> テンプレート -> テンプレートの作成

で好きな名前を入力しましょう
とりあえずこれで作成できれば OK です
admiral_docker_compose2.png

コンテナ定義の追加

テンプレートが作成できたらその中にコンテナ定義を追加していきましょう
docker-compose 的なことがしたいのでコンテナ定義はそれぞれのコンテナ分作成します
そして今回は redis + golang で書かれた Web アプリを作成したいと思います

redis

まずは redis イメージを使ってコンテナ定義を追加します
作成したテンプレート tpl1 を選択して「コンテナ追加」を選択しましょう
admiral_docker_compose3.png

次のイメージの選択です
Admiral ではデフォルトで DockerHub で公開されているイメージを検索することができます
「redis」で検索すると公式の redis イメージが表示されるのでそれを選択しましょう
admiral_docker_compose4.png

すると更にコンテナ定義の詳細を設定する画面になります
ここは所謂 docker-compose.yml に定義する link や volume、環境変数などを設定する画面になります
redis の定義では 1 つだけ設定を追加します

ネットワーク -> ホスト名

に「redis」と入力しましょう
これを設定することで別のコンテナからホスト名 redis で参照することができるようになります
admiral_docker_compose5.png

あとは「追加」すれば OK です

memo

今度は golang の Web アプリのコンテナ定義を追加します
先ほどと同様にコンテナの追加を選択しましょう
admiral_docker_compose6.png

イメージはこれを使います
該当のイメージを検索して選択しましょう
admiral_docker_compose7.png

そしてコンテナ定義の詳細設定です
まず先ほど作成した redis とリンクさせます

基本 -> リンク-> サービス

で事前に作成しておいた redis 定義を選択します
ちなみにタグですが今回のイメージに ver_golang があるのでこれを選択します
admiral_docker_compose8.png

次のコンテナホスト上で LISTEN するポートを設定します

ネットワーク -> ポートバインド

でホストポートを 80 番にしコンテナポートを 8080 番にします
Web アプリ側はホスト名の設定は不要です
admiral_docker_compose9.png

更に環境変数を設定します
今回の Web アプリは redis の URI を環境変数で設定できるので、そのための環境変数を設定します

環境 -> 環境変数

で名前に REDIS_URL を入力し値に redis://redis:6379/0 と入力します
admiral_docker_compose10.png
これで Web アプリ側の設定は完了です
「追加」で定義を作成しましょう

プロビジョニングする

tpl1 を選択すると作成した 2 つの定義があると思います
このページの右上にプロビジョニングがあるので選択してみましょう
すると作成したコンテナ定義の情報を元にクラスタ上にコンテナを作成してくれます
admiral_docker_compose11.png

動作確認

しばらくするとプロビジョニングが完了します
左メニューのコンテナを選択するとプロビジョニングしたコンテナの一覧が表示されます
admiral_agent はクラスタとして追加したホスト上に必ず作成されるコンテナになります
admiral_docker_compose12.png

memo 側のコンテナを選択するとアプリの URL にアクセスできるのでちゃんとアプリが起動しているか確認してみましょう
admiral_docker_compose13.png

ちなみに追加したクラスタ内のコンテナホストで docker ps を実行するとちゃんとコンテナが起動していることがわかります

CONTAINER ID        IMAGE                        COMMAND                  CREATED              STATUS              PORTS                     NAMES
c9be7f0cff40        kakakikikeke/memo:latest     "/bin/sh -c 'bundle …"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp      memo-mcm410-65242387561
e4107fe01381        redis:latest                 "docker-entrypoint.s…"   4 minutes ago        Up 4 minutes        0.0.0.0:32769->6379/tcp   redis-mcm409-65242385176
cad21f08519f        vmware/admiral_agent:1.3.0   "/bin/bash /entrypoi…"   2 hours ago          Up 2 hours          0.0.0.0:32768->4200/tcp   admiral_agent

最後に

VMware Admiral で docker-compose のように複数のコンテナを一度に立ち上げて Web アプリを構築してみました
docker-compose.yml の情報を Admiral に移植するだけなので、すでに docker-compose で動作するものがあれば簡単に Admiral 上で動かすことができると思います

Admiral ではイメージのビルドまでは行えないので作成したイメージは今回のように事前に Dockerhub で公開しておきましょう

いきなりこっちで docker-compose の定義を作成することも可能ですが、まずは手元で docker-compose.yml を作成して Admiral に移植すると良いと思います

Admiral を使うメリットしては

  • コンテナがダウンしたときに自動で新しいコンテナを作成してくれる
  • 最低起動コンテナ数を指定することができ、その数までは自動でスケールアウトしてくれる
  • コンテナホストを追加すれば swarm のようなクラスタが簡単に組める

あたりかなと思います

2018年1月13日土曜日

VMware Admiral で API を使ってテンプレートを操作する方法

概要

前回 VMware Admiral の REST API を試してみました

今回は更にテンプレートの操作も API でやってみたのでその方法を紹介します

環境

  • macOS 10.13.2
  • docker 17.12.0-ce
  • Admiral v1.3.0

テンプレートを追加する

  • リクエスト
curl -X POST \
'http://localhost:8282/resources/composite-descriptions' \
-H 'x-project: /projects/default-project' \
-H 'content-type: application/json' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzM1Mjg2fQ.j03awiWf4Esmc_Wb9Tar6fZFVv3g3i48k_JqytPevoA' \
-d '{"name":"test","descriptionLinks":[]}'
  • レスポンス
{
  "name": "test",
  "descriptionLinks": [],
  "tenantLinks": [
    "/projects/default-project"
  ],
  "documentVersion": 0,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription",
  "documentSelfLink": "/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8",
  "documentUpdateTimeMicros": 1515731735853001,
  "documentUpdateAction": "POST",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

name は実は任意パラメータです
指定しないとランダムの文字列でテンプレート名を作成します
プロジェクトやクラスタは name が必須なのですがテンプレートは違うようです

テンプレートの一覧を取得する

  • リクエスト
curl -X GET \
'http://localhost:8282/templates?q=*' \
-H 'x-project: /projects/default-project' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzM1Mjg2fQ.j03awiWf4Esmc_Wb9Tar6fZFVv3g3i48k_JqytPevoA'
  • レスポンス
{
  "results": [
    {
      "templateType": "COMPOSITE_DESCRIPTION",
      "name": "test",
      "descriptionLinks": [],
      "tenantLinks": [
        "/projects/default-project"
      ],
      "documentVersion": 0,
      "documentEpoch": 0,
      "documentKind": "com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription",
      "documentSelfLink": "/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8",
      "documentUpdateTimeMicros": 1515732089628001,
      "documentUpdateAction": "POST",
      "documentExpirationTimeMicros": 0,
      "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
      "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
    }
  ],
  "isPartialResult": false
}

q は必須パラメータです
x-project でプロジェクトを指定しなかった場合はすべてのプロジェクトからテンプレートを取得します

GET /resources/composite-descriptions でも取得できるようですが name などの情報は取得できません

テンプレートの詳細を取得する

  • リクエスト
curl -X GET \
'http://localhost:8282/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzM1Mjg2fQ.j03awiWf4Esmc_Wb9Tar6fZFVv3g3i48k_JqytPevoA'
  • レスポンス
{
  "name": "test",
  "descriptionLinks": [],
  "tenantLinks": [
    "/projects/default-project"
  ],
  "documentVersion": 0,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription",
  "documentSelfLink": "/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8",
  "documentUpdateTimeMicros": 1515732089628001,
  "documentUpdateAction": "POST",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

テンプレートを削除する

  • リクエスト
curl -X DELETE \
'http://localhost:8282/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzM1Mjg2fQ.j03awiWf4Esmc_Wb9Tar6fZFVv3g3i48k_JqytPevoA'
  • レスポンス
{
  "name": "test",
  "descriptionLinks": [],
  "tenantLinks": ["/projects/default-project"],
  "documentVersion": 1,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription",
  "documentSelfLink": "/resources/composite-descriptions/4d9e8d32664228755628ccbb0b7c8",
  "documentUpdateTimeMicros": 1515731950045000,
  "documentUpdateAction": "DELETE",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

コンテナ定義の追加

テンプレートは作成しただけではコンテナのプロビジョニングができません
コンテナ定義を追加する必要があります
他にもボリューム定義やネットワーク定義、クロージャ定義の追加があります
以下はコンテナ定義を追加するリクエストです

  • リクエスト
curl -X POST 'http://localhost:8282/resources/container-descriptions' \
-H 'content-type:application/json' \
-H 'x-xenon-auth-token: ' \
-H 'x-project:/projects/default-project' \
-d '{"image":"registry.hub.docker.com/library/nginx","name":"nginx","command":[],"links":[],"deploymentPolicyId":null,"portBindings":[{"hostPort":"","containerPort":"80"}],"publishAll":true,"hostname":null,"networkMode":null,"networks":{},"volumes":[],"volumesFrom":[],"workingDir":null,"_cluster":1,"restartPolicy":"no","maximumRetryCount":null,"cpuShares":null,"memoryLimit":null,"memorySwapLimit":null,"affinity":[],"env":[],"customProperties":{},"healthConfig":{},"logConfig":{"type":null,"config":{}}}'

基本的にはコンテナを run するための種となる情報を定義します
イメージの情報やポートの情報、環境変数などが定義できます

  • レスポンス
{
  "image": "registry.hub.docker.com/library/nginx",
  "command": [],
  "instanceAdapterReference": "/adapters/docker-service",
  "affinity": [],
  "_cluster": 1,
  "env": [],
  "volumes": [],
  "publishAll": true,
  "portBindings": [{
    "hostPort": "",
    "containerPort": "80"
  }],
  "logConfig": {
    "config": {}
  },
  "links": [],
  "volumesFrom": [],
  "restartPolicy": "no",
  "networks": {},
  "name": "nginx",
  "customProperties": {},
  "tenantLinks": ["/projects/default-project"],
  "documentVersion": 0,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:ContainerDescriptionService:ContainerDescription",
  "documentSelfLink": "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8",
  "documentUpdateTimeMicros": 1515741701305001,
  "documentUpdateAction": "POST",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

_cluster の値を大きくすることで最低限存在しなければならないコンテナ数を設定することができます

コンテナ定義とテンプレートを紐付ける

  • リクエスト
curl -X PATCH 'http://localhost:8282/resources/composite-descriptions/4d9e8d32664228755628dff8ade3a' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzQ1Mjc4fQ.u8_SThTzX0CiiFGVq6NeqDUBKcMmmKOr_7ql5FufZng' \
-H 'x-project:/projects/default-project' \
-H 'content-type:application/json' \
-d '{"name":"","descriptionLinks":["/resources/container-descriptions/4d9e8d32664228755628f1dad72a8"],"tenantLinks":["/projects/default-project"],"documentVersion":8,"documentEpoch":0,"documentKind":"com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription","documentSelfLink":"/resources/composite-descriptions/4d9e8d32664228755628dff8ade3a","documentUpdateTimeMicros":1515741517583001,"documentUpdateAction":"PATCH","documentExpirationTimeMicros":0,"documentOwner":"3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443","documentAuthPrincipalLink":"/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="}'
  • レスポンス
{
  "name": "",
  "descriptionLinks": [
    "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8"
  ],
  "tenantLinks": [
    "/projects/default-project"
  ],
  "documentVersion": 11,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:CompositeDescriptionService:CompositeDescription",
  "documentSelfLink": "/resources/composite-descriptions/4d9e8d32664228755628dff8ade3a",
  "documentUpdateTimeMicros": 1515743075171001,
  "documentUpdateAction": "PATCH",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

テンプレートが作成された段階では descriptionLinks が空の状態です
ここを作成したコンテナ定義の ID (4d9e8d32664228755628f1dad72a8) で更新してあげることで紐付けを行うことができます
この作業をしないと admiral の管理画面でテンプレートからコンテナ定義を確認することができません

コンテナ定義の一覧の取得

  • リクエスト
curl -X GET 'http://localhost:8282/resources/container-descriptions' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzQ1Mjc4fQ.u8_SThTzX0CiiFGVq6NeqDUBKcMmmKOr_7ql5FufZng' \
-H 'x-project:/projects/default-project'
  • レスポンス
{
  "totalCount": 1,
  "documentLinks": [
    "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8"
  ],
  "documents": {
    "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8": {
      "image": "registry.hub.docker.com/library/nginx",
      "command": [],
      "instanceAdapterReference": "/adapters/docker-service",
      "affinity": [],
      "_cluster": 1,
      "env": [],
      "volumes": [],
      "publishAll": true,
      "portBindings": [
        {
          "hostPort": "",
          "containerPort": "80"
        }
      ],
      "logConfig": {
        "config": {}
      },
      "links": [],
      "volumesFrom": [],
      "restartPolicy": "no",
      "networks": {},
      "name": "nginx",
      "customProperties": {},
      "tenantLinks": [
        "/projects/default-project"
      ],
      "documentVersion": 0,
      "documentEpoch": 0,
      "documentKind": "com:vmware:admiral:compute:container:ContainerDescriptionService:ContainerDescription",
      "documentSelfLink": "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8",
      "documentUpdateTimeMicros": 1515741701305001,
      "documentUpdateAction": "POST",
      "documentExpirationTimeMicros": 0,
      "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
      "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
    }
  },
  "documentCount": 1,
  "queryTimeMicros": 997,
  "documentVersion": 0,
  "documentUpdateTimeMicros": 0,
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443"
}

コンテナ定義の削除

  • リクエスト
curl -X DELETE 'http://localhost:8282/resources/container-descriptions/4d9e8d32664228755628f1dad72a8' \
-H 'x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NzQ1Mjc4fQ.u8_SThTzX0CiiFGVq6NeqDUBKcMmmKOr_7ql5FufZng' \
-H 'x-project:/projects/default-project'
  • レスポンス
{
  "image": "registry.hub.docker.com/library/nginx",
  "command": [],
  "instanceAdapterReference": "/adapters/docker-service",
  "affinity": [],
  "_cluster": 1,
  "env": [],
  "volumes": [],
  "publishAll": true,
  "portBindings": [
    {
      "hostPort": "",
      "containerPort": "80"
    }
  ],
  "logConfig": {
    "config": {}
  },
  "links": [],
  "volumesFrom": [],
  "restartPolicy": "no",
  "networks": {},
  "name": "nginx",
  "customProperties": {},
  "tenantLinks": [
    "/projects/default-project"
  ],
  "documentVersion": 1,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:compute:container:ContainerDescriptionService:ContainerDescription",
  "documentSelfLink": "/resources/container-descriptions/4d9e8d32664228755628f1dad72a8",
  "documentUpdateTimeMicros": 1515742131728000,
  "documentUpdateAction": "DELETE",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "3d0223ea-5e52-4dd6-8c68-5e9ddfb8a443",
  "documentAuthPrincipalLink": "/core/authz/users/YWRtaW5AYWRtaXJhbC5sb2NhbA=="
}

最後に

VMware admiral の API を使ってテンプレートの操作をしてみました
/resources/composite-descriptions/templates を使い分けるようです
ざっと見た感じだと templates は DockerHub で公開されているイメージも検索することが可能で composite-descriptions は自信で作成したテンプレートに関しての操作かなと思います
あとはテンプレートは作成しただけでは特に効果はなく、その中にコンテナやボリュームの定義を追加することでアプリのデプロイなどが行なえます

admiral の UI でリクエストしている情報をベースに作成しているので実際にはどちらかだけを使えば OK なのかもしれません

2018年1月12日金曜日

VMware VIC v1.3.0 の REST API を試してみた

概要

VMware VIC v1.3.0 で VCH を REST API で作成できる機能が追加されました
とりあえず触ってみたので備忘録として残しておきます

環境

  • Ubuntu 16.04.3
  • VIC v1.3.0

インストール

実は執筆時点ではまだバイナリを直接ダウンロードすることはできません
My VMware から OVA をダウンロードすることはできます
今回はソースをダウンロードして自分でビルドしました
過去にやり方を紹介しているのでビルド方法はそちらを参照してください

最終的に vic-machine-server というバイナリがあれば OK です

API サーバを起動する

先程のビルドで生成されたものを使います

  • cd bin
  • ./vic-machine-server --scheme=http --host=0.0.0.0 --port 18080

--port は好きなポートに変更してください

動作確認

curl を使っていろいろとコールしてみました

Hello World

とりあえずプロセスが正常に起動しているか確認してみましょう

  • curl -u 'vcenter-user:pass' 'http://localhost:18080/container/hello'

で「You have successfully accessed the VCH Management API.」と出れば起動成功です
ベースパスが /container になっているようなので必ず先頭に付与してください
今回認証はベーシック認証を使っています
vSphere Client などを使ってログインするユーザ名とパスワードを使ってログインしてください

vch を作成する

まずは vch を作成してみます
POST /taraget/{vcenterIP}/datacenter/{datacenterId}/vch を使います
必要な情報はリクエストボディに JSON を設定して送信します

curl \
-X POST \
-u 'vcenter-user:vcenter-pass' \
'http://localhost:18080/container/target/192.168.100.10/datacenter/datacenter-21/vch?thumbprint=F9%3A03%3A2C%3A25%3A45%3A07%3ACE%3A24%3A4F%3A14%3A70%3A95%3A7E%3AB4%3A68%3A87%3AB1%3A2E%3AC1%3AEC' \
-H 'content-type: application/json' \
-d @- << EOF
{
  "name": "test_vch",
  "compute": {
    "resource": {
      "name": "Cluster001"
    }
  },
  "storage": {
    "volume_stores": [{
      "datastore": "datastore1/test",
      "label": "default"
    }],
    "image_stores": ["datastore1"]
  },
  "network": {
    "bridge": {
      "ip_range": "172.16.0.0/12",
      "port_group": {
        "name": "vic-bridge-001"
      }
    },
    "public": {
      "port_group": {
        "name": "public_net"
      }
    }
  }
}
EOF

192.168.100.10 の部分は vCenter の IP を入力してください
また今回は vCenter が IP ベースの通信になるので thumbprint を指定します
compute-resource はクラスタ名を入力してください

ここでポイントなのがデータセンターの指定方法ですが vSphere Client で表示される名前ではないことに注意してください
dcli や mob で確認することができるデータセンター ID になります
vSphere Client のブラウザ版であれば URL の部分に「objectId=urn:vmomi:Datacenter:datacenter-21」みたいな部分があるのでその値を使ってください
(クラスタ名は名前でいいのにデータセンター名は ID でなければいけない理由がよくわかりませんでした、、、)

そして重要なリクエストボディです
まず name で作成する vch 名を指定します
次に compute -> resource -> name でクラスタ名を指定します
上述の通りクラスタ名は mobID ではなく名前で OK です
あとは storage と network を指定します
storage は volume_storesimage_stores を指定します
image_stores は文字列でデータストア名を指定するだけなのですが、volume_stores は少し指定の仕方が違うので注意してください
network は bridge と public を指定します
bridge に関してはコンテナが起動した際に接続するネットワークのレンジを指定する必要があるので設定しましょう

これで VCH を作成することができます
他にも別のネットワークを設定したり証明書を設定したりすることができるパラメータがあります
詳しくは後述するドキュメントを参照してみてください

vch の一覧を取得する

次に作成した vch の情報を取得してみます
GET /taraget/{vcenterIP}/datacenter/{datacenterId}/vch/ を使います

curl \
-X GET \
-u 'vcenter-user:vcenter-pass' \
'http://localhost:18080/container/target/192.168.100.10/datacenter/datacenter-21/vch/vm-1304?thumbprint=F9%3A03%3A2C%3A25%3A45%3A07%3ACE%3A24%3A4F%3A14%3A70%3A95%3A7E%3AB4%3A68%3A87%3AB1%3A2E%3AC1%3AEC'

先ほどの登録とほぼ同じです
vchId を指定しないことで一覧を取得することができます
vchId を指定することで特定に vch の詳細情報を取得することができます
vic-machine コマンドで言うところの inspect 相当の情報が取得できます (後述)

レスポンスは以下の通りです

{
 "vchs": [
   {
     "admin_portal": "https://192.168.200.10:2378",
     "docker_host": "192.168.200.10:2375",
     "id": "vm-1293",
     "name": "test_vch",
     "upgrade_status": "VCH has newer version",
     "version": "v1.2.1-13858-c3db65f"
   }
 ]
}

ここで気がついたんですが version のところが v1.2.1 になっていました
My VMware でも v1.2 は配布していたのでもしかすると Github のバージョンは v1.3.0 でしたが、公式では v1.2 でも API 機能が含まれているかもしれません

単なる勘違いでした
API 経由で作成すれば問題なく v1.3.0 になっています

vch の詳細を取得する

指定した vch のみ取得してみましょう
GET /taraget/{vcenterIP}/datacenter/{datacenterId}/vch/{vchId} を使います

curl \
-X GET \
-u 'vcenter-user:vcenter-pass' \
'http://localhost:18080/container/target/192.168.100.10/datacenter/datacenter-21/vch/vm-1304?thumbprint=F9%3A03%3A2C%3A25%3A45%3A07%3ACE%3A24%3A4F%3A14%3A70%3A95%3A7E%3AB4%3A68%3A87%3AB1%3A2E%3AC1%3AEC'

ここでまたポイントなのですが vch を作成するときは vchId の部分に名前を指定しましたが詳細を取得する場合には ID を指定します
datacenter 同様 vch も ID を指定しないとそんな vch 見つからないと言われてエラーとなります

vch を削除する

最後に vch を削除してみます
先ほどの詳細を取得する API を DELETE でコールするだけです

curl \
-X DELETE \
-u 'vcenter-user:vcenter-pass' \
'http://localhost:18080/container/target/192.168.100.10/datacenter/datacenter-21/vch/vm-1302?thumbprint=F9%3A03%3A2C%3A25%3A45%3A07%3ACE%3A24%3A4F%3A14%3A70%3A95%3A7E%3AB4%3A68%3A87%3AB1%3A2E%3AC1%3AEC'

ただ以下のエラーが返ってきました

{
 "message": "VCH version \"v1.2.1-13858-c3db65f\" is different than API version v1.3.0-rc1-0-4c17da5"
}

おそらくバグかなと思います
vic-machine-linux であれば --force オプションを付与すれば削除することができました
My VMware からダウンロードできる公式版であればこのエラーは出ないのかもしれません
これも勘違いでした
問題なく削除できます

(おまけ) Swagger UI でドキュメントを表示する

  • swagger serve "http://127.0.0.1:18080/swagger.json" --port=28080 --no-open --host=0.0.0.0

--port で LISTEN するポートは好きに変更してください
これで http://127.0.0.1:28080/docs にブラウザでアクセスすると go-swagger の UI が表示されます

最後に

VMware VIC v1.3.0 で追加された API 機能を試してみました
バイナリを動かすだけなので簡単です
ドキュメントがまだ整備されていないので何ともですが swagger UI を見ながら頑張れば何とかなると思います

参考サイト

2018年1月11日木曜日

VMware Admiral にユーザ認証機能を追加してみる

概要

Admiral はデフォルトでは認証機能がありません
ユーザ認証を追加したい場合は別途自分でユーザを追加する必要があります
今回はその方法を紹介したいと思います

環境

  • macOS 10.13.2
  • docker 17.12.0-ce
  • Admiral v1.3.0

※ Ubunt 16.04.3 + docker 17.05.0-ce だとうまく動作しない機能がありました

local-users.json を作成する

  • cd /root/work/admiral
  • vim local-users.json
{
 "users": [{
   "email": "admin@admiral.local",
   "password": "Password1!"
 }, {
   "email": "user1@admiral.local",
   "password": "secret1"
 }, {
   "email": "user2@admiral.local",
   "password": "secret2"
 }]
}

users プロパティに email と password プロパティを持つオブジェクトを配列で追加していきます

ファイルを指定して admiral を起動する

  • docker run -d -p 8282:8282 --name admiral -e XENON_OPTS="--localUsers=/tmp/local-users.json" -v /root/work/admiral/local-users.json:/tmp/local-users.json vmware/admiral

作成した JSON ファイルをコンテナにマウントします
そして XENON_OPTS の --localUsers オプショションでコンテナ上に配置した JSON ファイルを指定することで認証を有効にすることができます

ログインする

http://localhost:8282 にアクセスするとログイン画面が表示されるようになるので local-users.json に記載されたユーザ情報でログインできるか確認してみましょう
admiral_enable_auth1.jpg

ユーザの管理者権限を制御する

デフォルトだと JSON に定義されたユーザはみな管理者権限を持っています
このままだと全員がすべてのプロジェクトにアクセスすることができ、かつプロジェクトの追加やユーザコントロールができてしまいます

なのでまずは管理者権限が不要なユーザから権限を削除しましょう

管理 -> ID 管理 -> ユーザおよびグループ

で検索ボックスで何でもいいので検索するとユーザが出てきます
ユーザが表示されたらチェックボックスをチェックし「管理者ロールの割り当てを解除」を選択することで権限を削除できます
admiral_enable_auth2.png

こんな感じで他のユーザにも権限の解除 or 付与を行います

プロジェクトにユーザ情報を紐付ける

では、実際に ACL が効いているか確認してみましょう
default-project に触れるユーザを設定します

管理 -> プロジェクト -> default-project -> メンバー -> 追加

でユーザを追加しましょう
追加する際にロールを決められるので必要なロールを設定してください
コンテナやテンプレートの作成ができるようにするには「開発者」ロールを選択しましょう
admiral_enable_auth3.png

プロジェクトの内容だけ確認させたい場合は「閲覧者」ロールを選択すると Read only なユーザを作成することができます

ACL の動作確認

admin, user1, user2 でそれぞれログインしてみましょう

admin の場合は default-project も見え管理のタブも表示されていると思います
user1 の場合は default-project が見えテンプレートの追加やコンテナの操作はできるものの管理のタグが非表示になっています
user2 の場合はそもそもログインがうまくいかずに何もできないと思います
admiral_enable_auth4.png

こんな感じでプロジェクトに対して ACL を設定することができます

おまけ 認証を有効にした場合の API を実行する方法

POST /core/authn/basic に JSON に記載したメールアドレスとパスワードをベーシック認証として送信します
その際に Body に requestType を付与します

  • curl -u 'admin@admiral.local:Password1!' -v -X POST -d'{"requestType":"LOGIN"}' http://localhost:8282/core/authn/basic -H "Content-Type: application/json"

そしてレスポンスに含まれる x-xenon-auth-token を付与して API をコールすることで各種 API をコールすることができるようになります
以下はログインしたユーザでプロジェクトの一覧を取得する方法です

  • curl -v -H "x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NTkxNjg1fQ.xb0X5SLb-pYplnYOXFjdKUscFt4mQT8-E8XXCZcW5Dw" -X GET http://localhost:8282/projects

最後に

VMware Admiral でユーザ認証を使ってみました
平文の JSON ファイルベースの認証なので少し不安な感じはします
またユーザを追加する場合はファイルを更新してコンテナを再起動する必要があるので少し面倒です (コンテナを削除する必要はありませんが、認証なしからありにする場合は削除しないとダメです)
デフォルトでは管理者権限が付与されてしまっているのでユーザの登録や更新をしたら必ず ID 管理から権限のコントロールをするようにしましょう

一応これを使えばプロジェクトベースの ACL 的なことはできるようになります
個人的にはファイル管理も良いですが LDAP 連携など外部のユーザ管理システムと連携してほしいかなと思います
また JSON ファイルで管理者権限の設定もできると嬉しいかなと思います

参考サイト

2018年1月10日水曜日

VMware Admiral v1.3.0 で REST API を使ってみた

概要

VMware Admiral には swagger ベースの API が実装されています
専用の UI でもいろいろと操作できますが API を使うこともできるので試してみました
Admiral のバージョンは最新の v1.3.0 を使っています

環境

  • Ubuntu 16.04.3
  • docker 17.05.0-ce
  • Admiral v1.3.0

Admiral の起動

  • docker run -d -p 8282:8282 --name admiral vmware/admiral

http://localhost:8282/ にアクセスすると Admiral の管理 UI が表示されると思います

Swagger UI でドキュメントを確認する

まずは API のドキュメントを確認しましょう
Admiral にはすでに Swagger UI が組み込まれているので以下の URL にアクセスするだけでドキュメントが表示されます

http://localhost:8282/discovery/swagger/ui/

このドキュメントを元に API をコールしてみます

が実は、、、

Swagger はドキュメントの生成にのみ使われているようで更新も滞っているようです
https://github.com/vmware/admiral/issues/245
Wikiに最新版を作成中とのことなので現状はブラウザのネットワークコンソールを使ってリクエスト情報を確認しながらやるのがベストとのことでした
なので、今回もブラウザを使いながら curl リクエストを作成しています

プロジェクトの一覧を取得する

GET /projects を使って取得します
curl で以下のようにコールしましょう

  • curl -X GET http://localhost:8282/projects
{
  "documentLinks": [
    "/projects/default-project"
  ],
  "documentCount": 1,
  "queryTimeMicros": 1,
  "documentVersion": 0,
  "documentUpdateTimeMicros": 0,
  "documentExpirationTimeMicros": 0,
  "documentOwner": "a2f3cdc3-6d79-48e5-98ba-c88281cecff9"
}

Admiral はデフォルトで default-project というプロジェクトを持っているのでそれが表示されると思います
またデフォルトだと認証がないので REST API を認証なしでコールすることができます

プロジェクトを登録する

新規でプロジェクト作成してみます
POST /projects を使用します

  • curl -X POST http://localhost:8282/projects -H "Content-Type: application/json" -d '{"name":"test"}'

これでプロジェクトの追加ができます
Public のフラグなどは適宜変更してください

{
  "isPublic": false,
  "administratorsUserGroupLinks": [
    "/core/authz/user-groups/9cdba64fae7cbc75562520652cfa0_project-admins"
  ],
  "membersUserGroupLinks": [
    "/core/authz/user-groups/9cdba64fae7cbc75562520652cfa0_project-members"
  ],
  "viewersUserGroupLinks": [
    "/core/authz/user-groups/9cdba64fae7cbc75562520652cfa0_project-viewers"
  ],
  "id": "050ead14-58f7-4d1c-9795-336c604e4168",
  "name": "test3",
  "customProperties": {
    "__projectIndex": "550951311"
  },
  "tenantLinks": [
    "/projects/9cdba64fae7cbc75562520652cfa0"
  ],
  "creationTimeMicros": 1515479316485,
  "documentVersion": 0,
  "documentEpoch": 0,
  "documentKind": "com:vmware:admiral:auth:project:ProjectService:ProjectState",
  "documentSelfLink": "/projects/9cdba64fae7cbc75562520652cfa0",
  "documentUpdateTimeMicros": 1515479316484001,
  "documentUpdateAction": "POST",
  "documentExpirationTimeMicros": 0,
  "documentOwner": "a2f3cdc3-6d79-48e5-98ba-c88281cecff9"
}

プロジェクトを削除する

登録したテスト用のプロジェクトを削除してみましょう
DELETE /projects/{projectId} を使います

  • curl -X DELETE http://localhost:8282/projects/9cdba64fae7cbc755624ef84d4938

が、現状は 503 になり削除できませんでした
おそらくバグだと思います

クラスタを登録してみる

プロジェクト内にクラスタを登録してみましょう
POST /resources/clusters を使います

少し長いですがリクエストは以下の通りです

  • curl -X POST http://localhost:8282/resources/clusters -H "Content-Type: application/json" -H "x-project: /projects/default-project" -d '{"hostState":{"address":"http://192.168.100.11:2376","customProperties":{"__containerHostType":"DOCKER","__adapterDockerType":"API","__clusterName":"cluster001","__clusterDetails":"test","acceptCertificate":"false"}}}'

192.168.100.11 は TCP 2376 を LISTEN にした docker サーバです
(2376 ポートを有効にして docker をリモートから操作できるようにする方法はこちらの記事を参考にしてください)

クラスタ名は cluster001 でプロジェクト default-project にクラスタとホストを追加します
ポイントとしてはプロジェクトは x-project というヘッダで指定します
また body 側ではホストの情報とコンテナホストが docker or vch を指定する必要があります
成功すると以下のレスポンスが返ってきます

{
 "name": "cluster001",
 "type": "DOCKER",
 "status": "ON",
 "clusterCreationTimeMicros": 1515543281334,
 "details": "test",
 "containerCount": 0,
 "systemContainersCount": 0,
 "totalMemory": 0,
 "memoryUsage": 0,
 "nodeLinks": [
   "/resources/compute/9cdba64fae7cbc7556260eaed6c20"
 ],
 "nodes": {
   "/resources/compute/9cdba64fae7cbc7556260eaed6c20": {
     "address": "http://192.168.100.11:2376",
     "powerState": "ON",
     "documentVersion": 1,
     "documentEpoch": 0,
     "documentKind": "com:vmware:photon:controller:model:resources:ComputeService:ComputeState",
     "documentSelfLink": "/resources/compute/9cdba64fae7cbc7556260eaed6c20",
     "documentUpdateTimeMicros": 1515543281381009,
     "documentUpdateAction": "PATCH",
     "documentExpirationTimeMicros": 0,
     "documentOwner": "a2f3cdc3-6d79-48e5-98ba-c88281cecff9"
   }
 },
 "totalCpu": 0,
 "cpuUsage": 0,
 "documentVersion": 0,
 "documentSelfLink": "/resources/clusters/9cdba64fae7cbc7556260eaecfad8",
 "documentUpdateTimeMicros": 0,
 "documentExpirationTimeMicros": 0
}

Admiral の管理画面で確認すると以下のようになっています
admiral_api1.jpg

クラスタを取得する

登録したクラスタ情報を API で取得してみます
GET /resources/clusters を使います

  • curl -X GET -H "x-project: /projects/default-project" http://localhost:8282/resources/clusters

指定のプロジェクト配下にあるクラスタを取得する場合は POST 時と同様にヘッダでプロジェクトを指定します
ヘッダの指定がない場合はすべてのクラスタを取得します
レスポンスは以下のように取得できます

{
 "documentLinks": [
   "/resources/clusters/9cdba64fae7cbc7556260eaecfad8"
 ],
 "documentCount": 1,
 "documentVersion": 0,
 "documentUpdateTimeMicros": 0,
 "documentExpirationTimeMicros": 0
}

更にクラスタの詳細を取得したい場合はクラスタの ID を URI に含めるだけで OK です

  • curl -X GET http://localhost:8282/resources/clusters/9cdba64fae7cbc7556260eaecfad8

クラスタを削除する

登録したクラスタを削除してみましょう
DELETE /resources/cluster/{clusterId} を使います
先ほどのクラスタの詳細を取得するリクエストのメソッドを DELETE に変更するだけです

  • curl -X DELETE http://localhost:8282/resources/clusters/9cdba64fae7cbc7556260eaecfad8

成功時のレスポンスボディはないのでレスポンスステータスで削除できたかどうか確認しましょう

最後に

VMware Admiral の REST API を curl から操作してみました
ドキュメントが整備されていないので UI を元に自分でリクエストを解析する必要がありますが、それほど難しくはないと思います

今回はプロジェクトとクラスタの操作しか紹介しませんでしたが他にもユーザ操作やレジストリ操作、クラスタへのホスト追加などいろいろな操作があるので必要に応じてブラウザとにらめっこしながらやれば同じようにリクエストを生成できると思います

2017年10月11日水曜日

VMware VIC の 1.2.1 を使ってみた

概要

VMware VIC の 1.2.1 GA がリリースされていたので試してみました
そのうち正式版がリリースされると思うのでそれを待っても良かったのですが触ってみました

環境

  • vic-machine v.1.2.1-13858-c3db65f
  • docker 17.03.0-ce
  • Ubuntu 16.04
  • vCenter Server 5.5.0

vic-machine コマンドのインストール

  • wget https://storage.googleapis.com/vic-engine-releases/vic_1.2.1.tar.gz

各種コマンド検証

create

./vic-machine-linux create \
--target 192.168.100.101/dc \
--user "vc-user" \
--password "vc-pass" \
--compute-resource cluster \
--image-store datastore2 \
--bridge-network "dvs-for-vch" \
--public-network "VM Network" \
--no-tlsverify --force

特に追加になってそうなオプションはなさそう
--name を指定しないと「virtual-container-host」という名前で vApp が作成され、その配下に VM が作成されます

delete

./vic-machine-linux delete \
--target 192.168.100.101/dc \
--user "vc-user" \
--password "vc-pass" \
--compute-resource cluster \
--name virtual-container-host \
--thumbprint "37:1D:..."

こちらも特になし
--name オプションを指定しないと「virtual-container-host」を削除しにいきます

ls

./vic-machine-linux ls \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--thumbprint "37:1D:..."

こちらも特になし

inspect

./vic-machine-linux inspect -\
-target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--thumbprint "37:1D:..."

--name の指定が必須ではなくなったようです
指定しない場合は「virtual-container-host」に対して実行します

また今回からか不明なのですが ./vic-machine-linux inspect config というコマンドが追加されており、これを使うと create 時のオプションを確認することができます

debug

./vic-machine-linux debug \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--enable-ssh --rootpw password \
--thumbprint "37:1D:..."

こちらも特になし
--name がない場合は「virtual-container-host」に対して実行します

update

./vic-machine-linux update firewall \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--deny \
--thumbprint "37:1D:..."

こちらも特になし
firewall しか操作できないのとこのコマンドは ESXi に対して実行するコマンドなのでいろいろと変更したほうが良いと思っているんですが変わらないですね、、、、
--deny--allow にすることもできます

upgrade

./vic-machine-linux upgrade \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--name virtual-container-host \
--appliance-iso ./appliance.iso \
--bootstrap-iso ./bootstrap.iso \
--thumbprint "37:1D:..."

今回は 1.1.1 -> 1.2.1 でやってみましたが問題なく行えました
ping を投げ続けてみましたが切断っぽい挙動が 2 回ほどありました

64 bytes from 192.168.200.100: icmp_seq=37 ttl=64 time=0.833 ms
64 bytes from 192.168.200.100: icmp_seq=38 ttl=64 time=17.0 ms
64 bytes from 192.168.200.100: icmp_seq=39 ttl=64 time=0.223 ms
64 bytes from 192.168.200.100: icmp_seq=40 ttl=64 time=0.301 ms
64 bytes from 192.168.200.100: icmp_seq=41 ttl=64 time=0.296 ms
64 bytes from 192.168.200.100: icmp_seq=42 ttl=64 time=0.318 ms
64 bytes from 192.168.200.100: icmp_seq=43 ttl=64 time=0.331 ms
64 bytes from 192.168.200.100: icmp_seq=44 ttl=64 time=8.29 ms
64 bytes from 192.168.200.100: icmp_seq=45 ttl=64 time=0.251 ms

今回は検証していませんが 0.8 や 0.9 から 1.2.1 に upgrade できるのかも気になりました

configure

おそらく新規で追加になったコマンドです
これで作成後の VCH に対していろいろと変更を入れられるようになりました

./vic-machine-linux configure \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--ops-user administrator@vsphere.local \
--ops-password adminpass \
--thumbprint "37:1D:..."

ops-user と ops-password を変更します
このユーザとパスワードを使って VCH から vCenter に対して API を発行してコンテナ VM を作成します

./vic-machine-linux configure \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--volume-store datastore2/directory:label \
--thumbprint "37:1D:..."

volume-store を追加します
ここで指定したvolume-store 上に docker volume で作成したデータが作成されます

./vic-machine-linux configure \
--target "192.168.100.101/dc" \
--user "vc-user" \
--password "vc-pass" \
--compute-resource "cluster" \
--dns-server 8.8.8.8 \
--thumbprint "37:1D:..."

VCH 上に DNS サーバを変更します
デフォルトだと public-network 上にある DHCP から教えてもらえる DNS が設定されています
それ以外にしたい場合は dns-server オプションで変更できます

他にも

  • 証明書の更新
  • レジストリの設定を変更
  • コンテナ専用ネットワークの変更
  • VCH から外に出るときのプロキシの設定
  • ログレベルの変更
  • メモリとCPU のアロケートサイズの変更

などができたりします
詳しくは configure --help してみると良いと思います

その他

  • version
  • help

docker コマンド検証

一番の特徴は exec が使えるようになっている点です

  • docker -H 192.168.200.100:2375 exec -it 7f4398f4c2d9 /bin/bash

それ以外のコマンドに関してはこれまで通り使えます
docker-compose も対応しています

  • docker-compose -H 192.168.200.100:2375 up -d

当然ですが、イメージは Docker hub で公開していなければありません (registry の設定を VCH にしていれば別)

ただ、swarm コマンドに現在もサポートされていません
おそらく今後のバージョンでも swarm はサポートされないと思います

最後に

VIC の 1.2.1 を試してみました
基本的なことしか試していないのですべてのエンハンス内容を網羅しているわけではありませんのでご注意を

それでも exec が使えるようになっていたり作成後の VCH に対して変更を加えられている点は嬉しいエンハンスかなと思います

個人的には vic-machine-linux コマンドの方法で VCH の操作ができるようになると嬉しいなと思いました (API)

参考サイト

2017年5月23日火曜日

VMware VIC 1.1.1 を触ってみたのでメモ

概要

知らぬ間に MyVMware からダウンロードできる VMware Integrated Container が 1.1.1 までバージョンアップしていたので検証してみました
1.1.1 から提供方式も ova になっているようです

環境

  • CentOS 7.3.1611
  • docker 17.05
  • VMware VIC 1.1.1

VIC 1.1.1 のダウンロード

以下の URL からダウンロードできます
https://my.vmware.com/group/vmware/details?downloadGroup=VIC110&productId=648&rPId=15925

自身のアカウントで MyVMware にログイン後ダウンロードしてください
vSphere Integrated Containers 1.1.1 OVA のサイズは 2.69GB あります

ova のデプロイ

基本的な方法はこちらを参照してください

デプロイ時に必要となるディスク際は 70 GB + 4.7 GB になります
ネットワークはデフォルトだと 1 つのみ設定できます
VIC の ova をデプロイする際に必須となるパラメータは以下の通りです

  • VM (Photon) に ssh ログインする際の root ユーザのパスワード
  • registry の admin ユーザのパスワード
  • MySQL の root ユーザのパスワード

デプロイ後の挙動の確認

ova デプロイが完了したら電源を ON にして VM を起動しましょう
設定したネットワークの IP が取得できれば起動完了です

管理画面が 2 つあり

Admiral 側は特にログイン用の ID/PW はありません
Harbor 側は ova デプロイ時に設定した registry の admin ユーザのパスワードでログインできます

また、VM は Photon OS で動作しています
SSH でログインできるのでログインしてみましょう
docker コマンドが使えるのでコンテナの一覧を確認すると以下が動作しています

  • docker ps
ONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                                  NAMES
6405166b4027        vmware/notary-photon:server-0.5.0         "/usr/bin/env sh -..."   55 minutes ago      Up 55 minutes                                                              notary-server
7414d1b3852b        vmware/nginx:1.11.5-patched               "nginx -g 'daemon ..."   55 minutes ago      Up 55 minutes       0.0.0.0:443->443/tcp, 80/tcp, 0.0.0.0:4443->4443/tcp   nginx
e6ae3a5f914a        vmware/harbor-jobservice:v1.1.1           "/harbor/harbor_jo..."   55 minutes ago      Up 55 minutes                                                              harbor-jobservice
b6e384167707        vmware/notary-photon:signer-0.5.0         "/usr/bin/env sh -..."   55 minutes ago      Up 55 minutes                                                              notary-signer
5b8ac98ebfab        vmware/harbor-ui:v1.1.1                   "/harbor/harbor_ui"      55 minutes ago      Up 55 minutes                                                              harbor-ui
647d830a9f49        vmware/registry:photon-2.6.0              "/entrypoint.sh se..."   55 minutes ago      Up 55 minutes       5000/tcp                                               registry
4dd9ef6abaed        vmware/harbor-db:v1.1.1                   "docker-entrypoint..."   55 minutes ago      Up 55 minutes       3306/tcp                                               harbor-db
904b46e34f20        vmware/harbor-adminserver:v1.1.1          "/harbor/harbor_ad..."   55 minutes ago      Up 55 minutes                                                              harbor-adminserver
f21e09a82015        vmware/harbor-notary-db:mariadb-10.1.10   "/docker-entrypoin..."   55 minutes ago      Up 55 minutes       3306/tcp                                               notary-db
07fa6ffcf209        vmware/harbor-log:v1.1.1                  "/bin/sh -c 'crond..."   55 minutes ago      Up 55 minutes       127.0.0.1:1514->514/tcp                                harbor-log
6ffc63081e6a        vmware/admiral:ova                        "/entrypoint.sh"         55 minutes ago      Up 55 minutes       0.0.0.0:8282->8282/tcp                                 vic-admiral

Admiral と Harbor 用のコンテナが起動しています

また network が全部で 7 つ作成されています

  • docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
816285492ff8        bridge                 bridge              local
4b1b23d24347        harbor_harbor          bridge              local
848a011f52ff        harbor_harbor-notary   bridge              local
b9a1717bb5e2        harbor_notary-mdb      bridge              local
091f255fbb90        harbor_notary-sig      bridge              local
832437bb1e05        host                   host                local
3f9ca92ef166        none                   null                local

どのコンテナがどのネットワークに属しているかは

  • docker network inspect harbor_harbor

とかで確認できます

registry を使ってみる

registry 機能には UI とコンテナレジストリの機能があります
UI はブラウザで 443 ポートにアクセスすれば OK です
IP ベースでレジストリを使用する際には先に証明書の配置が必要なので後述の手順を先に実施しておいてください

  • docker pull nginx
  • docker tag nginx 192.168.100.202/library/alpine
  • docker login
  • docker push nginx 192.168.100.202/library/alpine

docker login 時の ID/PW は管理 UI にログインしたものと同じになります
管理 UI で確認するとイメージが push されているのが確認できると思います

registry 用の証明書の配置

一点注意点としてデフォルトだと https でデプロイされてしまいます
証明書がちゃんと設定されていないレジストリにアクセスすることはできないので、自己証明書をダウンロードして dockerd の所定のパスに配置する必要があります
自己証明書をダウンロードするには管理画面にアクセスしてログインします
そして右上の Admin -> Download Root Cert から ca.crt を取得します

取得したら docker コマンドを実行ホストに配置します

  • mkdir -p /etc/docker/certs.d/192.168.100.202
  • cp ca.crt /etc/docker/certs.d/192.168.100.202

Admiral を使ってみる

Admiral はコンテナホストマシンのクラスタリングを実現するための機能です
管理 UI が提供されているので https://192.168.100.202:8282/ にアクセスします

Admiral は過去に試した使い方とほぼ同じです
VCH を作成したあとに Admiral に登録すると docker swarm のように VCH をクラスタリングすることができます

VCH に関して

これはどうやら従来通りコマンドを使って作成するようです
実は、今回デプロイした ova の中には含まれていて以下のリンクからダウンロードすることができます

すると申し訳ない程度のダウンロードページに遷移し、そこから vic_1.1.1.tar.gz というファイルをダウンロードすることができます
展開すると vic-machine-linux が含まれていました
しかもダウンロードページはコンテナで動作しておらず PhotonOS VM のローカルで 9443 が LISTEN しておりそこからダウンロードできるようになっていました

何か VCH だけ除け者扱いされている感がありますが、一応バイナリをダウンロードすることはできるようです

最後に

VMware VIC 1.1.1 では Harbor と Admiral が同じ ova となって配布されていました
VCH は従来通り vic-machine を使って作成する形式となっており、まだ管理 UI から VCH を作成することはできないようです
一応バイナリは ova に含まれているのでダウンロードをできることは確認しました

触ってみた感じコンテナ技術に必要なコンポーネント (コンテナホスト、レジストリ、クラスタリングツール) が 1 つになって提供されている感じでした
VMware vSphere 環境がある方は ova を 1 つデプロイするだけですぐにコンテナ環境が構築できるので便利かなと思いました

今後は VCH の作成も UI からできるようになるかもしれません

参考サイト

2017年4月27日木曜日

vic-machine inspect で取得できる vch のエンドポイントの情報をコードから取得してみた

概要

前回 ls コマンドをコードから実行しました
今回は ls の追加として inspect を実装します
inspect は docker のエンドポイントを取得するためのコマンドです
ls で取得した vch を for ループで回して各 vch のエンドポイントを取得してみます

環境

  • Ubuntu 16.04
  • golang 1.8.1
  • vic 0.9.0

inspect のように vch からエンドポイントを取得するコード

  • vim my_vic_ls.go
github.com/docker/docker/opts

上記を import に追加します

for _, vch := range vchs {
        c, err := executor.GetVCHConfig(vch)
        if err != nil {
                return err
        }
        cip := c.ExecutorConfig.Networks["client"].Assigned.IP
        fmt.Println(cip)
        pip := c.ExecutorConfig.Networks["public"].Assigned.IP
        fmt.Println(pip)
        if !c.HostCertificate.IsNil() {
                fmt.Println(opts.DefaultTLSHTTPPort)
        } else {
                fmt.Println(opts.DefaultHTTPPort)
        }
        if c.IsCreating() {
                fmt.Println("ng")
        } else {
                fmt.Println("ok")
        }
}

これを Run メソッドの executor.SearchVCHs の後に追加すれば OK です
vch の config 情報を executor.GetVCHConfig で取得できるのでその config に対して c.ExecutorConfig.Networks["client"].Assigned.IP でエンドポイントを取得します
Networks はスライスになっているのでネットワーク名を指定することで必要な IP アドレスを取得できます
普通は client or public が docker のエンドポイント用の IP アドレスになっているのでどちらかを取得すれば OK かなと思います

また、c.HostCertificate を判定することで vch のエンドポイントが ssl 用のポートかそうでないかを表示してあげます

vch が作成できたかどうかは IsCreating というメソッドがあるのでこれで判定します

最後に

inspect で取得できるエンドポイントの情報をコードから取得してみました
ls のコードに追加するだけで inspect の情報も取得できるようにしました

参考サイト

2017年4月26日水曜日

vic-machine delete コマンドをコードからライブラリとして使う方法

概要

前回 vic-machine ls コマンドをコードから実行してみました
今回は vic-machine delete コマンドをコードから実行してみました

環境

  • Ubuntu 16.04
  • golang 1.8.1
  • vic 0.9.0

delete を実行するコードの作成

  • mkdir /path/to/work
  • cd /path/to/work
  • vim my_vic_delete.go
package main

import (
        "context"
        "fmt"
        "github.com/vmware/vic/lib/install/data"
        "github.com/vmware/vic/lib/install/management"
        "github.com/vmware/vic/lib/install/validate"
        "github.com/vmware/vic/pkg/vsphere/vm"
        "net/url"
)

type Delete struct {
        Data     *data.Data
        executor *management.Dispatcher
}

func NewDelete() (d *Delete, err error) {
        d = new(Delete)
        d.Data = data.NewData()
        u, err := url.Parse("https://192.168.100.101/dc")
        if err != nil {
                return d, err
        }
        d.Data.Target.URL = u
        l.Data.Target.User = "vcenter_username"
        p := "vcenter_password"
        d.Data.Target.Password = &p
        l.Data.Target.Thumbprint = "F9:xx:xx:..."
        d.Data.Force = true
        err = d.Data.Target.HasCredentials()
        if err != nil {
                return d, err
        }
        //d.Data.ID = "vm-100"
        d.Data.DisplayName = "vch001"
        d.Data.ComputeResourcePath = "rp-1"
        //d.Data.Force = true
        return d, nil
}

func (d *Delete) Run() (err error) {
        ctx, cancel := context.WithTimeout(context.Background(), d.Data.Timeout)
        defer cancel()
        validator, err := validate.NewValidator(ctx, d.Data)
        if err != nil {
                return err
        }
        validator.AllowEmptyDC()
        executor := management.NewDispatcher(validator.Context, validator.Session, nil, false)
        var vch *vm.VirtualMachine
        if d.Data.ID != "" {
                vch, err = executor.NewVCHFromID(d.Data.ID)
        } else {
                vch, err = executor.NewVCHFromComputePath(d.Data.ComputeResourcePath, d.Data.DisplayName, validator)
        }
        fmt.Println(vch)
        vchConfig, err := executor.GetVCHConfig(vch)
        if err != nil {
                return err
        }
        err = executor.DeleteVCH(vchConfig)
        if err != nil {
                executor.CollectDiagnosticLogs()
                return err
        }
        return nil
}

func main() {
        d, err := NewDelete()
        if err != nil {
                fmt.Println(err)
        }
        err = d.Run()
        if err != nil {
                fmt.Println(err)
        }
}
  • go fmt my_vic_delete.go
  • go run my_vic_delete.go

d.Data.ID で ID を指定するか d.Data.DisplayNamed.Data.ComputeResourcePath を vch までの名前とパスを使って指定します
どちらでも OK ですが個人的にはパスで指定する方法をオススメします
パスがわかっていれば govmomi を使って直接 VM に対しても操作できるからです

Force が true になっている場合は vch 上のコンテナが起動中でも強制的に削除してくれます

解説

config して実行の流れは前回と同じです
delete のときのほうが指定するパラメータが増えているので注意してください
ID や DisplayName は ls を実行したときに取得できます

まず executor.NewVCHFromID で vch の情報を取得します
そして、それを元に executor.DeleteVCH をコールすることで vch を削除してくれる他、付属のネットワークとストレージも削除してくれます

executor.CollectDiagnosticLogs で CLI 用のデバッグログを出力してくれます

最後に

vic-machine delete コマンドをコードから実行してみました
delete も結構簡単にできました
あとは inspect あたりができるなるといいかなという感じです

参考サイト