백엔드 crud만 배포 (연습)
Cloud Build로 앱 컨테이너화
→ Artifact Registry에 컨테이너를 저장 → 레지스트리에서 이를 클러스터에 배포
클러스터와 동일한 리전에
hello-repo
저장소 제작gcloud artifacts repositories create hello-repo \\ --project=PROJECT_ID \\ --repository-format=docker \\ --location=us-central1 \\ --description="Docker repository"
컨테이너 이미지를 빌드 (
docker build
및docker push
를 실행하는 것과 유사)→ Dockerfile 로 이미지 만들기 (⚠️빌드시 캐시 주의)
gcloud builds submit \\ --tag us-central1-docker.pkg.dev/cloud-club-slackbot/slackbot/crud . gcloud builds submit \\ --tag us-central1-docker.pkg.dev/cloud-club-slackbot3/slackbot/slackbotapi . gcloud builds submit \\ --tag us-central1-docker.pkg.dev/cloud-club-slackbot/slackbot/front .
오류
→ 빌드해서 .jar 파일 제작할때 java 버전 안 맞는다고 오류
→ 버전이 뒤죽박죽 느낌
원인
→ gradlew 파일을 열어보니 JAVA_HOME 을 기준으로 처리 (
cat gradlew |grep JAVA
)해결
→
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
: JAVA HOME 변경
GKE 클러스터 만들기
→ 단일 GKE 클러스터처럼 작동하는 관리형 Compute Engine 가상 머신 모음
클러스터 제작
gcloud container clusters create-auto helloworld-gke \\ --region us-central1
액세스 확인 (클러스터에 액세스 할 수 있음을 나타내는 클러스터의 노드 나열)
kubectl get nodes
- GKE 클러스터에 앱을 배포하려면 두 개의 Kubernetes 객체가 필요
앱 배포
웹 요청을 처리하는 프런트엔드 서버 존재
deployment.yaml
새 파일에서 프런트엔드를 실행하는 데 필요한 클러스터 리소스를 정의apiVersion: apps/v1 kind: Deployment metadata: name: crud spec: replicas: 1 selector: matchLabels: app: crud template: metadata: labels: app: crud spec: containers: - name: crud # Replace $LOCATION with your Artifact Registry location (e.g., us-west1). # Replace $GCLOUD_PROJECT with your project ID. image: us-central1-docker.pkg.dev/cloud-club-slackbot2/slackbot/crud:latest # This app listens on port 8080 for web traffic by default. ports: - containerPort: 8080 --- 백엔드 apiVersion: apps/v1 kind: Deployment metadata: name: slackbot spec: replicas: 1 selector: matchLabels: app: slackbot-front template: metadata: labels: app: slackbot-front spec: containers: - name: slackbot-front # Replace $LOCATION with your Artifact Registry location (e.g., us-west1). # Replace $GCLOUD_PROJECT with your project ID. image: us-central1-docker.pkg.dev/cloud-club-slackbot2/slackbot/front:latest # This app listens on port 8080 for web traffic by default. ports: - containerPort: 3000 env: - name: PORT value: "3000" --- 프론트
배포를 통해
ReplicaSet
와 관련 포드를 만들고 업데이트kubectl apply -f deployment.yaml
서비스 배포
서비스 포드 집합에 대한 단일 액세스 포인트를 제공
단일 포드에 액세스할 수 있지만 포드 수명이 짧으므로 “서비스 주소”를 사용해야 포드에 안정적으로 액세스할 수 있음
service.yaml
파일에서 정의apiVersion: v1 kind: Service metadata: name: crud spec: type: LoadBalancer selector: app: crud ports: - port: 80 targetPort: 8080 --- 백엔드 apiVersion: v1 kind: Service metadata: name: slackbot spec: type: LoadBalancer selector: app: slackbot-front ports: - port: 80 targetPort: 3000 --- 프론트
서비스 제작
kubectl apply -f service.yaml
서비스 외부의 IP 주소 가지고 옴
kubectl get services
빠른 시작: 컨테이너 이미지의 앱을 GKE 클러스터에 배포 | Google Kubernetes Engine(GKE) | Google Cloud
→ 로컬에서는 작동했지만 GKE의 Cloud Build (Google Cloud에서 빌드된다는 점을 제외하고 docker build
및 docker push
) 못 찾는다…
해결
→ .gitignore 에 영향을 받는 것으로 보임 : 지우니까 해결
→ 역시 로컬에서는 클라우드에 떠 있는 mysql 접속까지 확인을 하였지만 백엔드를 클라우드에 올리면서 연결을 하지 못함
해결
→ mysql를 쿠버네티스에 올릴때 name을 mysql로 올려서 잡지 못한 것을 보임 : mysql의 name을 변경