나이는 지구가 태양을 도는 횟수일 뿐이다.
GKE에서 ECR 이미지 사용하기 본문
GKE에서 ECR이미지를 사용해보려고한다.
- ECR은 12시간 이후 암호가 만료된다고한다.
- imagepullsecret에서 사용할 비밀을 12시간마다 업데이트 해야한다.
- 쿠버네티스 자체에대한 이해도를 높이기위해 이미지도 직접 만들어볼것이다.\
- 참조한 블로그입니다.
https://skryvets.com/blog/2021/03/15/kubernetes-pull-image-from-private-ecr-registry/
직접 컨테이너 이미지를 만들어보자.
- 서비스어카운트 를 만들고 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"]
- Dockerfile에서 언급되는 createfiles.sh 이며 해당내용은 kubernetes에서 serviceaccount의 정보가 마운트되는 공식문서를 참고하여 만들었다.
https://kubernetes.io/docs/tasks/run-application/access-api-from-pod/#without-using-a-proxy
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에서 좀더 알게된것같은 유의미한 시간이었다.
글 읽어주셔서 감사합니다.
'IT' 카테고리의 다른 글
[K8spacket] 쿠버네티스 패킷 트래픽 시각화 (0) | 2023.04.04 |
---|---|
[Helm]Subchart에 오픈소스 chart 추가하기 (0) | 2023.03.22 |
AWX로 앤서블 사용하기 (0) | 2023.01.30 |
K8s 모니터링 하기 [prometheus,grafana] (0) | 2023.01.16 |
ArgoCD 설치 (4) | 2023.01.16 |