皆さんこんにちは!FIXERの千賀です。今日は誰でも簡単に始められる、AzureのAKS(Azure Kubernetes Service)を使って30分でKubernetes環境を構築してしまう方法を解説します。慣れればものの10分程度で、Kubernetesの環境を構築して運用を始めてしまえるようになります。
はじめに
Kubenetes(k8s)は非常に便利なソリューションです。これを使い始めるともうオンプレどころか下手なPaaSには戻れなくなります。それくらい便利で運用が楽になる仕組みが実現されています。
k8sでは、ノードと呼ばれるサーバーを配置して、その上でPodという形でコンテナを動かします。そして各Podの死活監視やオートスケールを自律的にしてくれる上に、各ノードへのPodの最適配置を自動で判断してくれます。
特定のノードに偏って配置されたりしません。(意図的に特定のノードに偏って配置したい場合には、そのように実現することもできます。)
例えば、上図のように3台のノードで運用していて、あるアプリのPodを5つ起動しておきたいとします。すると、k8sは自動で判断してノード1〜3にそれぞれPodのレプリカを配置します。今までだったら、どのノードにどのPodを配置するか、必要なリソースや現在のリソースの空き具合などをインフラエンジニアが見て、職人芸で配置していたと思います。それがまるでAIのように、自動で行われます。素晴らしい!
YAMLを記述したりコンテナを作成したりと、これまでのインフラやシステムとはやり方が随分違っているため、なかなか手を出せずにいる方も多いのではないかと思いますが、実はとても簡単に使えるシステムなので、ここで一度試して、ぜひ使えるようになってしまいましょう!
想定読者:インフラを多少なりとも触ったことがある人で、WindowsやLinuxでコマンドライン操作をしたことがあるような方々です。
AKSというAzureのサービスを使って構築しますので、Azureのアカウントを持っていない方は、無料のトライアル枠でもOKですので、Azureのアカウントを作成し、ここで解説する内容を実際に試してみていただければと思います。
【準備】
作業を始める前に、以下のものを準備・セットアップしておきましょう。
- Azureアカウント
- kubectl CLI コマンド(インストールはこちらから)
- Azure CLI コマンド(インストールはこちらから)
- Azure上の仮想ネットワーク(vNet)⇒ AWSのVPCのようなものです。k8sのノード(VM、サーバー)を配置する先になりますので、どんなものでもOKですが、作ったことがない場合にはAzureポータルで予め作成しておいてください。
- ACR(Azure Container Registry) ⇒ アプリなどをコンテナ化し、格納することができるAzureのサービスです。今回の解説では、k8sが動かすPodのコンテナを、ACRから取得します。こちらもvNet同様、Azureポータルから予め作成しておいてください。(ACRを利用しない場合にはDocker HubなどでもOKです。)
macOSだと上記の2.と3.はHomebrewでインストールできます。便利ですね。$ brew update
$ brew install kubernetes-cli
$ brew install azure-cli
あとはコマンドをインストールしたパソコンやMacでセコセコとコマンドを打っていくだけです!
Azureにログインして対象サブスクリプションを選択
パソコンでコマンドプロンプトやPowershell、コンソールなどを開き、下記のコマンドを打ってAzureにログイン、k8sを配置したいAzureのサブスクリプションを指定します。サブスクリプションは、WebでAzureポータルの左メニューから「サブスクリプション」を選んでいただいて、k8sを配置したいお好きなサブスクリプションの名前もしくはIDをコピー&ペーストしてください。
$ az login
$ az account set --subscription "サブスクリプション名"
見た目は何も変わりませんが、これで、Azureにログインしてサブスクリプションが選択された状態になっています。
サービスプリンシパルの作成
Azure環境の管理用のアカウント(=サービスプリンシパル)を作成します。この「サービスプリンシパルと」いうのは、Azureの裏側で利用されるものなので皆さんが普段直接利用するものではありません。AKSでは、ノードを作成したりvNet(仮想ネットワーク)を操作するために利用されます。
$ az ad sp create-for-rbac --skip-assignment
上記のコマンドを打つと↓のようなアウトプットが出ます。その中の「appID」がユーザーIDのようなもので「password」と組み合わせて利用されます。この2つを後で使いますので、控えておいてください。
{
"appId": "****-****-****-****-****",
"displayName": "azure-cli-2019-**-**-**-**-**",
"name": "http://azure-cli-2019-**-**-**-**-**",
"password": "****-****-****-****-****",
"tenant": "****-****-****-****-****"
}
作成したサービスプリンシパルへの権限の追加
サービスプリンシパルに、vNetを操作する(サーバーノードをvNetに追加する)権限と、ACR(Azure Container Registory)にアクセスしてコンテナを取得する権限とを付与していきます。引数に渡す内容が少しだけわかりづらいですが、難しくはありませんので、ぜひ頑張りましょう!
vNetを操作する(サーバーノードをvNetに追加する)権限$ az network vnet show ¥
--resource-group ***(a)*** ¥
--name ***(b)*** ¥
--query id -o tsv
(a)は仮想ネットワーク(vNet)のリソースグループ名、(b)はそのvNetの名前です。どちらもAzure管理ポータルで表示・確認できます。このコマンドで、vNetのIDを取得することができます。
$ az role assignment create ¥
--assignee ***(1)*** ¥
--scope /subscriptions/***(2)***/resourceGroups/***(a)***/providers/Microsoft.Network/virtualNetworks/***(b)*** ¥
--role Contributor
ここで指定する --scope で指定するのが、たったいま打ったコマンドで取得できる、vNetのIDです。(a)(b)は上のものと同じもの、(1)にはサービスプリンシパルを作成したときの「appID」、(2)にはログインするときに使ったサブスクリプションのID(ここは名前ではない!)をセットしてください。
ACR(Azure Container Registry)からコンテナを取得する権限次に、Podとして動かすコンテナが格納されているACRに対して、読み取り権限を設定します。こうすることで、k8sが自分でコンテナを取得し、Podを動かし始めることができるようになります。
こちらも、先ほどと同じようにコマンドでACRのリソースIDを取得することができます。
$ az acr show ¥
--subscription ***(2)*** ¥
--name ***(i)*** --query id -o tsv
(2)はサブスクリプションのIDあるいはサブスクリプション名です。ログインしているサブスクリプションと同じサブスクリプションでACRを利用している場合には、ログイン時と同じものを、もし別のサブスクリプションでACRを作成・利用している場合には、そちらのサブスクリプション名を指定します。
(i)には、ACRの名前をセットします。ACRの名前も、Azure管理ポータルで表示・確認することができます。
$ az role assignment create ¥
--assignee ***(1)*** ¥
--scope /subscriptions/***(2)***/resourceGroups/***(a')***/providers/Microsoft.ContainerRegistry/registries/***(i)*** ¥
--role acrpull
(1)はサービスプリンシパルのappID、(2)にはACRのあるサブスクリプションのID、(a')はACRのリソースグループ名(vNetと同じリソースグループにしている場合はvNetと同じもの、そうでない場合は別の名前になります)、(i)はACRのをセットします。
サービスプリンシパルに対する権限の付与作業は以上で完了です!
AKS(Azure Kubernetes Service)の構築
ではいよいよ、AKSを作成します!
まずk8sを配置するvNetの中のサブネットを決め、そのIDを取得します。
$ az network vnet subnet list ¥
--resource-group ***(a)*** ¥
--vnet-name ***(b)*** ¥
--query [].id --output tsv
(a)はvNetのリソースグループ名、(b)はvNetの名前です。
このコマンドを実行すると、vNetの中に作成されているサブネットのリストが表示されますので、k8s(AKSクラスタ)を配置するサブネットを決めて、そのIDを控えておきましょう。そのIDを指定して、AKSを構築します。
次に、AKSを構築するためのリソースグループを作成します。もし新しく作るのではなく、vNetやACRと同じリソースグループで管理したい場合には、それらを使っても大丈夫です。
$ az group create ¥
--name "任意のリソースグループ名" ¥
--location "
japaneast
”
ここで指定して作成されたリソースグループに所属する形で、AKSを作成(k8sを配置)します。location にはご自分の好きなリージョンを指定してください。例では東日本を指定しています。
AKSクラスタの作成(k8sの配置)それでは準備が整いましたので、AKSを作成(k8sを配置)するコマンドを実行しましょう!
$ az aks create
--resource-group
"上で作成・決定したリソースグループ名"
--name
"任意のAKSクラスタ名"
--location
japaneast
--node-count
1
--kubernetes-version
1.14.0
--service-principal "サービスプリンシパルのappID"
--client-secret "サービスプリンシパルのpassword"
--generate-ssh-keys
--windows-admin-password "任意のWindowsノード用パスワード"
--windows-admin-username
"任意のWindowsノード用管理者ID"
--network-plugin azure
--vnet-subnet-id "控えておいたサブネットのリソースID"
--location にはAKSを作成したい好きなリージョン(この例では東日本)を、 --node-count はAKS作成時のノードの数(Podを動かすサーバーVMの台数)、 --kubernetes-version は利用したいk8sのバージョン(この例では投稿時点でプレビューの最新版)を指定します。なお「任意の」と書いた部分には、トラブルを避けるために日本語は使わないようにしてください。
このコマンドを打つとAKSの作成が始まります。数分〜10分程度かかりますので、そのまましばし待ちましょう。
これでAKSの作成は完了です!サブスクリプション名やリソースグループ名、*** IDなどを確認して控えておく作業が億劫ですが、でも面倒な作業はそれだけです。できあがったAKS環境にさっそくPodを配置して、動かしてみましょう!
次回、作成したAKSクラスタ(k8s)にPod(コンテナ)を上げて動かす方法を解説します。お楽しみに!