Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

나이는 지구가 태양을 도는 횟수일 뿐이다.

GKE에서 ECR 이미지 사용하기 본문

IT

GKE에서 ECR 이미지 사용하기

카락스의 포톤캐논 2023. 2. 16. 18:10

GKE에서 ECR이미지를 사용해보려고한다.

직접 컨테이너 이미지를 만들어보자.

  • 서비스어카운트 를 만들고 secret을 만들수 있는 권한을줄것이다.
  • 우분투이미지를 베이스로 kubectl , awscli등 패키지를 설치해줄것이다.
  • Bash 파일로 필요한 config 파일등을 만들어줄것이다.
  • 아래는 나의 Dockerfile이다. [정석이 아닐가능성 높다.]
FROM ubuntu:20.04

ENV SANAME \
    SECRET_NAME \
    AWS_ACCESS_KEY_ID \
    AWS_SECRET_ACCESS_KEY \
    AWS_DEFAULT_REGION \
    AWS_ARN_NUMBER \
    AWS_ECR_REGION \
    TARGET_NS \
    TZ=Asia/Seoul

ARG DEBIAN_FRONTEND=noninteractive

RUN apt update && \
    apt install -y ca-certificates curl apt-transport-https awscli

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin

WORKDIR /test/

COPY . .

RUN chmod +x *.sh

CMD ["/bin/bash", "-c", "./createfiles.sh"]
 

Accessing the Kubernetes API from a Pod

This guide demonstrates how to access the Kubernetes API from within a pod. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to run this tutoria

kubernetes.io

#int to the internal API server hostname
APISERVER=https://kubernetes.default.svc

# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# Reference the internal certificate authority (CA)
CACERT=$(cat ${SERVICEACCOUNT}/ca.crt | base64 | tr -d "\n")

mkdir -p /root/.aws/
mkdir -p /root/.kube/

echo "
[default]
aws_access_key_id=${AWS_ACCESS_KEY_ID}
aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}
" > /root/.aws/credentials

echo "
[default]
region=${AWS_DEFAULT_REGION}
output=json
" > /root/.aws/config


echo "
apiVersion: v1
kind: Config
clusters:
- name: test
  cluster:
    certificate-authority-data: ${CACERT}
    server: ${APISERVER}
contexts:
- name: test
  context:
    cluster: test
    namespace: ${NAMESPACE}
    user: ${SANAME}
current-context: test
users:
- name: ${SANAME}
  user:
    token: ${TOKEN}
" > /root/.kube/config

ECR_AUTH=`aws ecr get-login-password --region ${AWS_ECR_REGION}`
kubectl delete secret --ignore-not-found ${SECRET_NAME} --namespace ${TARGET_NS}
kubectl create secret docker-registry ${SECRET_NAME} \
  --docker-server=${AWS_ARN_NUMBER}.dkr.ecr.${AWS_ECR_REGION}.amazonaws.com \
  --docker-username=AWS \
  --docker-password=${ECR_AUTH} \
  --namespace=${TARGET_NS}

echo "Done!"

빌드하자!

  • GKE에서 쓸것이기 때문에 Cloud Build를 사용했다. (깃헙 로그인해주면 금방되서 사용하였다.)
  • GCP registry는 있다고 생각하겠습니다.
  • 저장소 연결을 누르고 github 저장소를 추가해줍니다. ( 로그인만 해도되서 아주 개꿀)
  • 트리거를 만들어주겠습니다.

테스트기 때문에 수동호출을 트리거로 하였다.

  • 트리거 설정까지 완료되었으면 바로 실행으로 빌드를 돌려버리자.

완료우!

Cronjob과 역할 부여하기

  • 크론잡과 서비스 어카운트에 역할을 부여하고 시크릿이 생성되는지 확인하면 될것같다.
  • Manifest 만들기! 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-secret
  namespace: default
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: create-secret
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create", "delete"]
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: create-secret
subjects:
- kind: ServiceAccount
  name: test-secret
  namespace: default
 ---
 apiVersion: batch/v1
kind: CronJob
metadata:
  name: ecr-auth
spec:
  concurrencyPolicy: Replace
  schedule: "0 */12 * * *"
  successfulJobsHistoryLimit: 2
  suspend: false
  timeZone: "Asia/Seoul"
  jobTemplate:
    spec:
      backoffLimit: 2
      template:
        spec:
          serviceAccountName: test-secret   #중요함
          containers:
          - name: create-secret
            image: 이미지가 저장된 레지스트리 주소와 태그
            imagePullPolicy: Always
            env:
            - name: SANAME
              value: "test-secret"            # 서비스 어카운트이름
            - name: SECRET_NAME
              value: "ecr-secret"             # 본인이 배포하고 싶은 비밀 이름
            - name: AWS_ACCESS_KEY_ID
              value: "본인꺼 넣으세요!"       # aws 엑세스키 ID
            - name: AWS_SECRET_ACCESS_KEY
              value: "본인꺼 넣으세요!"       # aws 엑세스키 암호
            - name: AWS_DEFAULT_REGION 
              value: "본인꺼 넣으세요"        # aws configure 하기위해 넣었습니다.
            - name: AWS_ARN_NUMBER
              value: "본인꺼 넣으세요"        # ARN에서 숫자길게 써있는것! (ECR 맨앞 숫자)
            - name: AWS_ECR_REGION
              value: "본인꺼 넣으세요"        # ECR 리전 코드
            - name: TARGET_NS
              value: "test"                   #비밀을 배포할 네임스페이스 
          restartPolicy: Never
  • apply 해주고 비밀이 생성되는지 확인하기. (트리거 돌려버리기)

비밀이 생성되었다.!

ECR에서 이미지를 가져오기

  • ECR에 Private 저장소에 Nginx를 살짝 바꾼 이미지를 넣어두었다.
  • Deployment로 배포하여 imagepulling에 이상이 없는지 확인하였다.
  • Deployment Manifest 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
  namespace: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
      - name: ecr-secret
      containers:
      - name: web
        image: ------.dkr.ecr.ap-northeast-2.amazonaws.com/test-gke-secret:5   # 테스트용 이미지
        imagePullPolicy: Always
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: test-service
  namespace: test
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  • 배포하고 공인ip를 들어가서 확인해보자!!

배포가 잘되었다!
개굳!

  • ECR에서 이미지를 가져오는것을 완료하였습니다.
    완료까지하는데 꼬박 하루걸렸지만 Kubernetes에서 좀더 알게된것같은 유의미한 시간이었다. 
    글 읽어주셔서 감사합니다.

썸네일