ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Container Service で Kubernetes を試してみた

先週、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 を選択し、リソースグループやロケーションを指定します。

f:id:TonyTonyKun:20170227025056p:plain

DNS Name prefix には任意の名前を指定し、SSH で接続するユーザー名と公開キーを入力します。サービス プリンシパルの "clinet ID" には "appId"、"client secret" には "password" を入力します。

f:id:TonyTonyKun:20170227030435p:plain

Agent の数や仮想マシンのサイズは、初期値のまま進めます。Operating System では、プレビューで対応している Windows Server Container を選択することも可能ですが、今回は Linux を選択します。

f:id:TonyTonyKun:20170227030257p:plain

最後に、ここまでの設定内容を確認して、作成を開始します。

f:id:TonyTonyKun:20170227030500p:plain

数分待つと作成が完了し、リソースグループ内に作成された一覧が表示されます。仮想マシンや仮想ネットワークを利用して、Azure Container Service のクラスターが構築されたことを確認できます。

f:id:TonyTonyKun:20170227033410p:plain

Deployments の "2 Succeeded" のリンクをクリックすると、デプロイされた構成情報を確認できます。SSH 接続するための情報は、SSHMASTER0 から取得できます。

f:id:TonyTonyKun:20170227033433p:plain

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 の画面が表示されます。

f:id:TonyTonyKun:20170227031516p:plain

まとめ

Azure Container Service の Kubernetes について、今回の内容を整理します。

f:id:TonyTonyKun:20170321001631p:plain

kubernetes には、複数のコンテナをまとめて管理する Pod があり、外部公開するためのロードバランサーの役割を Service が担います。kubectl コマンドを使うことで、kubernetes を操作できます。
Azure Container Service は、Azure の仮想マシンや仮想ネットワークなどをテンプレート化した環境に kubernetes を配置してくれるので、インフラの構築など面倒なことを考えずに、すぐに kubernetes を使い始めることができます。
今回は初歩的な内容を紹介しましたが、次回以降はもう少し詳しく見ていきたいと思います。
gooner.hateblo.jp