Help us understand the problem. What is going on with this article?

AKS を使いこなす : チュートリアルの深堀り - AKS クラスターのデプロイ

今回はチュートリアル: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 から始まるリソースグループはノードをホストする仮想マシンが含まれます。
image.png

仮想マシンが含まれるリソースグループには、仮想マシンに必要なネットワークやディスクリソースの他、仮想ネットワークやルートテーブルが含まれます。
image.png
仮想マシンは既定の Standard_DS2_v2 です。
image.png
メインのリソースグループは AKS と ACR が含まれています。
image.png

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

3. ブラウザが起動したら内容を確認。
image.png

まとめ

AKS を使うと簡単に k8s クラスタが作成できることがわかりました。次回はアプリケーションを展開します。

次の記事へ
目次に戻る

参考

kubectl Cheat Sheet
Azure Kubernetes Service (AKS) で Kubernetes Web ダッシュボードにアクセスする

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした