본문 바로가기

개발스터디/MSA 스터디 (22년)

[MSA 1.0] (7) Spring Cloud 어플리케이션을 kubernetes로 배포하기

jenkins를 통해 현재 우리가 로컬에서 작성한 코드들을 컨테이너화 할 수 있다.

이번 스터디에서는 로컬에 진행해도 상관 없지만, 조금 더 깊게 MSA 에 대해 알고 싶은 분들이 있을까봐 

적어보도록 한다.

가장 먼저 컨테이너 화를 하면 가장 좋은점이 무엇일까?

  • 비용절감
  • 장애대비
  • 소프트웨어 생산 주기 단축

회사적으로 위와 같이 막대한 장점들이 생산성 즉 돈에 대해 직결되는 문제이기 때문에 사용한다 쳐도 개발자 또는 그냥 집에서 테스트해보는 우리에게 무엇이 장점이 있을까?

개인적으로 서버를 껏다켰다 안해도 된다. eureka서버나 gateway 서버와 같이 변경을 할  필요가 많이 없는 서버들은 특히 그러하다.

그렇다면 도커 컨테이너 와 쿠버네티스 deployment로 관리하는 차이점은 무엇일까?

이 부분은 사실 개발자들에게는 도커 컨테이너로 사용할 경우와 쿠버네티스 컨테이너 이미지로 사용할 경우가 크게 다르지 않은것 같지만 물론 내생각이다.

운영자 차원에서는 많이 다르다. 오토스케일, 셀프 힐링, 네트워킹 , 보안, 모니터링 등등 운영에 필요한 영향 요소들에 대한 막대한 기능들을 쿠버네티스가 제공하기 때문이다.

서두가 길었으니 쿠버네티스에서 컨테이너 이미지를 만드는 과정에 대해 실습을 통해 알아보자.

사실 사전작업이 조금 많다. 젠킨스 서버, harbor 서버 등 를 우선 구성해 두어야 한다. 

그리고 git과 연동도 해야하고 젠킨스 서버와 harbor 서버를 연동도 해야 한다. 하지만 이번에는 그런것을 다루지 않을 것이다.

개발자 입장에서 그정도 까지 알 필요 없다고 생각한다.


 

1. Docker build , push ( Jenkins )

제목이 갑자기 뜬금없이 도커 build와 push다. 이것이 젠킨스를 통해 우리가 하려는 작업이기 때문이다.

컨테이너 이미지를 만들고 이를 컨테이너 이미지 레지스트리에 저장해두고 꺼내 쓰려고 하는 작업이다.

하지만 jenkins 구축과 연동같은 사전작업들은 다 생략하도록 하겠다.

1-0. jenkins git 연동 및 사전작업들은 생략하도록 한다.

1-1. jenkins 파일 작성

https://github.com/themapisto/demo/blob/main/Jenkinsfile

 

GitHub - themapisto/demo

Contribute to themapisto/demo development by creating an account on GitHub.

github.com

node { 
  stage('========== Clone repository ==========') { 
    checkout scm 
} 
 stage('Ready'){  
        sh "echo 'Ready to build'"
        mvnHome = tool 'Maven 3.8.6'
    }

    // mvn 빌드로 jar파일을 생성하는 stage
    stage('Build'){  
        sh "echo 'Build Spring Boot Jar'"
        sh "'${mvnHome}/bin/mvn' clean package"
    }
    stage ('SonarQube analysis'){
        sh "'${mvnHome}/bin/mvn' clean verify sonar:sonar -Dsonar.projectKey=Koo -Dsonar.host.url=http://54.238.193.86:5000 -Dsonar.login=squ_892cd416be91411e1e25b99cf8d1f37ff33af727"
}
  stage('========== Build image ==========') { 
    app = docker.build("tanzu/${env.IMAGE_NAME}") 
} 
  stage('========== Push image ==========') { 
    docker.withRegistry('https://harbor.aikoo.net', 'harbor') { 
      app.push("${env.BUILD_NUMBER}") 
      app.push("latest") 
}
}
}

 

1-2. 파이프라인 작동

 

이렇게 파이프라인이 초록색으로 다 완료가 되면 harbor에 이미지가 저장 될 것이다.

2. Harbor 이미지 확인

 

3. 쿠버네티스 deploy 배포

k8s / deploy.yaml에서 해당 이미지 입력

1056 부분을 jenkins의 파라미터에 입력한 값으로 바꾸거나 latest로 바꾼다.

https://github.com/themapisto/demo/blob/main/k8s/client_deploy.yaml

 

GitHub - themapisto/demo

Contribute to themapisto/demo development by creating an account on GitHub.

github.com

# demo/k8s/client_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: client
  namespace: springboot
  labels:
    app: springboot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
    spec:
      containers:
      - name: springboot
        image: harbor.aikoo.net/tanzu/springboot:1.1056
        ports:
        - containerPort: 8012

 

 

4. svc.yaml 작성

https://github.com/themapisto/demo/blob/main/k8s/client_svc.yaml

 

GitHub - themapisto/demo

Contribute to themapisto/demo development by creating an account on GitHub.

github.com

# demo/k8s/client_svc.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: springboot
  name: springboot
  namespace: springboot
spec:
  ports:
  - port: 8012
    protocol: TCP
    targetPort: 8012
  selector:
    app: springboot
  type: ClusterIP
status:
  loadBalancer: {}

 

5. ingress http-proxy.yaml 작성

https://github.com/themapisto/demo/blob/main/k8s/client_http_proxy.yaml

 

GitHub - themapisto/demo

Contribute to themapisto/demo development by creating an account on GitHub.

github.com

# demo/k8s/http-proxy.yaml
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: springboot
  namespace: springboot
spec:
  virtualhost:
    fqdn: client.taskoo.net
  routes:
    - services:
      - name: springboot
        port: 8012

 

6. 확인

 

 

사실 내용 중간중간 디테일한 설명들이 너무 많이 빠진걸 안다. 하지만, 스터디원들과 오프라인으로 궁금한점들을 질의 하면서 점차 채워나갈 예정이다.