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
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
# 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
# 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
# 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. 확인
사실 내용 중간중간 디테일한 설명들이 너무 많이 빠진걸 안다. 하지만, 스터디원들과 오프라인으로 궁금한점들을 질의 하면서 점차 채워나갈 예정이다.
'개발스터디 > MSA 스터디 (22년)' 카테고리의 다른 글
[Spring Cloud] (1) 서비스 디스커버리 쿠버네티스 기능과 비교 (0) | 2023.05.27 |
---|---|
[MSA 1.0] (9) Spring Cloud Config 시작하기 (0) | 2022.12.29 |
[MSA 1.0] (6) Spring Cloud 어플리케이션을 Docker file로 배포하기 (0) | 2022.12.08 |
[MSA 1.0] (5) RestTemplate 개념과 사용법 (0) | 2022.12.06 |
Java MSA를 위한 Spring Cloud 환경 구축하기(Eureka) (1) | 2022.06.30 |