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

東日本にきたAKS(Azure Kubernetes Service)とACR(Azure Container Registry)入門

More than 1 year has passed since last update.

はじめに

昨日かな?AKS(Azure Kubernetes Service)が東日本で使えるようになりましたね。
早速動かしてみたいと思います。

仕事で使う上ではpublicなイメージではなく、ビルドした独自のイメージをprivateなリポジトリで管理することが多いと思います。
今回はACRにpushしたprivateイメージを使ってKubernetesにデプロイしてみようと思います。
ACRへのデプロイは少し工夫が必要ですので参考にしてみてください。

ACRへのpush

こちらの記事を参考にACRにpushしてみてください。

AzureContainerRegistryにprivateイメージをpushしよう

今回はpushされた以下の情報を使います。

  • ログインサーバ
    • uzresk0626.azurecr.io
  • レジストリ
    • uzresk0626

Kubernetesクラスタの構築

Kubernetesサービスを選択し、クラスターの作成を押して、必要事項をポチポチいれていきます

image.png

ネットワークも何も考えずにポチポチします

image.png

モニターは有効にしておきます

image.png

タグを適当につけて確認して「作成」

image.png

少し待つと3ノードのクラスタができているはずです。

image.png

CloudShellではkubectlコマンドやazコマンドが入っているので、インストールの手間がなくとても便利ですね。
CloudShellを起動します。

image.png

credentialを取得することでkubectlコマンドを使えるようになります。
認証情報は~/.kube/configに書き込まれます。

uzresk@Azure:~$ az aks get-credentials --resource-group East-ResourceGroup --name uzresk-aks-cluster
Merged "uzresk-aks-cluster" as current context in /home/uzresk/.kube/config

起動したノードの一覧を取得してみましょう。確かに3ノード起動していますね。

uzresk@Azure:~$ kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-agentpool-15689703-0   Ready     agent     15m       v1.10.3
aks-agentpool-15689703-1   Ready     agent     15m       v1.10.3
aks-agentpool-15689703-2   Ready     agent     15m       v1.10.3

デプロイの準備(ACRとの連携)

kubernetesからpullするには、ACRから認証を受ける必要があります。
以下のshellを実行することで、ServicePrincipalIDとPasswordを取得することができます。
ACR_NAMEの部分だけ書き換えてください。

get-service-principal.sh
#!/bin/bash

ACR_NAME=uzresk0626
SERVICE_PRINCIPAL_NAME=acr-service-principal

# Populate the ACR login server and resource id.
ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv)
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Create a contributor role assignment with a scope of the ACR resource.
SP_PASSWD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --role Reader --scopes $ACR_REGISTRY_ID --query password --output tsv)

# Get the service principle client id.
CLIENT_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)


# Output used when creating Kubernetes secret.
echo "ACR Login Server:" $ACR_LOGIN_SERVER
echo "Service principal ID: $CLIENT_ID"
echo "Service principal password: $SP_PASSWD"

実行するとServicePrincipalIDとPasswordが手に入ります。

uzresk@Azure:~$ ./get-service-principal.sh
Retrying role assignment creation: 1/36
Service principal ID: XXXXXXXXXXXXXXXXXXXXXXXXX
Service principal password: YYYYYYYYYYYYYYYYYYYYYYYY

secretを取得します。secret "acr-auth" createdが表示されていることを確認してください。

uzresk@Azure:~$ kubectl create secret docker-registry acr-auth --docker-server uzresk0626.azurecr.io --docker-username XXXXXXXXXXXXXXXXXXXXXXXXX --docker-password YYYYYYYYYYYYYYYYYYYYYYYY --docker-email test@xxxx.com
secret "acr-auth" created

取得していることを確認します。acr-authが表示されていることを確認してください。

uzresk@Azure:~$ kubectl get secrets -o wide
NAME                  TYPE                                  DATA      AGE
acr-auth              kubernetes.io/dockerconfigjson        1         6m
default-token-gwtdh   kubernetes.io/service-account-token   3         25m

デプロイ

ymlファイルを準備しましょう。

uzresk0626.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: uzresk0626
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: uzresk0626
    spec:
      containers:
      - name: uzresk0626
        image: uzresk0626.azurecr.io/uzresk0626:3.4.4
        ports:
        - containerPort: 80
        env:
        - name: MAX_MEMORY_MB
          value: "4096"
      imagePullSecrets:
      - name: acr-auth
---
apiVersion: v1
kind: Service
metadata:
  name: uzresk0626
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: uzresk0626

ポイントはpullするときに認証を受ける設定です。

uzresk0626.yml
      imagePullSecrets:
      - name: acr-auth

やっとデプロイです。applyコマンドを使います。

uzresk@Azure:~$ kubectl apply -f uzresk0626.yml
deployment "uzresk0626" created
service "uzresk0626" created
uzresk@Azure:~$

コンテナがpullできているか確認してみます。
「Successfully pulled images」となっていることを確認してください。

uzresk@Azure:~$ kubectl describe pod uzresk0626-6bfdbd495d-mnkqt
Name:           uzresk0626-6bfdbd495d-mnkqt
・・・・
Events:
  Type    Reason                 Age   From                               Message
  ----    ------                 ----  ----                               -------
  Normal  Scheduled              22m   default-scheduler                  Successfully assigned uzresk0626-6bfdbd495d-mnkqt to aks-agentpool-15689703-1
  Normal  SuccessfulMountVolume  22m   kubelet, aks-agentpool-15689703-1  MountVolume.SetUp succeeded for volume "default-token-gwtdh"
  Normal  Pulling                22m   kubelet, aks-agentpool-15689703-1  pulling image "uzresk0626.azurecr.io/uzresk0626:3.4.4"
  Normal  Pulled                 17m   kubelet, aks-agentpool-15689703-1  Successfully pulled image "uzresk0626.azurecr.io/uzresk0626:3.4.4"
  Normal  Created                17m   kubelet, aks-agentpool-15689703-1  Created container
  Normal  Started                17m   kubelet, aks-agentpool-15689703-1  Started container

進行状況をみてみましょう。

uzresk@Azure:~$ kubectl get service uzresk0626 --watch
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
uzresk0626   LoadBalancer   10.0.36.236   13.78.29.237   80:31845/TCP   1m

すこし待つとEXTERNAL-IPが取れますので、Ctrl+Cで抜けて該当のIPにアクセスすると画面が表示されるはずです。

クラスタの削除

サービスの削除(いきなりクラスタを削除しても構いません)

uzresk@Azure:~$ kubectl delete service uzresk0626
service "uzresk0626" deleted

クラスタを削除する

uzresk@Azure:~$ az aks delete --resource-group East-ResourceGroup --name uzresk-aks-cluster --no-wait
Are you sure you want to perform this operation? (y/n): y
uzresk@Azure:~$

すこし待つとVirtualMachineも削除されるはずです。

最後に

AzureでもKubernetesがこんなに簡単に扱えるのは嬉しいですね。
ACRの部分は独特ですが、他の手順はGCPとほぼ一緒なので途中でGCPを触っているような錯覚に襲われました。
これがKubernetesを使う意義なんでしょうね。

参考

uzresk
触ったプロダクトのメモです。
https://github.com/uzresk
tis
創業40年超のSIerです。
https://www.tis.co.jp/
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
ユーザーは見つかりませんでした