Closed5
k3dクラスタでECRのイメージを使う

クレデンシャルが無いとECRイメージを引っ張ってくることができない
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: xxx.dkr.ecr.xxx.amazonaws.com/test-nginx:latest
ports:
- containerPort: 80
describeで見ると
pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials

pullするためのsecretを追加
こんな感じ
kubectl create secret docker-registry ecr-secret -n default \
--docker-server=<ecr repo> \
--docker-username=AWS \
--docker-password=$(aws ecr get-login-password --region <region>)
でできたsecretを
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: xxx.dkr.ecr.xxx.amazonaws.com/test-nginx:latest
ports:
- containerPort: 80
+ imagePullSecrets:
+ - name: ecr-secret
でOK

ローテーション対応の方針
ECRのシークレットは12時間で切れるため、そのタイミングで再作成が必要
ExternalSecretを入れれば自動化できそうだが、手間なのでcronjobで対応したい
参考

ローテーション対応を用意
aws用secret作成
cronjobがecrにアクセスするためのクレデンシャルをsecretに
.cred.txt
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_ACCOUNT_ID=
kubectl create secret ecr-helper-secret --from-env-file .cred.txt
cronjobを作成
secretをcreateするためのk8s権限周りも一緒に用意
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: ecr-helper-sa
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ecr-helper-cr
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "updated", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ecr-helper-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ecr-helper-cr
subjects:
- kind: ServiceAccount
name: ecr-helper-sa
namespace: default
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: ecr-helper
namespace: default
spec:
schedule: "* */6 * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
serviceAccount: ecr-helper-sa
containers:
- name: ecr-helper
image: heyvaldemar/aws-kubectl:latest
imagePullPolicy: IfNotPresent
env:
- name: SECRET_NAME
value: ecr-secret
envFrom:
- secretRef:
name: ecr-helper-secret
command:
- /bin/sh
- -c
- |-
kubectl delete secret --ignore-not-found ${SECRET_NAME} -n default
kubectl create secret docker-registry ${SECRET_NAME} -n default \
--docker-server=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com \
--docker-username=AWS \
--docker-password=$(aws ecr get-login-password --region ${AWS_DEFAULT_REGION})
動作確認
jobを手動実行する
k create job ecr-helper-job --from=cronjob/ecr-helper

ローカルで検証する分には
- secret-managerにアクセス
- external-secretが利用
- ecrへアクセス
- argocd/argocd-image-updaterが利用
するための権限を用意しておけばいいかな
基本的にargo系がこの権限持っておけばなんとかなるはず
このスクラップは2025/02/08にクローズされました