この記事は Microsoft Azure Advent Calendar 2018 の 10 日目の記事です。
virtual nodes とは
12/4 に 発表されたばかりの Azure Kubernetes Service(AKS) 向けの機能です。
名前の通り仮想ノードです。Kubernetes ではノードを常に立ち上げておく必要がありますが、virtual nodes では必要なときのみノードを立ち上げることで、バーストの対応や料金の節約が期待できます。
ザックリいうと、「Kubernetesノードのサーバーレス化」です。
virtual nodes と virtual kubelet との違いは?
Azure には従来から virtual kubelet というものが用意されています。
両者の違いは、自動で追加するか、手動で追加するかの違いです。
virtual nodes の実装は virtual kubelet です。従来の通り、 virtual nodes を使用せず、 virtual kubelet を手動で使用することもできますが、今後は virtual nodes を使用して、 AKS でマネージドしてもらうほうが手間いらずで便利なのではと思います。
なお、余談ですが、virtual kubelet は CNCF プロジェクトになり、Azure 以外にも AWS Fargate などでも使用できます。
virtual nodes を試してみる
こちらの手順に沿って実行していきます。Azure CLI とポータルを使用するパターンがあります。ポータルから作成しました。
AKS を作成する
virtual nodes (preview) オプションを有効にして、 AKS を作成します。1点注意として、virtual nodes をサポートしているリージョンは複数あるのですが、US系は一部問題が発生しているらしく、 West Europe を選択しました。
デプロイを行うとおよそ8分くらいで AKS が出来上がります。
ポータルから Monitoring - Insight(preview) にて確認すると 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
ポイントは nodeSelector
と tolerations
で virtual-kubelet が指定されています。この点からも virtual-kubelet がベースであるということがわかります。
デプロイ方法は kubectl apply -f virtual-node.yaml
を実行します。
およそ2分くらいで Running になりました。Azure Container Instances(ACI) の立ち上がる速度に依存します。早いときは30秒前後ということもありました。
デプロイ後の動作確認
デプロイしたインスタンスは 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 が表示されているのが確認できました。
ノードの管理
AKS の Monitoring - Insight(preview) にて実際に動作している ACI を確認できます。こちらも便利な機能ですね。
リソースグループには ACI インスタンスが表示されていました。
使ったインスタンスの削除
後始末をしてみます。
kubectl delete -f virtual-node.yaml
で deployment を削除します。
pod は即消える。(ここに表示されているのは動作確認時にcurlで使用したpod)
ACI も即消える。
Monitoring - Insight(preview) にはまだ残っていました。こちらはタイムラグがあるようです。
まとめ
virtual nodes は手軽に利用可能で、利便性が高そうです。まだ preview 段階ですが、積極的に使用していきたいと考えています。スピンアップがミリ秒単位になれば KNative などと組み合わせて、サーバーレス環境を構築するのも面白そうですね。