🐥

AKS Engine を使用して Azure Stack Hub に Kubernetes クラスターをデプロイする

2021/06/08に公開

はじめに

AKS Engine を使用して、 Azure Stack Hub に Kubernetes クラスターをデプロイしてみます。

公式ドキュメントはこちら。
https://docs.microsoft.com/ja-jp/azure-stack/user/azure-stack-kubernetes-aks-engine-overview?view=azs-2102

AKS Engine は Azure Kubernetes Service (AKS) のコア部分であり、オープンソースで開発されています。Azure Stack Hub 1910 以降へのデプロイも GA されており、運用環境でも使えるようになっています。

https://docs.microsoft.com/ja-jp/azure-stack/operator/relnotearchive/release-notes?view=azs-1910#whats-new

環境

  • Azure Stack Hub 2005

前提条件の確認と準備

ドキュメントを確認し、マーケットプレースから必要なイメージを取得します。
https://docs.microsoft.com/ja-jp/azure-stack/user/azure-stack-kubernetes-aks-engine-set-up?view=azs-2005

Azure Stack Hub のバージョンによってデプロイ可能な AKS Engine のバージョン、及びそれに対応する Kubernetes バージョン、仮想マシンのイメージが異なります。それらのマッピングについてはドキュメントを参照してください。

https://docs.microsoft.com/ja-jp/azure-stack/user/kubernetes-aks-engine-release-notes?view=azs-2102#aks-engine-and-azure-stack-version-mapping

今回使用する Azure Stack Hub が 2005 なので、対応する AKS Engine のバージョンは 0.48.0, 0.51.0, 0.55.0, 0.55.4 となります。この中から、今回は 0.55.4 をデプロイする事にします。

次に、以下の表から 0.55.4 に対応する仮想マシンイメージは「AKS Base Ubuntu 16.04-LTS Image (2020.09.14)」である事が分かります。また、Kubernetes バージョンは 1.15.2, 1.16.14, 1.17.11 を選択可能です。今回は 1.17.11 をデプロイします。

まとめると、今回デプロイする環境は以下のようになります。

  • Azure Stack Hub 2005
  • AKS Engine 0.55.4
  • Kubernetes 1.17.11
  • AKS Base Ubuntu 16.04-LTS Image (2020.09.14)

イメージの取得

adminportal の Marketplace management から AKS 用の Ubuntu イメージをダウンロードします。

Linux カスタムスクリプト拡張機能を取得していなければ、これもダウンロードします。

AKS Engine のインストール

Azure Stack Hub 上の Linux サーバーを作成し、AKS Engine をインストールします。この Linux サーバーは AKS 用の Ubuntu ではなく、通常の Linux です(試していませんが、Azure 及び Azure Stack Hub に接続可能であれば Azure Stack Hub 上のサーバーでなくても良い気がします)。

https://docs.microsoft.com/ja-jp/azure-stack/user/azure-stack-kubernetes-aks-engine-deploy-linux?view=azs-2005

以下のコマンドで AKS Engine をインストールします。

$ curl -o get-akse.sh https://raw.githubusercontent.com/Azure/aks-engine/master/scripts/get-akse.sh
$ chmod 700 get-akse.sh
$ ./get-akse.sh --version v0.55.4

バージョンを確認。

$ aks-engine version
Version: v0.55.4
GitCommit: 0b2df8a7a
GitTreeState: clean

Azure Stack Hub に自己署名証明書を使用している場合は、信頼された証明書ストアにルート証明書を登録します。

$ sudo cp /var/lib/waagent/Certificates.pem /usr/local/share/ca-certificates/azurestackca.crt 
$ sudo update-ca-certificates

Kubernetes クラスターのデプロイ

https://docs.microsoft.com/ja-jp/azure-stack/user/azure-stack-kubernetes-aks-engine-deploy-cluster?view=azs-2005

API モデルの作成

AKS Engine では「API モデル」と呼ばれる JSON ファイルでクラスター仕様を定義しています。
まず API モデルのテンプレートを取得します。

$ curl -o kubernetes-azurestack.json https://raw.githubusercontent.com/Azure/aks-engine/patch-release-v0.55.4/examples/azure-stack/kubernetes-azurestack.json

API モデルを編集し、インストール先の環境を指定します。

orchestratorProfile で Kubernetes のバージョンを指定します。

kubernetes-azurestack.json
        "orchestratorProfile": {
            "orchestratorType": "Kubernetes",
            "orchestratorRelease": "1.17",
            "orchestratorVersion": "1.17.11",
	    ...
         }	

customCloudProfile でテナントポータルの URL を指定します。認証に Azure AD を使用している場合は identitySystem は空白にします。

