imagePullSecretsの使い方

プライベートレジストリのイメージを実行する手順を確認したメモ。

PublicなDockerHubに置いてあるsotoiwa540/flask-sampleをpullしてきてECRにpushする。

docker pull sotoiwa540/flask-sample:latest
aws ecr create-repository --repository-name flask-sample
repo=$(aws ecr describe-repositories --repository-names flask-sample --query 'repositories[0].repositoryUri' --output text)
docker tag sotoiwa540/flask-sample:latest ${repo}:latest
ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
AWS_REGION=$(aws configure get default.region)
aws ecr get-login-password | docker login --username AWS --password-stdin https://${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
docker push ${repo}:latest

EKSで使う場合は、ノードにECRの権限を付与すればよいが、普通のクラスターの場合は認証が必要。権限がないのでエラーになる。

root@cks-master:~# k run flask-sample --image=XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest
pod/flask-sample created
root@cks-master:~# k get pod
NAME           READY   STATUS             RESTARTS   AGE
flask-sample   0/1     ImagePullBackOff   0          11s
root@cks-master:~# k describe pod flask-sample
Name:         flask-sample
(省略)
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  24s                default-scheduler  Successfully assigned default/flask-sample to cks-worker
  Normal   BackOff    21s (x2 over 22s)  kubelet            Back-off pulling image "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest"
  Warning  Failed     21s (x2 over 22s)  kubelet            Error: ImagePullBackOff
  Normal   Pulling    6s (x2 over 23s)   kubelet            Pulling image "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest"
  Warning  Failed     6s (x2 over 22s)   kubelet            Failed to pull image "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/v2/flask-sample/manifests/latest: no basic auth credentials
  Warning  Failed     6s (x2 over 22s)   kubelet            Error: ErrImagePull
root@cks-master:~# k delete pod flask-sample
pod "flask-sample" deleted

imagePullSecretを作成する。先にパスワード(トークン)を確認しておく。

aws ecr get-login-password

Secretを作成する。Namespace毎のリソースであることに注意。

AUTH_TOKEN=hogehoge
REGISTRY=https://XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
AUTH_USER=AWS
kubectl create secret docker-registry ecr-token \
  --docker-server=XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com \
  --docker-username=${AUTH_USER} \
  --docker-password=${AUTH_TOKEN}

PodでimagePullSecretsとしてこのSecretを指定するようなマニフェストを作成する。なお、PodではなくServiceAccountにimagePullSecretsを指定することもできる。

k run flask-sample --image=XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest -o yaml --dry-run=client > flask-sample.yaml
vi flask-sample.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: flask-sample
  name: flask-sample
spec:
  imagePullSecrets:
  - name: ecr-token
  containers:
  - image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/flask-sample:latest
    name: flask-sample
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

このマニフェストであれば起動できる。

root@cks-master:~# k apply -f flask-sample.yaml
pod/flask-sample created
root@cks-master:~# k get pod
NAME           READY   STATUS    RESTARTS   AGE
flask-sample   1/1     Running   0          3s

ただし、ECRのトークンの有効期限は12時間なので、ローテーションが必要になる。

参考リンク