しばやん雑記

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

Azure Container Instances を Kubernetes の仮想ノードとして利用できる aci-connector-k8s を試してみた

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 が現れます。

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

このノードに対するコンテナ起動リクエストは 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 アドレスも割り当てられます。

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

パブリック IP アドレスにアクセスすると、Nginx が確かに立ち上がっていることが簡単に確認できます。

Kubernetes クラスタ内に Pod を作成する時よりも、コンテナの起動が早い気がします。

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

Kubernetes の知識が少しあれば、バックエンドが Azure Container Instances かどうか全く意識することなく使うことが出来ました。リソース管理も不要ですし、これはかなり便利ですね。

ただし Kubernetes のマスターノードは作っておく必要があるので、Azure Container Services が管理された Kubernetes マスターを提供してくれたら最高です。