customClodProfile
        "customCloudProfile": {
            "portalURL": "https://portal.<location>.<your_domain>",
            "identitySystem": ""
        },

masterProfile でマスターノードを定義します。
ここでは dnsPrefix を k8s-master に、count を 1 にします。(運用環境ではマスターノードの数は3以上にすべきでしょう。)

masterProfile
        "masterProfile": {
            "dnsPrefix": "k8s-master",
            "distro": "aks-ubuntu-16.04",
            "count": 1,
            "vmSize": "Standard_D2_v2"
        },

agentPoolProfiles を必要に応じて更新します。ここでは初期値のまま。

agentPoolProfiles
        "agentPoolProfiles": [
            {
                "name": "linuxpool",
                "count": 3,
                "vmSize": "Standard_D2_v2",
                "distro": "aks-ubuntu-16.04",
                "availabilityProfile": "AvailabilitySet",
                "AcceleratedNetworkingEnabled": false
            }
        ],

最後に linuxProfile でマスターノードの管理者ユーザー名と SSH 公開キーを指定します。

        "linuxProfile": {
            "adminUsername": "azureuser",
            "ssh": {
                "publicKeys": [
                    {
                        "keyData": "<your_public_key>"
                    }
                ]
            }
        },

サービスプリンシパルの作成

Azure Stack Hub に Kubernetes クラスターをデプロイする為のサービスプリンシパルを作成し、ユーザーサブスクリプションの共同管理者権限を付与します。

Azure Stack Hub に向けて下記コマンドを実行し、appIdpassword を控えます。--scopes オプションで指定するサブスクリプションIDは、Azure Stack Hub のユーザーサブスクリプションです。

