世界のやまさ

SEKAI NO YAMASA

Azure Kubernetes Service (AKS) で virtual nodes を試してみた

この記事は Microsoft Azure Advent Calendar 2018 の 10 日目の記事です。

qiita.com

virtual nodes とは

12/4 に 発表されたばかりの Azure Kubernetes Service(AKS) 向けの機能です。

azure.microsoft.com

名前の通り仮想ノードです。Kubernetes ではノードを常に立ち上げておく必要がありますが、virtual nodes では必要なときのみノードを立ち上げることで、バーストの対応や料金の節約が期待できます。

ザックリいうと、「Kubernetesノードのサーバーレス化」です。

virtual nodes と virtual kubelet との違いは?

Azure には従来から virtual kubelet というものが用意されています。

github.com

両者の違いは、自動で追加するか、手動で追加するかの違いです。

virtual nodes の実装は virtual kubelet です。従来の通り、 virtual nodes を使用せず、 virtual kubelet を手動で使用することもできますが、今後は virtual nodes を使用して、 AKS でマネージドしてもらうほうが手間いらずで便利なのではと思います。

なお、余談ですが、virtual kubelet は CNCF プロジェクトになり、Azure 以外にも AWS Fargate などでも使用できます。

www.atmarkit.co.jp

virtual nodes を試してみる

こちらの手順に沿って実行していきます。Azure CLI とポータルを使用するパターンがあります。ポータルから作成しました。

docs.microsoft.com

AKS を作成する

virtual nodes (preview) オプションを有効にして、 AKS を作成します。1点注意として、virtual nodes をサポートしているリージョンは複数あるのですが、US系は一部問題が発生しているらしく、 West Europe を選択しました。

f:id:nnasaki:20181210125222p:plain
AKSクラスタの作成

デプロイを行うとおよそ8分くらいで AKS が出来上がります。

f:id:nnasaki:20181210125539p:plain
デプロイの結果

ポータルから Monitoring - Insight(preview) にて確認すると virtual Node らしきものが表示されています。

f:id:nnasaki:20181210125735p:plain
virtual Node の確認

virtual nodes にサンプルアプリをデプロイする

次の yaml を デプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: aci-helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: aci-helloworld
  template:
    metadata:
      labels:
        app: aci-helloworld
    spec:
      containers:
      - name: aci-helloworld
        image: microsoft/aci-helloworld
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/role: agent
        beta.kubernetes.io/os: linux
        type: virtual-kubelet
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Exists
      - key: azure.com/aci
        effect: NoSchedule

ポイントは nodeSelectortolerations で virtual-kubelet が指定されています。この点からも virtual-kubelet がベースであるということがわかります。

デプロイ方法は kubectl apply -f virtual-node.yaml を実行します。

およそ2分くらいで Running になりました。Azure Container Instances(ACI) の立ち上がる速度に依存します。早いときは30秒前後ということもありました。

f:id:nnasaki:20181210134937p:plain
デプロイの様子

デプロイ後の動作確認

デプロイしたインスタンスは AKS の内部IPなので、外部からアクセスできません。チュートリアルに沿って、 AKS 上にもう一つインスタンスを動かして curl で確認します。

インスタンス作成

kubectl run -it --rm virtual-node-test --image=debian

curl で動作確認

apt-get update && apt-get install -y curl
curl -L http://10.241.0.4

curl の実行結果に HTML が表示されているのが確認できました。

f:id:nnasaki:20181210135521p:plain
curl で動作確認結果

ノードの管理

AKS の Monitoring - Insight(preview) にて実際に動作している ACI を確認できます。こちらも便利な機能ですね。

f:id:nnasaki:20181210135449p:plain
Monitoring - Insight(preview) でのACI表示

リソースグループには ACI インスタンスが表示されていました。

f:id:nnasaki:20181210135554p:plain
ACI のインスタンス

使ったインスタンスの削除

後始末をしてみます。

kubectl delete -f virtual-node.yaml で deployment を削除します。

pod は即消える。(ここに表示されているのは動作確認時にcurlで使用したpod)

f:id:nnasaki:20181210140955p:plain
削除後の pod 一覧

ACI も即消える。

f:id:nnasaki:20181210140746p:plain
ACI が削除されている様子

Monitoring - Insight(preview) にはまだ残っていました。こちらはタイムラグがあるようです。

f:id:nnasaki:20181210141314p:plain
Monitoring - Insight(preview) の様子

まとめ

virtual nodes は手軽に利用可能で、利便性が高そうです。まだ preview 段階ですが、積極的に使用していきたいと考えています。スピンアップがミリ秒単位になれば KNative などと組み合わせて、サーバーレス環境を構築するのも面白そうですね。