先週、Azure Container Service の Kubernetes 対応が GA したので、試してみました。
azure.microsoft.com
Azure Container Service は、Docker コンテナ上で動かすアプリケーションをホストできるサービスです。コンテナ オーケストレーションである Docker Swarm、DC/OS、Kubernetes を選択でき、コンテナ環境を簡単に構築できます。Azure の仮想マシンや仮想ネットワークなどのインフラストラクチャーの上に、オープンソースのコンテナ オーケストレーションが展開されます。
Kubernetes は、Google が公開しているオープンソースのコンテナ オーケストレーションの1つです。Docker だけでもコンテナーの作成してイメージを展開できますが、複数のコンテナを管理するにはオーケストレーションがあると便利です。
事前準備
Kubernetes を選択した場合のみ、 Azure Active Directory のサービス プリンシパルが必要となります。サービス プリンシパルの作成方法にはいくつかありますが、今回は Docker コンテナで Azure CLI 2.0 を使います。Docker for Mac や Docker for Windows をインストールした環境で、次のコマンドを実行します。
$ docker run -it azuresdk/azure-cli-python:latest bash
Azure にログインします。
$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code GZGP8E89A to authenticate.
メッセージに表示されているURLにブラウザでアクセスしてコードを入力し、Azure アカウントでログインします。
次のコマンドの "mySubscriptionID" に Azure のサブスクリプションIDをセットして実行すると、サービス プリンシパルを作成できます。
$ az account set --subscription "mySubscriptionID" $ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/mySubscriptionID" { "appId": "e8bbb9a0-xxxx-xxxx-xxxx-8eb054fc5ef2", "displayName": "azure-cli-2017-02-26-15-18-01", "name": "http://azure-cli-2017-02-26-15-18-01", "password": "378022a9-xxxx-xxxx-xxxx-127bb49cb1eb", "tenant": "2f2404eb-xxxx-xxxx-xxxx-6454b99e51a5" }
"appId" と "password" を使いますので、メモしておきます。"password" は、このタイミングでしか取得できません。
Azure Container Service を作成する
Azure ポータルから、New - Compute - Azure Container Service を選択します。Orchestrator で Kubernetes を選択し、リソースグループやロケーションを指定します。
DNS Name prefix には任意の名前を指定し、SSH で接続するユーザー名と公開キーを入力します。サービス プリンシパルの "clinet ID" には "appId"、"client secret" には "password" を入力します。
Agent の数や仮想マシンのサイズは、初期値のまま進めます。Operating System では、プレビューで対応している Windows Server Container を選択することも可能ですが、今回は Linux を選択します。
最後に、ここまでの設定内容を確認して、作成を開始します。
数分待つと作成が完了し、リソースグループ内に作成された一覧が表示されます。仮想マシンや仮想ネットワークを利用して、Azure Container Service のクラスターが構築されたことを確認できます。
Deployments の "2 Succeeded" のリンクをクリックすると、デプロイされた構成情報を確認できます。SSH 接続するための情報は、SSHMASTER0 から取得できます。
Azure Container Service に接続する
Azure Container Service に SSH 接続します。
$ ssh thara@gooer0227mgmt.eastus.cloudapp.azure.com -A
Kubernetes のコマンド ライン クライアントである kubectl を使って、構成を確認してみます。
バージョンを確認すると、Ver.1.5 がデプロイされていることがわかります。
$ kubectl version Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:34:56Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
次に、ノードを確認すると、マスターとエージェントの2つの仮想マシンが構成されていることがわかります。
$ kubectl get nodes NAME STATUS AGE k8s-agent-d8d36729-0 Ready 38m k8s-master-d8d36729-0 Ready,SchedulingDisabled 38m
nginx をデプロイする
コンテナ上で動かすアプリケーションを手っ取り早く確認したいので nginx をデプロイしてみます。
$ kubectl run nginx --image nginx deployment "nginx" created
nginx の Docker コンテナが Pod で起動していることを確認します。Pod は、複数のコンテナをまとめて管理できます。Pod 内のコンテナは同じホストにデプロイされるため、複数のコンテナでストレージなどを共有できます。現在の環境は、1つの Pod に1つの nginx コンテナが実行されています。
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-701339712-l7804 1/1 Running 0 3m
nginx の Docker コンテナを外部に80番ポートで公開します。Pod にはプライベートな IP アドレスが割り当てられているので、Service として外部に公開する必要があります。Service には、ロードバランサー的な役割もあります。
$ kubectl expose deployments nginx --port=80 --type=LoadBalancer service "nginx" exposed
Azure のロードバランサーにルールを追加したりしてるので、設定が反映するまでに少し時間がかかります。
$ kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.0.0.1 <none> 443/TCP 1h nginx 10.0.211.143 <pending> 80:30445/TCP 42s
少し待つと、パブリックIPアドレスが割り当てられます。
$ kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.0.0.1 <none> 443/TCP 1h nginx 10.0.211.143 13.92.95.76 80:30445/TCP 8m
ブラウザでパブリックIPアドレスにアクセスすると、nginx の画面が表示されます。
まとめ
Azure Container Service の Kubernetes について、今回の内容を整理します。
kubernetes には、複数のコンテナをまとめて管理する Pod があり、外部公開するためのロードバランサーの役割を Service が担います。kubectl コマンドを使うことで、kubernetes を操作できます。
Azure Container Service は、Azure の仮想マシンや仮想ネットワークなどをテンプレート化した環境に kubernetes を配置してくれるので、インフラの構築など面倒なことを考えずに、すぐに kubernetes を使い始めることができます。
今回は初歩的な内容を紹介しましたが、次回以降はもう少し詳しく見ていきたいと思います。
gooner.hateblo.jp