$ az ad sp create-for-rbac --name "AzsAKSEngine-SP" --role "Contributor" --scopes "/subscriptions/<your_azs_user_subscriptoin>"
{
  "appId": "e535b26d-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "displayName": "AzsAKSEngine-SP",
  "name": "http://AzsAKSEngine-SP",
  "password": "hQxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Azure AD にサービスプリンシパルが作成されます。

また、Azure Stack Hub のユーザーサブスクリプションに共同管理者権限が付与されている事も確認できます。

Kubernetes クラスターのデプロイ

以下のコマンドを実行し、Kubernetes クラスターをデプロイします。
--client-id, --client-secret には、サービスプリンシパル作成時に返された appId, password をそれぞれ指定します。
--subscription-id は、デプロイ先の Azure Stack Hub ユーザーサブスクリプション(つまり、サービスプリンシパル作成時のユーザーサブスクリプションID)を指定します。

aks-engine deploy \
--azure-env AzureStackCloud \
--location <your_location> \
--resource-group <your_rg_name> \
--api-model ./kubernetes-azurestack.json \
--output-directory <your_rg_name> \
--client-id e535b26d-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--client-secret hQxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \

仮想マシン等のリソースがデプロイされました!

確認

マスターノードに ssh で接続し、状態を確認します。

$ kubectl cluster-info
Kubernetes master is running at https://k8s-master.xxx.xxx.xxx
CoreDNS is running at https://k8s-master.xxx.xxx.xxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://k8s-master.xxx.xxx.xxx/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME                       STATUS   ROLES    AGE    VERSION
k8s-linuxpool-12241785-0   Ready    agent    8m7s   v1.17.11
k8s-linuxpool-12241785-1   Ready    agent    8m7s   v1.17.11
k8s-linuxpool-12241785-2   Ready    agent    8m7s   v1.17.11
k8s-master-12241785-0      Ready    master   8m7s   v1.17.11
$ kubectl get pods --namespace=kube-system
NAME                                            READY   STATUS    RESTARTS   AGE
azure-ip-masq-agent-5cpds                       1/1     Running   0          12m
azure-ip-masq-agent-clfkr                       1/1     Running   0          12m
azure-ip-masq-agent-f64zq                       1/1     Running   0          12m
azure-ip-masq-agent-tmc6r                       1/1     Running   0          12m
coredns-677f8b69c9-5fmhb                        1/1     Running   0          12m
coredns-autoscaler-7f87d55bf-9pgn7              1/1     Running   0          12m
csi-secrets-store-provider-azure-dtkf6          1/1     Running   0          11m
csi-secrets-store-provider-azure-svtk9          1/1     Running   0          11m
csi-secrets-store-provider-azure-wdgl8          1/1     Running   0          11m
csi-secrets-store-rmsk5                         3/3     Running   0          12m
csi-secrets-store-rn496                         3/3     Running   0          12m
csi-secrets-store-vnsjh                         3/3     Running   0          12m
kube-addon-manager-k8s-master-12241785-0        1/1     Running   0          12m
kube-apiserver-k8s-master-12241785-0            1/1     Running   0          12m
kube-controller-manager-k8s-master-12241785-0   1/1     Running   0          11m
kube-proxy-drj4q                                1/1     Running   0          12m
kube-proxy-ltv2t                                1/1     Running   0          12m
kube-proxy-pvbjz                                1/1     Running   0          12m
kube-proxy-zbhlq                                1/1     Running   0          12m
kube-scheduler-k8s-master-12241785-0            1/1     Running   0          12m
metrics-server-5f88cd68f9-wsttq                 1/1     Running   0          12m

いろいろ動作している事が確認できます。

また、デプロイ時に --output-directory オプションで指定したディレクトリ以下に apimodel.json が出力されます。このファイルは、クラスターのスケーリングや更新時に使用します。
他に ARM テンプレートも出力されているので、これを眺めてみても面白いかもしれません。

~/k8s-rg$ ls -aFl
total 312
drwx------  3 azureuser azureuser   4096 Jun  8 06:31 ./
drwxr-xr-x 12 azureuser azureuser   4096 Jun  8 06:31 ../
-rw-------  1 azureuser azureuser  62213 Jun  8 06:31 apimodel.json
-rw-------  1 azureuser azureuser   2147 Jun  8 06:31 apiserver.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 apiserver.key
-rw-------  1 azureuser azureuser 127779 Jun  8 06:31 azuredeploy.json
-rw-------  1 azureuser azureuser  52556 Jun  8 06:31 azuredeploy.parameters.json
-rw-------  1 azureuser azureuser   1720 Jun  8 06:31 ca.crt
-rw-------  1 azureuser azureuser   3247 Jun  8 06:31 ca.key
-rw-------  1 azureuser azureuser   1785 Jun  8 06:31 client.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 client.key
-rw-------  1 azureuser azureuser   1818 Jun  8 06:31 etcdclient.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 etcdclient.key
-rw-------  1 azureuser azureuser   1814 Jun  8 06:31 etcdpeer0.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 etcdpeer0.key
-rw-------  1 azureuser azureuser   1818 Jun  8 06:31 etcdserver.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 etcdserver.key
drwx------  2 azureuser azureuser   4096 Jun  8 06:31 kubeconfig/
-rw-------  1 azureuser azureuser   1785 Jun  8 06:31 kubectlClient.crt
-rw-------  1 azureuser azureuser   3243 Jun  8 06:31 kubectlClient.key

Kubernetes クラスターのスケーリング

以下のコマンドでスケーリングします。
--api-model で指定するのは、クラスターのデプロイ後に出力された apimodel.json です。
--new-node-count でエージェントプールの数を指定します。スケールアウト/スケールインどちらも可能です。
--apiserver にはマスターノードの DNS 名を指定します。

aks-engine scale \
--azure-env AzureStackCloud \
--location <your_location> \
--resource-group <your_rg_name> \
--api-model <path_to_output_dir>/apimodel.json \
--client-id e535b26d-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--client-secret hQxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--new-node-count 5 \
--apiserver k8s-master.xxx.xxx.xxx

追加の仮想マシンがデプロイされ、ノードとして認識されている事が確認できます。

$ kubectl get nodes
NAME                       STATUS   ROLES    AGE     VERSION
k8s-linuxpool-12241785-0   Ready    agent    46m     v1.17.11
k8s-linuxpool-12241785-1   Ready    agent    46m     v1.17.11
k8s-linuxpool-12241785-2   Ready    agent    46m     v1.17.11
k8s-linuxpool-12241785-3   Ready    agent    5m21s   v1.17.11
k8s-linuxpool-12241785-4   Ready    agent    5m38s   v1.17.11
k8s-master-12241785-0      Ready    master   46m     v1.17.11

尚、マスターノードのスケーリングはできないようです。apimodel.json に定義されている masterProfile を変更して aks-engine scale を実行しても反映されませんでした。

おわりに

AKS Engine を使って Azure Stack Hub 上に Kubernetes クラスターを構築しました。

AKS Engine で得られるのは仮想マシンや仮想ネットワークといった Azure のインフラストラクチャーレイヤーのリソースです。つまり、Kubernetes クラスターに加えて、これらのリソースについても自分自身で管理する必要があります。

逆に言えば、インフラを自分自身でコントロールしたいというのが AKS Engine を使う動機になるかと思います。

Azure Stack Hub でも 2008 で AKS のプライベートプレビューが開始されました。マネージドサービスを望むのであれば、AKS が GA される事を期待しましょう。

https://docs.microsoft.com/ja-jp/azure-stack/operator/release-notes?view=azs-2008#whats-new

Discussion