こんにちは!インフラ担当の加藤です。
前回AKSをAzure CLIで構築するということを書きました。
今回はAzure Kubernetes Service (AKS)でAzure Container Instances (ACI)へPodを配置することができる、バーチャルノード(Virtual Kubelet)をAzure CLIで構築していきたいと思います。
前回記事はこちら。
aadojo.alterbooth.com
Virtual Kubeletとは
Kubernetesを他のAPIに接続する目的でkubeletの代わりを担うオープンソースプロジェクトです。
Virtual Kubeletを使うことで、Azure Container Instances (ACI)、AWS Fargate、IoT Edgeなどのサービスを仮想的にKubernetesのノードとして扱うことができます。
Kubernetes Architecture

Vitual Kubelet用のサブネットを準備する
まず、前回記事でも記載しているのですがバーチャルノード用のサブネットを追加します。
Virtual Node用に専用のサブネットが必要になりますので先に作成して準備します。
az network vnet subnet create -g MyResourceGroup \
--vnet-name MyVnet -n MySubnet2 \
--address-prefixes 192.168.1.0/24
Azure Container Instances(ACI)の機能プロバイダー登録
Azure Container Instancesがサブスクリプション上で使えるか確認します。
az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
プロバイダーがNotRegisteredと表示されている場合は以下コマンドで有効化します。
az provider register --namespace Microsoft.ContainerInstance
Helm使用準備
前回構築手順だとRBAC対応クラスターとなっていますので、以下YAMLでTiller で使用するためのサービス アカウントとロール バインディングを作成します。
ファイル名はrbac.yamlとします。
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
上記のyamlを使い、AKSへデプロイします。
kubectl apply -f rbac.yaml
次にTiller サービス アカウントを使用するように Helm を構成します。
helm init --service-account tiller
これでVirtual Kubeletのインストール準備が整いました。
Virtual Kubeletのインストール
Virtual Kubelet をインストールするためaz aks install-connectorコマンドを使用します。
以下はLinuxのみ有効化する例です。(Windowsも対応しています)
az aks install-connector \
--resource-group MyResourceGroup \
--name MyAKS \
--connector-name virtual-kubelet
az aks install-connectorコマンドの引数については以下をご参照ください。
Virtual Nodeが動作しているかを確認します。
$ kubectl get nodes

Virtual Node上でコンテナを起動してみる
以下yamlを使ってnginxコンテナーを起動してみます。
Virtual Nodeへ配置する際に必要なものは[nodeSelector]と[tolerations]です。
nginx.yamlとして保存します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: vkube-nginx
spec:
replicas: 1
selector:
matchLabels:
app: vkube-nginx
template:
metadata:
labels:
app: vkube-nginx
spec:
containers:
- name: vkube-nginx
image: nginx:latest
ports:
- containerPort: 80
nodeSelector:
beta.kubernetes.io/os: linux
kubernetes.io/role: agent
type: virtual-kubelet
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: azure
effect: NoSchedule
作成できたらデプロイします。
kubectl apply -f nginx.yaml
ポッドが作成できたか確認して、IPアドレスからアクセスしてみます。
kubectl get pods -o wide

Welcome to nginx!の画面が表示されたら成功です。
Virtual Nodeの解除方法
まず動作させているPodを削除します。
kubectl delete -f nginx.yaml
次にVirtual Kubeletをアンイストールします。
az aks remove-connector \
--resource-group MyResourceGroup \
--name MyAKS \
--connector-name virtual-kubelet
AKSクラスターの削除方法
AKSクラスターを削除する場合はaz aks deleteコマンドを使用します。
az aks delete --name MyResourceGroup --resource-group MyAKS
如何でしたでしょうか?
VMとなるノードを起動することなくACIへデプロイできるVirtual Kubelet。
長期の運用となると料金がかさみますが、一時的な利用などのシーンでは役に立つのではないでしょうか?
ぜひお試しくださいませ。


