< Lab >
Connect an App to a Cloud SQL for PostgreSQL Instance
PostgreSQL 인스턴스용 Cloud SQL에 앱 연결
- Cloud Shell 활성화
- 클라우드 셸을 열고 PROJECT_ID 설정 확인
- 활성 계정 이름 나열
gcloud auth list
- 프로젝트 ID 나열
gcloud config list project
- API 초기화 및 Cloud IAM 서비스 계정 생성
- API 활성화 :
이후 작업에서 컨테이너를 빌드하고 Artifact Registry에 푸시하기 위해 먼저 클라우드 셸에서 Artifact Registry API를 활성화
gcloud services enable artifactregistry.googleapis.com
- Cloud SQL용 서비스 계정 만들기 :
나중에 배포할 애플리케이션에 대한 IAM 서비스 계정 자격 증명을 구성해야 하며
서비스 계정은 Cloud SQL 데이터베이스를 만들고 액세스할 수 있는 역할에 바인딩되어야 함
서비스 계정을 만들고 랩 프로젝트의 Cloud SQL 관리자 역할에 바인딩
키를 만들고 로컬 파일로 내보냄export PROJECT_ID=$(gcloud config list --format 'value(core.project)') export CLOUDSQL_SERVICE_ACCOUNT=cloudsql-service-account gcloud iam service-accounts create $CLOUDSQL_SERVICE_ACCOUNT --project=$PROJECT_ID gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CLOUDSQL_SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/cloudsql.admin"
클라우드 셸 세션의 홈 폴더에 저장된 것 확인gcloud iam service-accounts keys create $CLOUDSQL_SERVICE_ACCOUNT.json \ --iam-account=$CLOUDSQL_SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \ --project=$PROJECT_ID
- 경량 GKE 애플리케이션 배포
- Kubernetes 클러스터 만들기 :
클라우드 셸에서 실행
ZONE=us-central1-a gcloud container clusters create postgres-cluster \ --zone=$ZONE --num-nodes=2
- 데이터베이스 액세스를 위한 Kubernetes 시크릿 생성 :
Cloud SQL 인스턴스 및 데이터베이스에 연결하는 데 필요한 자격 증명이 포함된 Kubernetes 보안 비밀 쌍 생성
kubectl create secret generic cloudsql-instance-credentials \ --from-file=credentials.json=$CLOUDSQL_SERVICE_ACCOUNT.json kubectl create secret generic cloudsql-db-credentials \ --from-literal=username=postgres \ --from-literal=password=supersecret! \ --from-literal=dbname=gmemegen_db
- GKE 애플리케이션 컨테이너 다운로드 및 빌드 :
gMemegen 애플리케이션을 GKE 클러스터에 배포하려면 먼저 컨테이너를 빌드하고 저장소에 푸시
클라우드 셸에 제공된 애플리케이션을 다운로드하고 생성된 폴더로 변경
지역, 프로젝트 ID 및 Artifact Registry 저장소에 대한 환경 변수 생성gsutil -m cp -r gs://cloud-training/gsp919/gmemegen . cd gmemegen
Artifact Registry에 대한 Docker 인증을 구성export REGION=us-central1 export PROJECT_ID=$(gcloud config list --format 'value(core.project)') export REPO=gmemegen
Artifact Registry 저장소를 작성gcloud auth configure-docker ${REGION}-docker.pkg.dev
로컬 도커 이미지를 빌드gcloud artifacts repositories create $REPO \ --repository-format=docker --location=$REGION
docker build -t ${REGION}-docker.pkg.dev/${PROJECT_ID}/gmemegen/gmemegen-app:v1 .
Artifact Registry에 이미지를 푸시
docker push ${REGION}-docker.pkg.dev/${PROJECT_ID}/gmemegen/gmemegen-app:v1
- GKE 애플리케이션 구성 및 배포 :
Open Editor를 클릭한 후 탐색기에서 gmemegen_deployment.yaml 파일을 편집 후 저장
apiVersion: apps/v1 kind: Deployment metadata: name: gmemegen labels: app: gmemegen spec: selector: matchLabels: app: gmemegen template: metadata: labels: app: gmemegen spec: # This section describes the containers that make up the deployment containers: - name: gmemegen image: us-central1-docker.pkg.dev/qwiklabs-gcp-04-57ebd57a41ae/gmemegen/gmemegen-app:v1 imagePullPolicy: Always ports: - containerPort: 8080 # Set env variables used for Postgres Connection env: - name: DB_USER valueFrom: secretKeyRef: name: cloudsql-db-credentials key: username - name: DB_PASS valueFrom: secretKeyRef: name: cloudsql-db-credentials key: password - name: DB_NAME valueFrom: secretKeyRef: name: cloudsql-db-credentials key: dbname # Change <INSTANCE_CONNECTION_NAME> here to include your GCP # project, the region of your Cloud SQL instance and the name # of your Cloud SQL instance. The format is $PROJECT:$REGION:$INSTANCE - name: cloudsql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.16 command: ["/cloud_sql_proxy", "-instances=qwiklabs-gcp-04-57ebd57a41ae:us-central1:postgres-gmemegen=tcp:5432", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: my-secrets-volume mountPath: /secrets/cloudsql readOnly: true volumes: - name: my-secrets-volume secret: secretName: cloudsql-instance-credentials
Open Terminal을 클릭 후 애플리케이션 배포
배포가 성공했는지 확인kubectl create -f gmemegen_deployment.yaml
kubectl get pods
- GKE 애플리케이션을 외부 부하 분산기에 연결
- 클라우드 셸에 부하 분산기 생성
kubectl expose deployment gmemegen \ --type "LoadBalancer" \ --port 80 --target-port 8080
- 응용 프로그램을 테스트하여 일부 데이터 생성 :
LoadBalancer Ingress에서 외부 IP 주소 속성 복사
kubectl describe service gmemegen
브라우저에 로그 밸런서의 수신 IP 주소로 이동하기 위해 이를 입력하고 클릭해 gMemegen 애플리케이션 실행 확인
export LOAD_BALANCER_IP=$(kubectl get svc gmemegen \ -o=jsonpath='{.status.loadBalancer.ingress[0].ip}' -n default) echo gMemegen Load Balancer Ingress IP: http://34.70.190.10
홈 페이지에서 게시된 이미지와 텍스트를 입력하여 새로운 밈을 생성
기존 밈을 보려면 Randow 클릭클라우드 셸에서 애플리케이션의 활동을 확인
gmemegen 컨테이너에서 로그를 쿼리하고 실행될 때 stderr에 기록되는 SQL 문을 포함하여 포드에서 애플리케이션 활동 표시
POD_NAME=$(kubectl get pods --output=json | jq -r ".items[0].metadata.name") kubectl logs $POD_NAME gmemegen | grep "INFO"
- 데이터베이스에 대한 애플리케이션의 전체 읽기/쓰기 기능 확인
- 데이터베이스에 연결하고 애플리케이션 테이블 쿼리 :
콘솔에서 SQL - postgres-gmemgen 인스턴스 선택 - Overview에서 클라우드 셸로 연결 후 supersecret! 암호 입력
postgres 프롬프트에 연결되면 gmemegen_db 데이터베이스를 선택한 후 전체를 출력해 각 밈에 대한 행 출력 확인
\c gmemegen_db select * from meme;