AKS Engine を使用して Azure Stack Hub に Kubernetes クラスターをデプロイする
はじめに
AKS Engine を使用して、 Azure Stack Hub に Kubernetes クラスターをデプロイしてみます。
公式ドキュメントはこちら。
AKS Engine は Azure Kubernetes Service (AKS) のコア部分であり、オープンソースで開発されています。Azure Stack Hub 1910 以降へのデプロイも GA されており、運用環境でも使えるようになっています。
環境
- Azure Stack Hub 2005
前提条件の確認と準備
ドキュメントを確認し、マーケットプレースから必要なイメージを取得します。
Azure Stack Hub のバージョンによってデプロイ可能な AKS Engine のバージョン、及びそれに対応する Kubernetes バージョン、仮想マシンのイメージが異なります。それらのマッピングについてはドキュメントを参照してください。
今回使用する 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 上のサーバーでなくても良い気がします)。
以下のコマンドで 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 クラスターのデプロイ
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 のバージョンを指定します。
"orchestratorProfile": {
"orchestratorType": "Kubernetes",
"orchestratorRelease": "1.17",
"orchestratorVersion": "1.17.11",
...
}
customCloudProfile でテナントポータルの URL を指定します。認証に Azure AD を使用している場合は identitySystem は空白にします。
"customCloudProfile": {
"portalURL": "https://portal.<location>.<your_domain>",
"identitySystem": ""
},
masterProfile でマスターノードを定義します。
ここでは dnsPrefix を k8s-master に、count を 1 にします。(運用環境ではマスターノードの数は3以上にすべきでしょう。)
"masterProfile": {
"dnsPrefix": "k8s-master",
"distro": "aks-ubuntu-16.04",
"count": 1,
"vmSize": "Standard_D2_v2"
},
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 に向けて下記コマンドを実行し、appId
と password
を控えます。--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 される事を期待しましょう。
Discussion