내 프로젝트에서 FE가 필요없고 BE와 DB만 있으면 되기 때문에 이에 대한 kubernetes 환경을 구축하고자 한다.
1. GKE 클러스터 생성
공부하는 게 목적이니까, 표준으로 일단 해보자.
기본 사항에선 딱히 건들 게 없고, 수정할 거라면 default-pool - 노드 - 머신 계열 정도만 골라주면 될 것이다.그러면 클러스터 하나가 생성된다.
VM instance 목록에 들어가 보면 3개의 vm이(노드들) 생성되어 있다.
이후 우상단의 gcloud shell을 실행시킨다. 나는 지금 활성화되어 있어서 꺼져 있다.
https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl?hl=ko
그러면 master node로 접속되는 상황, 그러나 kubernetes 명령어인
kubectl get node
를 치면 실행이 안되었다고 한다. 이렇게 나오는 이유는 gcloud는 단순히 사용자 정보를 이용해서 gcloud shell을 활성화 시켰을 뿐 어떤 cluster를 사용할지 결정하지 않았기 떄문이다. 위 링크를 참조해서 어떤 cluster를 사용할지 만들자.
gcloud container clusters get-credentials {cluster-name}
나의 경우 cluster 이름이 "cluster-1"이므로 이대로 설정해 주고 kubectl get node를 입력하면 node 개수가 출력된다.
2. Spring 예제 배포
원래는, gcloud shell을 vs code로 열고 싶었는데 그게 잘 되지 않았다. 그래서 local에서 git push하고, gcloud에서 pull하는 방식을 채택했다.
"GCP build server 구성 - GCP + Docker + Jenkins + Gitlab + JUnit + SonarQube + GCR image push"
포스팅에서 gcr에 image push를 했다. 그 image 이름은 gcr.io/numeric-replica-320807/testspring이었는다. 이 gcr을 가져올 것이다.(현재 내 계정은 owner이기 때문에 가능하다. 그렇지 않다면 추가 설정을 해 주어야 한다.)
아래 yml 파일은 예제 spring 파일의 deploy, service 내용이다.
/home/hyelie/spring.yml
apiVersion: apps/v1
kind: Deployment
metadata: # deployment의 metadata
name: hello-spring
spec: # deployment의 spec
replicas: 4
selector:
matchLabels:
app: spring
tier: backend
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2
maxUnavailable: 2
template: # 다음 줄부터는 각각 pod의 설정
metadata:
labels: # 각 pod들의 metadata
app: spring
tier: backend
spec: # pod의 spec
containers:
- name: echo
image: gcr.io/numeric-replica-320807/testspring
ports: #
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata: # Service의 metadata
name: hello-spring
spec:
type: LoadBalancer
ports:
- port: 8080 # Service가 생성할 Port
targetPort: 8080 # Service가 접근할 pod의 port
selector: # Service가 접근할 pod의 label 조건
app: spring
tier: backend
yml 파일에 여러가지를 배포할 때는 ---를 구분자로 사용한다. 설명은 주석을 달았으니 패스.
gcloud에서
kubectl apply -f spring.yml
을 실행시킨 뒤
kubectl get all
을 입력하면 아래와 같은 결과가 출력된다.
잘 출력되고 있고, service의 external ip가 나와 있다. 이 ip로 접속하면
잘 된다!!!
다음에는 GKE에 mysql을 올리고, secret으로 비밀번호를 숨겨볼 것이다. 그러면 spring application.properties 안에 정보를 잘 주면 build 서버에서도 돌아갈 것이다!
다만 걸리는 것은, db user/pw가 git에 올라가고, 앱 내에 정보로 남게 되는 게 아닐까? 보통 어디까지 해결하는지 궁금하다.
이후로는 spring+mysql을 이용해 구현한 게시판 예제를 kubernetes에 올려볼 예정이다.