본문 바로가기
k8s

[TIL] regcred 알아보기

by marble25 2023. 4. 24.

쿠버네티스를 실제 운용할 때, 쿠버네티스 pod의 이미지를 레지스트리에서 받아와야 하는 경우가 많다.

이런 경우 docker hub 등 public registry에서도 이미지를 가져올 수 있지만, ecr 등의 private registry에서 이미지를 받아오는 경우도 많다.

이미지를 받아올 secret을 생성하고, 주기적으로 갱신하는 작업을 정리해 보았다.

https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/

시크릿 생성하기

쿠버네티스 클러스터는 프라이빗 이미지를 받아올 때, 컨테이너 레지스트리에 인증하기 위하여 kubernetes.io/dockerconfigjson 타입의 시크릿을 사용한다.

만약 이미 docker login 을 수행하였다면, 이 때 생성된 자격 증명을 쿠버네티스 클러스터로 복사할 수 있다.

apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

시크릿을 사용하는 파드 생성하기

apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
  -name: private-reg-container
image: <your-private-image>
imagePullSecrets:
  -name: regcred

imagePullSecrets에 방금 생성했던 regcred를 넣어주면 된다.

ECR Credential 업데이트

Amazon ecr을 사용한다면 ecr credential을 이용해 인증했던 regcred가 12시간마다 만료되게 된다.

그렇기 때문에 docker login을 주기적으로 시도해서 만료된 regcred를 갱신해야 한다.

---
apiVersion: v1
kind: Secret
metadata:
  name: ecr-credential-secret
type: Opaque
data:
  AWS_ACCESS_KEY_ID: xxx
  AWS_ACCOUNT: xxx
  AWS_DEFAULT_REGION: xxx
  AWS_SECRET_ACCESS_KEY: xxx
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ecr-credential-sa
  labels:
    app: ecr-credential-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ecr-credential-role
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ecr-credential-role-to-sa
subjects:
  - kind: ServiceAccount
    name: ecr-credential-sa
roleRef:
  kind: Role
  name: ecr-credential-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: ecr-credential-refresher
spec:
  schedule: "0 */8 * * *"
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      backoffLimit: 4
      template:
        spec:
          serviceAccountName: ecr-credential-sa
          terminationGracePeriodSeconds: 0
          restartPolicy: Never
          containers:
            - name: ecr-credential-refresher
              imagePullPolicy: IfNotPresent
              image: amazon/aws-cli:2.1.2
              envFrom:
                - secretRef:
                    name: ecr-credential-secret
              command:
                - "/bin/sh"
                - "-c"
                - |
                  curl -LO "<https://dl.k8s.io/release/$>(curl -L -s <https://dl.k8s.io/release/stable.txt>)/bin/linux/amd64/kubectl" && install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
                  DOCKER_REGISTRY_SERVER=https://$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
                  DOCKER_USER=AWS
                  DOCKER_PASSWORD=`aws ecr get-login-password --region $AWS_DEFAULT_REGION | cut -d' ' -f6`
                  kubectl delete secret regcred --ignore-not-found=true || true
                  kubectl create secret docker-registry regcred \\
                  --docker-server=$DOCKER_REGISTRY_SERVER \\
                  --docker-username=$DOCKER_USER \\
                  --docker-password=$DOCKER_PASSWORD \\
                  --docker-email=no@email.local

이 코드의 ecr-credential-secret 부분에 자신의 aws 계정 정보를 넣으면 된다.

  1. ecr을 refreshing하는 service account와 role, rolebinding을 만들어준다.
  2. cronjob이 8시간마다 실행되어 ecr login을 시도한다. 기존에 만들어져 있던 regcred를 삭제하고, 새로 받아온 password로 만들어준다. 이 작업을 위해 secret에 대한 권한이 있는 role이 필요한 것이다.

'k8s' 카테고리의 다른 글

K8S role 파헤치기  (0) 2023.09.10
K8S에서 private docker registry 띄우기  (0) 2023.04.25
K8S 컴포넌트 정리  (0) 2023.03.31
Kubernetes에서 NAS 사용하기  (0) 2023.03.26
Kubernetes 스토리지 구조  (0) 2023.03.26