이 주제에서는 Container Registry(GCR)와 같은 비공개 컨테이너 이미지 저장소와 함께 GKE on AWS를 사용하는 방법을 설명합니다.
시작하기 전에
GKE on AWS를 사용하기 전에 다음 작업을 수행했는지 확인합니다.
- 기본 요건을 완료합니다.
- 관리 서비스를 설치합니다.
- 사용자 클러스터를 만듭니다.
anthos-aws
디렉터리에서anthos-gke
를 사용하여 컨텍스트를 사용자 클러스터로 전환합니다.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
CLUSTER_NAME을 사용자 클러스터 이름으로 바꿉니다.- Docker 이미지를 빌드하여 Container Registry로 푸시합니다. 이 주제의 예시에서는 Google Cloud 기반 GKE 문서의 컨테이너식 애플리케이션 배포 단계를 따라 빌드된
hello-app
컨테이너를 사용합니다.
비공개 Container Registry
컨테이너 레지스트리는 컨테이너 이미지를 저장하고 배포합니다. GKE on AWS 설치는 기본적으로 공개 이미지에 액세스할 수 있습니다.
Container Registry에서 이미지 확인
이 단계의 나머지 부분을 완료하려면 컨테이너 이미지가 필요합니다. 다음 단계를 수행하여 컨테이너 이미지 이름을 가져옵니다.
Google Cloud CLI를 사용하여 Container Registry에 인증하도록 Docker 명령줄 도구를 구성합니다.
gcloud auth configure-docker
Google Cloud CLI는 Google에서 지원하는 모든 Docker 레지스트리에 사용자 인증 정보 도우미를 등록합니다.
docker images
를 사용하여 Container Registry에 이미지가 포함되어 있는지 확인합니다.docker images
Docker는 Container Registry에 연결하고 Container Registry 저장소에서 사용할 수 있는 이미지를 반환합니다. 예를 들어 아래 응답은 project-id 저장소에 있는
hello-app
라는 컨테이너 이미지를 보여줍니다.REPOSITORY TAG IMAGE ID CREATED SIZE gcr.io/project-id/hello-app v1 732f02cea7cb 12 minutes ago 11.5MB
아직 컨테이너 이미지가 준비되어 있지 않으면 컨테이너화된 애플리케이션 배포의 단계를 수행하여 컨테이너 이미지를 만듭니다.
서비스 계정 만들기
사용자 클러스터는 ID 및 액세스 관리(IAM) 서비스 계정을 사용하여 인증합니다.
새 서비스 계정을 만들려면 다음 단계를 따르세요.
Google Cloud CLI를 사용하여 IAM 서비스 계정을 만듭니다.
gcloud iam service-accounts create account-name
account-name을 새 Google Cloud 서비스 계정 이름으로 바꿉니다.
서비스 계정에 Container Registry에 대한 액세스 권한을 부여합니다.
gcloud projects add-iam-policy-binding project-id \ --member serviceAccount:account-name@project-id.iam.gserviceaccount.com \ --role roles/storage.objectViewer
다음을 바꿉니다.
- project-id를 Google Cloud 프로젝트로 바꿉니다.
- account-name을 Google Cloud 서비스 계정 이름으로 바꿉니다.
계정의 서비스 계정 키를 다운로드합니다.
gcloud iam service-accounts keys create key.json \ --iam-account account-name@project-id.iam.gserviceaccount.com
다음을 바꿉니다.
- project-id를 Google Cloud 프로젝트로 바꿉니다.
- account-name을 Google Cloud 서비스 계정 이름으로 바꿉니다.
이제 Container Registry에 연결하도록 사용자 클러스터를 구성할 준비가 되었습니다.
Kubernetes 보안 비밀 정의
Container Registry에 인증할 키를 제공하려면 다음 단계를 수행하여 서비스 계정 키를 Kubernetes 보안 비밀로 저장합니다.
kubectl
을 사용하여 보안 비밀을 만듭니다.env HTTPS_PROXY=http://localhost:8118 \ kubectl create secret docker-registry gcr-secret \ --docker-server=gcr.io \ --docker-username=_json_key \ --docker-email=account-name@project-id.iam.gserviceaccount.com \ --docker-password="$(cat key.json)"
다음을 바꿉니다.
- project-id를 Google Cloud 프로젝트로 바꿉니다.
- account-name을 Google Cloud 서비스 계정 이름으로 바꿉니다.
서비스 계정 키의 로컬 복사본을 삭제합니다.
rm key.json
이제 워크로드에서 이 보안 비밀을 참조할 수 있습니다.
비공개 이미지로 워크로드 만들기
워크로드에 비공개 컨테이너 저장소의 이미지를 사용하려면 spec.imagePullSecrets
필드를 보안 비밀 이름으로 설정합니다. 이 필드는 pod 및 배포에서 서로 위치가 다릅니다.
pod 만들기
Container Registry에 액세스할 수 있는 pod를 만들려면 spec.imagePullSecrets
필드를 보안 비밀 이름으로 설정합니다.
spec.imagePullSecrets
를 지정하는 pod를 만듭니다.apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: - name: container-name image: gcr.io/project-id/hello-app:v1 imagePullSecrets: - name: secret-name
다음을 바꿉니다.
- pod-name을 pod 이름으로 바꿉니다.
- container-name을 pod에 있는 컨테이너의 이름으로 바꿉니다.
- project-id를 Google Cloud 프로젝트로 바꿉니다.
- secret-name을 레지스트리 보안 비밀 이름으로 바꿉니다.
예를 들어
hello-app
이미지를 가져오려면 다음 YAML을hello-pod.yaml
파일에 복사합니다.apiVersion: v1 kind: Pod metadata: name: hello-pod spec: containers: - name: hello-container image: gcr.io/project-id/hello-app:v1 imagePullSecrets: - name: gcr-secret
kubectl
을 사용하여 구성을 클러스터에 적용합니다.env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f hello-pod.yaml
kubectl get
를 사용하여 pod가 실행되고 있는지 확인합니다.env HTTPS_PROXY=http://localhost:8118 \ kubectl get pod/hello-pod
응답에
Running
상태의 pod 한 개가 포함됩니다.NAME READY STATUS RESTARTS AGE hello-pod 1/1 Running 0 15s
배포 만들기
배포에서 비공개 저장소를 사용하려면 템플릿 내에
imagePullSecret
을 지정합니다.예를 들어
hello-app
이미지의 배포를 만들려면 다음 콘텐츠로hello-deployment.yaml
이라는 파일을 만듭니다.apiVersion: apps/v1 kind: Deployment metadata: name: hello-app-deployment spec: selector: matchLabels: app: products department: sales replicas: 3 template: metadata: labels: app: products department: sales spec: containers: - name: hello image: "gcr.io/project-id/hello-app:v1" env: - name: "PORT" value: "50001" imagePullSecrets: - name: gcr-secret
kubectl
을 사용하여 구성을 클러스터에 적용합니다.env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f hello-deployment.yaml
kubectl pods
를 사용하여 배포가 실행 중인지 확인합니다.env HTTPS_PROXY=http://localhost:8118 \ kubectl get pods --selector=app=products
출력에는
Running
pod 세 개가 포함됩니다.NAME READY STATUS RESTARTS AGE hello-app-deployment-67d9c6d98c-b69f2 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-d6k5c 1/1 Running 0 14m hello-app-deployment-67d9c6d98c-p2md5 1/1 Running 0 14m