こんにちは!インフラ担当の加藤です。
Kubernetesも色々と進化してきて、AKS(Azure Kubernetes Service)もVM Scale setsがサポートされるなど進化してきているので実用出来る構築パターンをまとめたいと思います。
構築するにはAzure ポータルでもいいのですが、やはりコマンドの方がオプションをつけれて細かい調整が出来ますので、今回はAzure CLIでの構築方法となります。 インストールされていない方はこちらから。
AKSの構築
リソースグループの作成
まずはじめにリソースを入れるためのリソースグループを作ります。
az group create -l japaneast -n MyResourceGroup
後ほど使用しますので、作成結果から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
バーチャルノードやその他のリソースを同一VNetに接続させる場合は以下コマンドでサブネットの追加を行います。
az network vnet subnet create -g MyResourceGroup \ --vnet-name MyVnet -n MySubnet2 \ --address-prefixes 192.168.1.0/24
出来上がったら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
作成されたらappIdとpasswordを控えておきます。
また、作成したサービスプリンシパルにAzureリソースへのアクセスを委任します。
今回は最初に作成したリソースグループへアクセス許可します。
az role assignment create --assignee <appId> --scope <ResouceGroupId> --role Contributor
以下のような形式のものが入ります。
/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>
出来上がったリソースは以下のようになります。
Kubernetesクラスターへの接続
Kubernetesへの接続をするため資格情報をダウンロードします。
az aks get-credentials -g MyResourceGroup -n MyAKS
クラスターへの接続を確認するため、クラスターノードの一覧を取得してみます。
kubectl get nodes
アプリケーションの実行
ここまできたらあとはアプリケーションをデプロイするだけです。
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
pendingがIPアドレスに変わったらブラウザでアクセスしてみます。
表示できたら成功です。