きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

AKS × Virtual kubelet × ACIをAKSと連携させてみた

この記事の目的

この記事では、
ACIをAKSで管理すること
を目的としています。

本題

★なんでそんなことするの?

AKS(Azure Kubernetes Service)では、Windows SeverベースのNodeは利用することができません。そのため、Windows Server ベースのNodeを使ったクラスターを作成・管理したい場合は、別の方法をとる必要があります。その方法は、span class="KinakoPoint">Virtual Kubeletを利用してACI(Azure Container Instances) とAKSを連携するという方法です。これにより、標準の Kubernetes ノードであるかのように、コンテナー インスタンス上で Windows Severベースのコンテナーをスケジュールすることができます。
 注意点として、Virtual Kubeletは「実験的なオープンソースプロジェクト」という位置づけになっているため、リリースまでに仕様が変わったりすることがあるかもしれないという点です。今回は、ただの調査という位置づけなので、気にせず利用していきます。作業自体は、以下のMicrosoft Docsを参考に進めていきます。

docs.microsoft.com
docs.microsoft.com


★Step0:事前準備

作業を始めるにあたり、本記事では以下の環境がすでにあることを前提とします。

★Step1:Virtual Kubeletのインストール

Virtual Kubeletをインストールします。

az aks install-connector --resource-group myAKSCluster --name myAKSCluster --connector-name virtual-kubelet --os-type Both
#Helm not detected, please verify if it is installed.

Helmがインストールされていないので失敗しました。Helmをインストールしてから再実行します。Helmとは、Kubernetes アプリケーションのインストールとライフサイクルの管理に役立つオープン ソースのパッケージ化ツールです。自分のAKSクラスタとkubectlの接続が確立している状態で、以下のコマンドを実行します。
docs.helm.sh

くっ・・・
Helmのインストールができない・・・
microsoft/azure-cliでは、apt-getが使えなくてインストールができない・・・
対応がわかったときのためのメモ。こうすればインストールできるのに(*´Д`)

apt-get install snap
snap install helm

ここは、いったんAzure Cloud Shellで作業をすることにします・・・
ACSでは、Helm CLIはインストール済みの環境が用意されています。

helm init --service-account tiller
#出力(一部)
#Happy Helming!

続けて、本丸のVirtual Kubeletをインストールします。ハウツーガイドに従い、Rbac-virtualkubelet.yamlファイルに以下の内容を記述します。続けざまに以下のコマンドを実行し、virtual-kubelet-virtual-kubelet-linux と virtual-kubelet-virtual-kubelet-winがnodeに追加されていることが確認できたら成功です。

kubectl apply -f rbac-virtual-kubelet.yaml
helm init --service-account tiller
az aks install-connector --resource-group myAKSCluster --name myAKSCluster --connector-name virtual-kubelet --os-type Both
kubectl get nodes

★Step2:Windowsコンテナを実行する

以下の内容を持つvirtual-kubelet-windows.yamlという名前のファイルを作成します。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nanoserver-iis
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nanoserver-iis
    spec:
      containers:
      - name: nanoserver-iis
        image: microsoft/iis:nanoserver
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: virtual-kubelet-virtual-kubelet-win
      tolerations:
      - key: azure.com/aci
        effect: NoSchedule

ここで、node Selectorの値に注意が必要です。この値は、Step1で作成したVirtual KubeletのNode名を記載する必要があります。ハウツーガイドに従い作業を進めていくと、少し違った名前になるみたいです。(自分の環境ではそうなりました。)ここのファイルを作成する前に、あらかじめkubectl get nodesコマンドを実行し、node名が何であるか確認する必要があります。
 ファイルの作成が完了したら、kubectl createコマンドを実行しpodを起動します。

kubectl create -f virtual-kubelet-windows.yaml

このコマンドが正常に実行されるとwaitingステータスのpodが作成されます。数分すると、ステータスがrunningに代わります。

bash-4.4# kubectl get po
NAME                                                              READY     STATUS    RESTARTS   AGE
nanoserver-iis-76f84475bb-4jmgm                                   1/1       Running   0          25m

★Step3:接続確認

ハウツーガイドの通り、kubectl get pods -o wideコマンドを実行し、対象のpodに割り当てられたIPアドレスを探します。IPアドレスが確認できたら、ブラウザから接続してみます。以下の画面が表示されたら、正しくpodが起動していることが確認できます。利用したDocker ImageがIISだけのものなので、この画面しか確認できないですね・・・
f:id:kinakomotitti:20180905232228p:plain

★今後について

目標通り、ACIをAKSで管理することができる環境を構築することができました。(Helmのインストールが途中になっていますが・・・)今後は、Visual Studioで作成したアプリケーションを配置したDockerImageをAKSで起動するところまでやっていこうと思います。また、バージョンアップなどの運用面の操作にも調査を進めていこうと思います。