しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

AKS を使って Windows Containers 対応の Kubernetes クラスターを作成する

既にいろんな人が AKS を触っているみたいですが、個人的には Windows や ACI と組み合わせて使いたかったので、まずは Windows 向けクラスターが作成できるのか確認しました。

ACS Engine を使って作成していたクラスターの管理が面倒だったので、これを機に入れ替えます。

クラスターを作成する

サポートされているとは明記されてませんが、公式のドキュメントを見ると osType には Windows を指定できるみたいでしたし、ARM Template が ACS Engine とそっくりだったので試したらうまくいきました。

f:id:shiba-yan:20171114161753p:plain

Windows と Linux で 2 つの Agent Pool が作成されていることが確認できますね。

最初は Windows のみでクラスターを作成してみましたが、ACS とは異なり AKS では Kubernetes Master 自身で Pod を稼働させることは出来ないみたいです。なので、Windows だけでは必要な Pod が動作しないので Kubernetes Dashboard は稼働しません。

正しく Kubernetes クラスターを動作させるには Windows と Linux のノードが必要です。

f:id:shiba-yan:20171114162732p:plain

ARM Template を見ると、複数の Agent Pool を持つことができるのが一目でわかるので、Windows と Linux のハイブリッドなクラスターを用意することが容易です。

ちなみに ARM Template を使うと、ポータルでは対応していない Dv3 / Ev3 な VM を選べます。

Kubernetes Dashboard にアクセスする

AKS の Kubernetes Dashboard にアクセスするには az aks browse コマンドを使いますが、Azure CLI の不具合で Windows だとうまく動作しないので、互換のあるコマンドを使ってアクセスします。

az aks browse も内部的には kubectl を叩いてるだけなので、以下のコマンドで問題ないです。

# kubernetes dashboard の pod 名を取得
kubectl get pods --namespace kube-system --output name --selector k8s-app=kubernetes-dashboard

# dashboard に対してポートフォワーディングを実行
kubectl --namespace kube-system port-forward kubernetes-dashboard-XXXX 8001:9090

ポートフォワーディングのコマンドは、覚えておいても損はないかもしれません。

これで 127.0.0.1:8001 というアドレスで Kubernetes Dashboard へのアクセスが可能となります。

f:id:shiba-yan:20171114162317p:plain

ちゃんと Windows と Linux のノードが表示されていることが確認できます。Kubernetes Master のノードは表示されないようになっているので、Pod の実行も出来ないようになっています。

ASP.NET アプリケーションをデプロイする

クラスターが完成したので、例によって AppVeyor でビルドした ASP.NET アプリケーションのイメージをデプロイしたいところですが、なんと AKS で Windows ノードを作成すると、デフォルトで Version 1709 が使われるみたいです。

まだ扱いにくいので 1709 は使ってこないと思ってましたが、ノードの情報を見て驚きました。

f:id:shiba-yan:20171114163655p:plain

Version 1709 が使われているということは、Windows Server Containers がデフォルトになっている環境では、1709 の Docker Image を利用したコンテナーしか動作しないことを意味します。

まだ CI SaaS は 1709 に対応したものが存在しないので、仕方なく開発環境に Docker for Windows をインストールして、Windows 10 FCU 上で Docker Image を作成しました。

f:id:shiba-yan:20171114230705p:plain

あとはこれまでと同じようにデプロイすれば、Kubernetes 上で ASP.NET アプリケーションが動作します。Docker Image のサイズが 7GB から 3GB に削減されたので、コールドスタートにかかる時間はかなり短縮されました。実用にはまだかかりそうですが、これくらいなら工夫で何とかなりそうです。

Pod をデプロイすれば、あとは Service を追加すれば外部からアクセス可能になります。

f:id:shiba-yan:20171114230752p:plain

地味ですが、普通の ASP.NET MVC アプリケーションが AKS 上でも動作しました。

これまでも ACS や ACS Engine を使うことで Windows Containers に対応した Kubernetes 環境を用意することは出来ましたが、AKS はなんて言ってもマネージドサービスなので、今後 GA に向けていろいろと改善されていくはずです。

最近は VMSS に対して Automatic OS Image Upgrade が提供されましたし、AKS も GA までにはアップデート含め面倒を見てくれるサービスになることを期待しています。