Azure Container Instances は単体ではオーケストレーターが提供されてないですが、実験的に Kubernetes と連携して利用できる aci-connector-k8s が同時にリリースされています。
GitHub でソースコードが、Docker Hub でビルド済みイメージが公開されています。
https://github.com/Azure/aci-connector-k8s
利用するためにはサービスプリンシパルと Container Instances が実際にデプロイされるリソースグループが必要なので、予め Azure CLI などを使って作っておきます。
Cloud Shell で作るのが手っ取り早いかと思います。
公式に Docker Hub で提供されているイメージは、最新版の Resource Provider に対応していないようなので、そのままデプロイしてしまうと aci-connector-k8s でエラーになってしまいます。
仕方ないのでサクッと対応コードを書いて Docker Hub にプッシュしておきました。
https://hub.docker.com/r/shibayan/aci-connector-k8s/
サンプルにある YAML のイメージを変更するだけで使えます。Pull Request を送っているので、ひょっとしたら取り込まれて公式対応されるかもしれません。とりあえずの対応です。
他には作成しておいたサービスプリンシパルやリソースグループの名前などセットします。
apiVersion: v1 kind: Pod metadata: name: aci-connector namespace: default spec: containers: - name: aci-connector image: shibayan/aci-connector-k8s:latest imagePullPolicy: Always env: - name: AZURE_CLIENT_ID value: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - name: AZURE_CLIENT_KEY value: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - name: AZURE_TENANT_ID value: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - name: AZURE_SUBSCRIPTION_ID value: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - name: ACI_RESOURCE_GROUP value: YOURRESOURCEGROUP-NAME nodeSelector: beta.kubernetes.io/os: linux
nodeSelector は私が持っている Kubernetes クラスタが Windows なので指定しています。Linux のみの Kubernetes クラスタの場合は指定する必要はないはずです。
ダッシュボードからデプロイしてしばらく待つと、ノードに aci-connector が現れます。
このノードに対するコンテナ起動リクエストは Azure Container Instances が透過的に使われるようになります。今後 Container Instances にネイティブ対応したオーケストレーターが出てくると楽しそうです。
実際に aci-connector に対してデプロイを行ってみます。これもサンプルの通りです。
apiVersion: v1 kind: Pod metadata: name: nginx-aci namespace: default spec: containers: - image: nginx:alpine imagePullPolicy: Always name: nginx-aci dnsPolicy: ClusterFirst nodeName: aci-connector
nodeName として aci-connector を明示的に指定しているので注意です。
デプロイすると一瞬で新しい Pod が立ち上がり、パブリック IP アドレスも割り当てられます。
パブリック IP アドレスにアクセスすると、Nginx が確かに立ち上がっていることが簡単に確認できます。
Kubernetes クラスタ内に Pod を作成する時よりも、コンテナの起動が早い気がします。
Kubernetes の知識が少しあれば、バックエンドが Azure Container Instances かどうか全く意識することなく使うことが出来ました。リソース管理も不要ですし、これはかなり便利ですね。
ただし Kubernetes のマスターノードは作っておく必要があるので、Azure Container Services が管理された Kubernetes マスターを提供してくれたら最高です。