실제 작성한 매니페스트 파일이 쿠버네티스 상에서 잘 동작하는지 알아보기 위해 GKE를 사용해보았다.
GKE란 Google Kubernetes Engine으로, GCP(Google Cloud Platform)에서 제공하는 관리형 Kubernetes 서비스이다. 클러스터 관리 및 애플리케이션 배포를 쉽게 할 수 있게 해준다.

테스트 용이기 때문에 기본값으로 생성하였다.
클러스터 기본사항
- 이름: k8s
- 영역: asia-northease3-a
- 출시 채널
- 출시 채널: 채널 없음
- 버전: 기본값
노드 설정 구성
- 이미지 유형: containerd를 포함한 Ubuntu
- 머신 구성: 범용/N1
- 머신 유형
- 코어: 1
- 메모리: 1
- 부팅 디스크 크기: 10
다음과 같이 클러스터 생성되었다. 노드 수가 3으로 설정되어 있어, VM 인스턴스를 확인해 보면 3개의 인스턴스가 생성된 것을 볼 수 있다. 각 노드는 클러스터 내에서 작업을 수행하는 독립적인 컴퓨팅 자원인 것을 알 수 있다.


kubectl 설정
PC에서 클러스터에 연결하기 위해 명령어을 넣으면 kubectl이 없다는 오류가 발생한다. 아래 링크로 들어가 운영환경에 맞게 설치하면 된다.https://kubernetes.io/ko/docs/tasks/tools/


cmd 창에 명령줄 액세스 부분을 실행하면 클러스터에 연결할 수 있다.
kubectl config get-contexts // GKE K8s 클러스터의 컨텍스트 확인
kubectl get node // 노드 목록 보기
이번 프로젝트에서는 Secret, ConfigMap, Deployment, Service 오브젝트를 정의하는 매니페스트 파일을 만들었다.
매니페스트 파일을 각각 분리하여 사용할 수도 있지만, '---' 을 사용하여 하나의 파일에 여러 오브젝트를 정의할 수도 있다. 실제 만든 서비스가 잘 동작하는지 테스트하는 용도이기 때문에 하나로 합쳐서 진행해볼 것이다.
combined-manifest.yaml
#secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
DATABASE_USERNAME: <base64로_인코딩된_값>
DATABASE_PASSWORD: <base64로_인코딩된_값>
---
#configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
DATABASE_URL: <값>
---
# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: <dockerhub-username>/my-app
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: notice-config
key: DATABASE_URL
- name: DATABASE_USERNAME
valueFrom:
secretKeyRef:
name: notice-secret
key: DATABASE_USERNAME
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: notice-secret
key: DATABASE_PASSWORD
---
# service
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
매니페스트 파일이 있는 경로로 가서 아래 명령어를 입력한다.
kubectl apply -f <매니페스트_파일_이름>
kubectl apply -f combined-manifest.yaml
이때 오류가 발생했는데, 이는 docker hub 리포지토리를 private으로 설정해두었기 때문이었다. private으로 두면 여러 설정 작업이 필요하여 public으로 변경하였다. 환경 변수를 .env 파일로 관리하고 있기 때문에, public으로 변경할 수 있었다.
오류가 발생한다면, kubectl describe 또는 kubectl logs 를 통해 확인할 수 있다.
매니페스트 파일에서 배포한 리소스 삭제
매니페스트 파일에서 배포한 리소스를 삭제하고 싶다면 아래 명령어를 사용할 수 있다.kubectl delete -f <매니페스트_파일_이름>
# 전체 확인
kubectl get all
# 파드 상태 확인
kubectl get po
# 서비스 상태 확인
kubectl get svc

💡사용하지 않는 리소스는 과금방지를 위해 꼭 삭제하자!