Azure CLIでAKSを作るときのオプションTips

こんにちは!インフラ担当の加藤です。
Kubernetesも色々と進化してきて、AKS(Azure Kubernetes Service)もVM Scale setsがサポートされるなど進化してきているので実用出来る構築パターンをまとめたいと思います。

構築するにはAzure ポータルでもいいのですが、やはりコマンドの方がオプションをつけれて細かい調整が出来ますので、今回はAzure CLIでの構築方法となります。 インストールされていない方はこちらから。

docs.microsoft.com

AKSの構築

リソースグループの作成

まずはじめにリソースを入れるためのリソースグループを作ります。

az group create -l japaneast -n MyResourceGroup

docs.microsoft.com

後ほど使用しますので、作成結果からidを控えておきます。

仮想ネットワークの作成

次にAKSノードを接続するための仮想ネットワークとサブネットを作成します。

az network vnet create -n MyVnet -g MyResourceGroup \
    --address-prefix 192.168.0.0/16 \
    --subnet-name MySubnet --subnet-prefix 192.168.0.0/24

docs.microsoft.com

バーチャルノードやその他のリソースを同一VNetに接続させる場合は以下コマンドでサブネットの追加を行います。

az network vnet subnet create -g MyResourceGroup \
    --vnet-name MyVnet -n MySubnet2 \
    --address-prefixes 192.168.1.0/24

docs.microsoft.com

出来上がったらVNetのリソースIDを取得しておきます。
これは後ほど使います。

az network vnet show -g MyResourceGroup -n MyVnet --query id -o tsv
az network vnet subnet show -g MyResourceGroup --vnet-name MyVnet -n MySubnet --query id -o tsv

## サービスプリンシパルの作成 AKSの管理のためのサービスプリンシパルを作成します。
これはAzureADへの権限がないと作成出来ませんので権限管理を厳密に行なっている場合は注意してください。

az ad sp create-for-rbac --name ServicePrincipalName --skip-assignment

docs.microsoft.com

作成されたらappIdとpasswordを控えておきます。

また、作成したサービスプリンシパルにAzureリソースへのアクセスを委任します。
今回は最初に作成したリソースグループへアクセス許可します。

az role assignment create --assignee <appId> --scope <ResouceGroupId> --role Contributor

にはリソースグループを作成した際に控えたidを入れます。
以下のような形式のものが入ります。

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/{ResourceGroupName}

AKSクラスターの作成

本命のAKSクラスターの構築です。
以下はコマンドの構成です。

  • 既存のVNetとサブネットを使用
  • ノード数は5
  • VMはScale Setを使用
  • ロードバランサーのSKUはStandardへ変更
  • DNS名は「MyDNSPrefix」
  • Podの最大数は50(最大数を50以上にする場合はサポートへの連絡必須)
  • 既存のサービスプリンシパルを使用
  • 動作させるリージョンは東日本
  • ssh keyは既存のものを使用
  • Kubernetesのバージョンは1.15.3を指定

前項で取得したVNetのリソースIDを「vnet-subnet-id」へ、サービスプリンシパルの作成結果からappIdを「sevice-principal」、passwordを「client-secret」へ入れ、コマンドを実行します。

az aks create -g MyResourceGroup -n MyAKS \
    --ssh-key-value ~/.ssh/id_rsa.pub \
    --kubernetes-version 1.15.3 \
    --node-count 5 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku Standard \
    --dns-name-prefix MyDNSPrefix \
    --node-vm-size Standard_DS2_v2 \
    --location japaneast \
    --max-pods 50 \
    --enable-addons monitoring,http_application_routing \
    --vnet-subnet-id “{VNetId}” \
    --service-principal <appId> \
    --client-secret <password>

docs.microsoft.com

出来上がったリソースは以下のようになります。
f:id:tsukatoh:20191003111053p:plain f:id:tsukatoh:20191003111108p:plain

Kubernetesクラスターへの接続

Kubernetesへの接続をするため資格情報をダウンロードします。

az aks get-credentials -g MyResourceGroup -n MyAKS

docs.microsoft.com

クラスターへの接続を確認するため、クラスターノードの一覧を取得してみます。

kubectl get nodes

f:id:tsukatoh:20191003111022p:plain

アプリケーションの実行

ここまできたらあとはアプリケーションをデプロイするだけです。
nginxのコンテナーを動かしてみましょう。 以下のようなyamlファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: aks-deployment
  labels:
    app: aksapp
spec:
  replicas: 5
  selector:
    matchLabels:
      app: aksapp
  template:
    metadata:
      labels:
        app: aksapp
    spec:
      containers:
      - name: aksapp
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: aksapp
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: aksapp

作成したファイルからデプロイします。

kubectl apply -f deployment.yaml

IPアドレスが作成されるので確認します。
作成中の場合はと表示されています。

kubectl get svc

f:id:tsukatoh:20191003110950p:plain

pendingがIPアドレスに変わったらブラウザでアクセスしてみます。

f:id:tsukatoh:20191003110905p:plain

表示できたら成功です。