今回はチュートリアル:Azure Kubernetes Service (AKS) クラスターのデプロイの深堀をしていきます。
このチュートリアルでようやく AKS を作成します。また深堀では作成したクラスタの詳細を見ることで k8s の操作についても触れていきます。
kubectl
kubectl は k8s を操作する CLI ツールであり、今後のチュートリアルのメインとなるツールです。
Azure AD サービスプリンシパル
AKS クラスターが他の Azure リソースと対話できるようにするために、Azure AD (Active Directory) のサービスプリンシパル作成して使用します。サービスプリンシパルはアプリケーション専用のユーザーアカウントのようなもので、各種権限の設定が柔軟に行えます。
前回作成した ACR に対するアクセスについてもサービスプリンシパルを使っています。
チュートリアルの深堀
では実際にチュートリアルを見ていきましょう。
サービスプリンシパルの作成
まず AKS で利用するサービスプリンシパルの作成と、ACR への権限付与を行います。
1. az ad sp
コマンドでサービスプリンシパル作成。
- RBAC (ロールベースアクセスコントロール) で使えるサービスプリンシパル作成
- 既定のロールはアサインしない
az ad sp create-for-rbac --skip-assignment
{
"appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"displayName": "azure-cli-2019-09-24-04-32-40",
"name": "http://azure-cli-2019-09-24-04-32-40",
"password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
2. ACR に権限を付与するため、まずは ACR のリソース名を取得。
az acr show --resource-group akstutorial --name kenakamuacr --query "id" --output tsv
3. サービスプリンシパルに ACR の acrpull
権限を付与。
- appId: サービスプリンシパル作成の結果から確認
- acrId: 上記で取得したリソース名
- acrpull ロールをアサインすることで ACR よりイメージをプル可能
az role assignment create --assignee <appId> --scope <acrId> --role acrpull
クラスタの作成
次に AKS クラスタを作成します。クラスタ作成から接続までは、以下の 3 コマンドで完了します。
- az aks create : AKS クラスタの作成
- az aks install-cli : kubectl のインストール
- az aks get-credentials : AKS クラスタへの認証
では早速クラスタを作っていきましょう。
1. az aks create
コマンドで AKS クラスタを作成。ここでは名前を myfirstaks, ノード数を 2 として作成。AKS クラスタの割り当てと VM の作成を行うため、数分~10分程度時間がかかる。
- appId/client-secret はサービスプリンシパル作成時の結果より取得
- 作成時、SSH キーがユーザーディレクトリの .ssh に作成される
- VM のサイズは既定の Standard_DS2_v2 (詳細はこちら)
az aks create \
--resource-group aksturotial \
--name myfirstaks \
--node-count 2 \
--service-principal <appId> \
--client-secret <password> \
--generate-ssh-keys
2. kubectl をインストール。
az aks install-cli
3. 作成した AKS クラスタへの接続。
az aks get-credentials --resource-group akstutorial --name myfirstaks
4. 接続ができているかノードを取得して確認。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-34717040-0 Ready agent 5m34s v1.13.10
aks-nodepool1-34717040-1 Ready agent 5m36s v1.13.10
チュートリアルはここで終わりですが深堀として、ここから作成したクラスタを見ていきます。
作成したクラスタの詳細確認
Azure ポータルから見た AKS クラスタ
AKS クラスタを作成すると、Azure ポータル上では 2 つのリソースグループが作成されます。MC から始まるリソースグループはノードをホストする仮想マシンが含まれます。
仮想マシンが含まれるリソースグループには、仮想マシンに必要なネットワークやディスクリソースの他、仮想ネットワークやルートテーブルが含まれます。
仮想マシンは既定の Standard_DS2_v2 です。
メインのリソースグループは AKS と ACR が含まれています。
k8s から見た AKS クラスタ
kubectl を使うと様々な情報を見ることができます。
kubectl バージョン
> kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:49Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"2019-08-19T10:44:49Z", GoVersion:"go1.11.13", Compiler:"gc", Platform:"linux/amd64"}
クラスタの情報
1. 現在のクラスタの情報を取得。
> kubectl cluster-info
Kubernetes master is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443
CoreDNS is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy
Metrics-server is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
2. 他にもクラスタがある場合はその情報も取得可能。
-
- は現在操作対象となっているクラスタ
> kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kenakamuaks kenakamuaks clusterAdmin_kenakamuaksrg_kenakamuaks
* myfirstaks myfirstaks clusterUser_akstutorial_myfirstaks
3. 変更する場合は set-context を使用。
名前空間
> kubectl get namespaces
NAME STATUS AGE
default Active 98m
kube-public Active 98m
kube-system Active 98m
ノードの情報を取得
1. まずノード一覧を表示。
-
-o wide
で付加情報を表示
> kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
aks-nodepool1-34717040-0 Ready agent 81m v1.13.10 10.240.0.5 <none> Ubuntu 16.04.6 LTS 4.15.0-1055-azure docker://3.0.6
aks-nodepool1-34717040-1 Ready agent 81m v1.13.10 10.240.0.4 <none> Ubuntu 16.04.6 LTS 4.15.0-1055-azure docker://3.0.6
2. 次に特定ノードの詳細を確認。
- Labels で既定のラベルの値が確認 ※今後のチュートリアルでも beta.kubernetes.io/os が linux となっているノードを指定している場所がある
- Conditions で現在の状態が確認
- Capacity でノードの性能が確認
- Allocatable で割り当て可能なリソースを確認
- Non-terminated Pods では常時起動しているポッドとして kube-proxy が表示
- Allocated resouces で現在割り当て済のリソースを確認
> kubectl describe node aks-nodepool1-34717040-0
Name: aks-nodepool1-34717040-0
Roles: agent
Labels: agentpool=nodepool1
beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=Standard_DS2_v2
beta.kubernetes.io/os=linux
failure-domain.beta.kubernetes.io/region=japaneast
failure-domain.beta.kubernetes.io/zone=0
kubernetes.azure.com/cluster=MC_akstutorial_myfirstaks_japaneast
kubernetes.azure.com/role=agent
kubernetes.io/hostname=aks-nodepool1-34717040-0
kubernetes.io/role=agent
node-role.kubernetes.io/agent=
storageprofile=managed
storagetier=Premium_LRS
Annotations: node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Tue, 24 Sep 2019 13:49:56 +0900
Taints: <none>
Unschedulable: false
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Tue, 24 Sep 2019 13:51:15 +0900 Tue, 24 Sep 2019 13:51:15 +0900 RouteCreated RouteController created a route
MemoryPressure False Tue, 24 Sep 2019 15:13:28 +0900 Tue, 24 Sep 2019 13:49:56 +0900 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Tue, 24 Sep 2019 15:13:28 +0900 Tue, 24 Sep 2019 13:49:56 +0900 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Tue, 24 Sep 2019 15:13:28 +0900 Tue, 24 Sep 2019 13:49:56 +0900 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Tue, 24 Sep 2019 15:13:28 +0900 Tue, 24 Sep 2019 13:49:56 +0900 KubeletReady kubelet is posting ready status. AppArmor enabled
Addresses:
Hostname: aks-nodepool1-34717040-0
InternalIP: 10.240.0.5
Capacity:
attachable-volumes-azure-disk: 8
cpu: 2
ephemeral-storage: 101584140Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 7113568Ki
pods: 110
Allocatable:
attachable-volumes-azure-disk: 8
cpu: 1931m
ephemeral-storage: 93619943269
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 4668256Ki
pods: 110
System Info:
Machine ID: 8bc992d3d0284015b50878d7143c5442
System UUID: CA607A86-F7C3-8B42-A382-F950DA89663E
Boot ID: d0ea6613-7826-416d-ab31-093cd7011f9d
Kernel Version: 4.15.0-1055-azure
OS Image: Ubuntu 16.04.6 LTS
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://3.0.6
Kubelet Version: v1.13.10
Kube-Proxy Version: v1.13.10
PodCIDR: 10.244.1.0/24
ProviderID: azure:///subscriptions/a200855b-a4ab-491f-a769-1015fa35dee3/resourceGroups/MC_akstutorial_myfirstaks_japaneast/providers/Microsoft.Compute/virtualMachines/aks-nodepool1-34717040-0
Non-terminated Pods: (1 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system kube-proxy-wvpdp 100m (5%) 0 (0%) 0 (0%) 0 (0%) 83m
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 100m (5%) 0 (0%)
memory 0 (0%) 0 (0%)
ephemeral-storage 0 (0%) 0 (0%)
attachable-volumes-azure-disk 0 0
Events: <none>
サービスの確認
> kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 116m <none>
k8s Web ダッシュボードからみたクラスタ
k8s は Web ダッシュボードでも確認できます。
1. RBAC ベースのサービスプリンシパルで AKS を利用している場合、まずダッシュボードにアクセスするための権限を作成。
kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
2. az aks browse
でダッシュボードを起動。
az aks browse -g akstutorial -n myfirstaks
まとめ
AKS を使うと簡単に k8s クラスタが作成できることがわかりました。次回はアプリケーションを展開します。
参考
kubectl Cheat Sheet
Azure Kubernetes Service (AKS) で Kubernetes Web ダッシュボードにアクセスする