Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

AKSでVirtual Kubeletを使う

こんにちは!インフラ担当の加藤です。
前回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のノードとして扱うことができます。

github.com

Kubernetes Architecture

Kubernetes Architecture
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コマンドの引数については以下をご参照ください。

docs.microsoft.com

Virtual Nodeが動作しているかを確認します。

$ kubectl get nodes

f:id:tsukatoh:20191018170636p:plain

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

f:id:tsukatoh:20191018170852p:plain

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。
長期の運用となると料金がかさみますが、一時的な利用などのシーンでは役に立つのではないでしょうか?
ぜひお試しくださいませ。