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

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月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年4月21日金曜日

VMware Admiral を使ってみた

概要

Admiral は VMware が提供する PhotonOS をクラスタリングするツールです
Docker Swarm のような機能を提供します
今回は VMware Integrated Container (VIC) と Admiral を組み合わせて使ってみました

環境

  • Ubuntu 16.04
    • docker 17.03
    • VMware Admiral 0.9.2
  • VMware Integrated Container 0.9.0

Admiral のインストール

Admiral は Dockerhub でイメージが公開されているのでそれを使います
Ubuntu 上の普通にインストールした docker 上で動作させています

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

で起動できます
起動できたらブラウザで 8282 ポートにアクセスしてみましょう
Admiral の管理画面が表示されると思います
Admiral ではこの管理画面を使ってクラスタを管理します

VCH の作成

Virtual Container Host (VCH) を作成します
VCH は VIC が提供するコンテナホストの名称です
VCH の作成方法は過去に詳しく紹介しています

とりあえず今回は 2 台作成します
また作成後 VCH に SSH でログインできる必要があるので debug コマンドで SSH でのログインを有効にしておきましょう

  • 作成
./cli/vic-machine-linux create \
--target 192.168.100.101/dc \
--user vcenter-username \
--password vcenter-password \
--name ah001 \
--volume-store datastore01/data_volume:default \
--image-store datastore01 \
--compute-resource cluster01 \
--bridge-network vic-bridge-01 \
--public-network vm-net \
--thumbprint F9:... \
--no-tls --no-tlsverify --force
  • ログイン有効化
./vic-machine-linux debug \
--target 192.168.100.101/dc \
--user vcenter-username \
--password vcenter-password \
--name ah001 \
--compute-resource cluster01 \
--thumbprint F9:... \
--enable-ssh --rootpw "rootpassword123"

ネットワークやストレージ、クラスタなどは環境に合わせて名称を変更してください
同様に ah002 も作成しましょう

Admiral へ VCH を追加する

トップ画面から「Add Host」で VCH を追加していきます

admiral1.png

admiral2.png

  • Address・・・作成した VCH のエンドポイント
  • Placement zone・・・ゾーン、とりあえず「default-placement-zone」を選択
  • Login credential・・・ログイン情報 (New Credential から追加します、先程 debug コマンドで設定した rootpw を設定します、ユーザは root になります)
  • Tags・・・タグ (追加するホストにタグを付けられます、とりあえず「ah」とします)

入力できたら Verify し問題なければ Add を選択しホストを追加します

追加できると以下のように Hosts の一覧に表示されます
admiral3.png

同様に 2 台目も追加しましょう
この 2 台は同一クラスタ上に属するコンテナホストとして admiral では管理されます

コンテナを作成する

では Admiral 上にコンテナを作成してみましょう
左メニューの Resources から「Create Container」を選択します

Basic タグの Image で Dockerhub にあるイメージを選択することができます
Name では好きなコンテナ名を入力します
admiral4.png

Network タグの PortBindinds の Host Port にホストでバインドするポートを入力します
Container Port にはコンテナが EXPOSE するポートを入力します
admiral5.png

今回は nginx のイメージを使ってコンテナを立ち上げるのでそれにあった情報を入力しています

設定できたら「Provision」を選択しコンテナを立ち上げます

左メニューの Resources -> Containers にコンテナが表示されると思います
同様にもう一つコンテナを作成してみましょう
先ほどと同様に nginx のイメージを選択し、Host Port も同じもの (8080) を設定してみてください

1 台構成であれば同じホストポートが使われるとエラーとなりますが、クラスタには 2 台の VCH があるのでエラーとならずコンテナが 2 台起動します
admiral6.png

当然ですが、3 台目のコンテナを 8080 で起動しようとすると 8080 が開いている VCH がないのでエラーとなります

その他

基本的な機能は以上です
コンテナを作成しすぎてリソースが足りなくなったら新たに VCH を作成して追加すれば OK です
その他ちょろっと触ってみた感想です

  • コンテナの詳細画面で docker logs が見れる
  • Placement (クラスタ) はコンテナを作成する優先度は設定することができるが Placement を指定してコンテナ作成をすることはできなさそう
  • LB 的なやつはない
  • レジストリ連携できる (Templates -> Manage Registry から追加できる)
  • Network 機能を使えばホスト間で横断的に通信できるオーバレイネットワークを組めそう

最後に

Admiral + VCH で docker swarm 的なことを試してみました
UI からの操作ですがかなり直感的に使えました

VMware 環境で VCH でコンテナ管理をしている場合には Admiral を使えば少し幸せになれるかもしれません

参考サイト