MinikubeでACR(Azure Container Registry)を使う

MinikubeからACRにアップロードしたコンテナイメージを利用する方法です。

変数設定

Azureに設定済みのACRの名前と、任意のSP_NAMEを設定します。

ACR_NAME=yomon8acr
SP_NAME=yomon8-minikube-principal

ACRの準備

ACRのIDを取得します。

ACR_REGISTRY_ID=$(az acr show --name ${ACR_NAME} --query id --output tsv)

# ACR_REGISTRY_ID->  /subscriptions/{Subscription}/resourceGroups/{ResourceGroup}/providers/Microsoft.ContainerRegistry/registries/{ACR_NAME}

Service Principalの作成と認証情報取得

SP(Service Principal)の名前からSPの認証情報を取得します。ACRに対してPull権限のみが必要な場合は acrpull を設定し、IDとパスワードを取得します。両方ともGUID形式です。

$ az ad sp create-for-rbac \
  --name ${SP_NAME} \
  --role acrpull \
  --scopes ${ACR_REGISTRY_ID} \
  --query '{id: appId, password:password}' \
 --output yaml

id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
password: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

RBACのロールとして指定できるものは、こちらに記載があります。

docs.microsoft.com

Minikubeに認証情報の登録

認証情報はdefaultアカウントのImagePullSecretsに登録されます。

今回は、作業前は何も無い(none)です。

$ kubectl describe serviceaccounts default
Name:                default
Namespace:           default
#- 省略
Image pull secrets:  <none>
#- 省略

registry-cred のAddonを利用します。まずは以下のようにACRの認証情報を登録します。

$ minikube addons configure registry-creds

Do you want to enable AWS Elastic Container Registry? [y/n]: n

Do you want to enable Google Container Registry? [y/n]: n

Do you want to enable Docker Registry? [y/n]: n

Do you want to enable Azure Container Registry? [y/n]: y
-- Enter Azure Container Registry (ACR) URL: yomon8.azurecr.io
-- Enter client ID (service principal ID) to access ACR: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-- Enter service principal password to access Azure Container Registry: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
✅  registry-creds was successfully configured

registry-creds をenableとするとpodが起動します。

$ minikube addons enable registry-creds

以下のようにPod情報取得してログを確認することもできます。

$ kubectl get pods --namespace kube-system   | grep registry-creds
registry-creds-6cc44679-4drd2   1/1     Running   0          84s
$ kubectl logs -f --namespace kube-system registry-creds-6cc44679-4drd2

少し待つと以下のようにImage pull secretに認証情報が登録されます。

$ kubectl describe serviceaccounts default
Name:                default
Namespace:           default
#- 省略
Image pull secrets:  gcr-secret
                     awsecr-cred
                     dpr-secret
                     acr-secret
#- 省略

これでACRに認証通しながらイメージを取得できるようになります。

その他

認証情報を更新する

minikubeは開発環境として使っていることが多いと思うので、以下のようにやり直す方法が良いかもしれません。

# Pod停止
$ minikube addons disable registry-creds

# 認証情報削除
$ kubectl delete secret acr-secret
secret "acr-secret" deleted

# 新認証情報設定
$ minikube addons configure registry-creds

# Podを起動して新認証情報登録
$ minikube addons enable registry-creds

# 登録待ち
$ watch -n3 kubectl get secret acr-secret
NAME         TYPE                             DATA   AGE
acr-secret   kubernetes.io/dockerconfigjson   1      17s

Dockerでログインしてみる

上手くいかない場合、認証情報が合っているかを確認するにはDockerでログインしてみるのも良いかもしれません。

$ docker login ${ACR_NAME}.azurecr.io --username xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  --password yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
Login Succeeded

設定の確認

設定情報が正しく入力できているかは、registry-creds-acrというsecretを見るとわかります。実態はこのregistry-creds-acrの内容からacr-secretが生成されるようです。

$ kubectl --namespace=kube-system get secret registry-creds-acr -o yaml
apiVersion: v1
data:
  ACR_CLIENT_ID: base64-encoded-value
  ACR_PASSWORD: base64-encoded-value
  ACR_URL: base64-encoded-value
kind: Secret
metadata:
  creationTimestamp: "2020-03-11T02:31:40Z"
  labels:
    app: registry-creds
    cloud: acr
    kubernetes.io/minikube-addons: registry-creds
  name: registry-creds-acr
  namespace: kube-system
  resourceVersion: "28800"
  selfLink: /api/v1/namespaces/kube-system/secrets/registry-creds-acr
  uid: 353fdaa4-348a-4df2-ab6e-e6299412a4af
type: Opaque

参考URL

minikube.sigs.k8s.io

docs.microsoft.com