プライベートレジストリのイメージを実行する手順を確認したメモ。
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時間なので、ローテーションが必要になる。