Closed5

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

not75743not75743

クレデンシャルが無いと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
not75743not75743

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

not75743not75743

ローテーション対応を用意

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
not75743not75743

ローカルで検証する分には

  • secret-managerにアクセス
    • external-secretが利用
  • ecrへアクセス
    • argocd/argocd-image-updaterが利用

するための権限を用意しておけばいいかな
基本的にargo系がこの権限持っておけばなんとかなるはず

このスクラップは2025/02/08にクローズされました