Docker Image 파일 생성
프로젝트에서 여러가지 이유(JVM 속성 및 옵션 추가 등..)에 의해서 LRA Coordinator의 Docker Image의 생성이 필요할 경우가 있다.
이러한 경우에는 기존 LRA Coordinator의 Docker Image 혹은 연구소/기술지원팀에 요청하여 LRA Coordinator의 실행 가능한 bootJar파일을 가져 올 수 있도록 한다.
다음은 Docker Image에서 bootJar파일을 가져오는 방법이다.
1. LRA Coordinator Docker 실행
$ docker run -e "ACTION_STORE_URL=jdbc:h2:mem:test;MODE=Oracle -e ACTION_STORE_USERNAME=sa -e ACTION_STORE_PASSWORD=" --name bxframework-lra-coordinator bxframework-lra-coordinator
위의 Docker 실행 Command에서 h2는 인메모리 DB이며, URL 값을 'jdbc:h2:mem:test;MODE=Oracle' 이와 같이 정의하면 기동 시 자동으로 인메모리 DB가 생성이 되어, 정상적으로 기동이된다.
|
2. bootJar 파일 Local로 복사
docker 프로세스 확인
$ docker ps | grep bxframework-lra-coordinator
a77ed7fafbef bxframework-lra-coordinator "/bin/sh -c 'exec ja…" 15 minutes ago Up 15 minutes bxframework-lra-coordinator
bootJar 파일 Local로 복사
$ docker cp bxframework-lra-coordinator:/app.jar bxframework-lra-coordinator-3.0.0-boot.jar
3. Dockerfile 생성
Docker Image를 생성하기 위해서는 Dockerfile이 필요하다.
다음은 Dockerfile을 생성하기 위한 예제이다.
FROM openjdk:17-alpine
ARG revision
VOLUME /tmp
COPY bxframework-lra-coordinator-3.0.0-boot.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT exec java -Xms128m -Xmx512m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 -jar /app.jar
Docker 파일 생성 예제에서는 openjdk:17-alpine 이미지를 base로 하고 있다. 사이트에 openjdk:17-alpine 이미지가 없다면 사용 가능한 Docker Image를 활용하도록 한다. |
4. Docker Image 생성
생성 완료한 Dockerfile이 위치한 디렉토리에서 'docker build' Command를 이용해서 Docker Image 파일을 생성한다.
$ docker build -t bxframework-lra-coordinator:latest .
[+] Building 1.0s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 281B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:17-alpine 0.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 66B 0.0s
=> [1/2] FROM docker.io/library/openjdk:17-alpine@sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81 0.0s
=> CACHED [2/2] COPY bxframework-lra-coordinator-3.0.0-boot.jar app.jar 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:9b0428ce3c9e460ad770f9e280492d3a8893bbaa78e5e478dae0d7583e769a32 0.0s
=> => naming to docker.io/library/bxframework-lra-coordinator:latest 0.0s
5. 생성한 Docker Image 확인
Docker Image가 정상적으로 생성이 완료가 되었는지 확인한다.
$ docker images | grep bxframework-lra-coordinator
bxframework-lra-coordinator latest 9b0428ce3c9e 2 minutes ago 434MB
6. Kubernetes에 LRA Coordinator POD 실행
BXCM 설치 InstallSet에는 LRA Coordinator를 POD로 실행할 수 있는 설치 yaml 이 있다.
다음은 LRA Coordinator 설치 yaml 파일에 대한 설명이다.
BXCM 설치 InstallSet의 02.rbac/lra-rbac.yaml, 03.install/lra.yaml 파일을 실행한다.
$ docker images | grep bxframework-lra-coordinator
bxframework-lra-coordinator latest 9b0428ce3c9e 2 minutes ago 434MB
설치 yaml 파일 명 | 내용 |
---|---|
02.rbac/lra-rbac.yaml |
Kubernetes RBAC(ClusterRole, ClusterRoleBinding) 권한을 생성하는 yaml 파일 |
03.install/lra.yaml |
Kubernetes Service / Deployment를 생성하기 위한 yaml 파일 |
설치 yaml 파일에 기술되어 있는 사항은 다음과 같다.
-
rabc-lra.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: lra-coordinator-leader-elector
namespace: bxcm300
rules:
- apiGroups:
- ""
resources: ["endpoints", "configmaps"]
verbs:
- "*"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: lra-coordinator-leader-elector
namespace: bxcm300
subjects:
- kind: ServiceAccount
name: lra-leader-elector
namespace: bxcm300
apiGroup: ""
roleRef:
kind: ClusterRole
name: lra-coordinator-leader-elector
apiGroup: ""
-
lra.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: lra-leader-elector
namespace: bxcm300
---
apiVersion: v1
kind: Service
metadata:
name: bxframework-lra-coordinator
namespace: bxcm300
spec:
selector:
app: bxframework-lra-coordinator
ports:
- protocol: TCP
port: 8082
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: bxframework-lra-coordinator
namespace: bxcm300
spec:
selector:
matchLabels:
app: bxframework-lra-coordinator
replicas: 1
template:
metadata:
labels:
app: bxframework-lra-coordinator
spec:
serviceAccountName: lra-leader-elector
containers:
- name: bxframework-lra-coordinator
image: bxframework-lra-coordinator:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8082
env:
- name: LOGGING_LEVEL_LRA_COORDINATOR
value: DEBUG
- name: ACTION_STORE_URL
value: "jdbc:mysql://cloud.mshome.net:3306/bxcm300?autoReconnect=true&useUnicode=true&characterEncoding=utf8"
- name: ACTION_STORE_USERNAME
value: "{username}"
- name: ACTION_STORE_PASSWORD
value: "{password}"
volumeMounts:
- mountPath: /node_home
name: node-volume
- name: lra-coordinator-leader-elector
image: k8s.gcr.io/leader-elector:0.5
imagePullPolicy: IfNotPresent
args:
- "--election=lra-coordinator-leader-elector"
- "--http=0.0.0.0:4040"
ports:
- containerPort: 4040
volumes:
- name: node-volume
hostPath:
path: /
설치 yaml 파일에 대한 주요 항목에 대한 설명이다.
항목 | 값 | 설명 |
---|---|---|
port / containerPort |
8082 |
LRA Coordinator의 Default Port 값이다. |
ACTION_STORE_URL |
DB 접속 URL |
LRA Coordinator가 사용하는 DB의 접속 URL에 대한 외부 주입 설정 |
ACTION_STORE_USERNAME |
DB 접속 사용자명 |
LRA Coordinator가 사용하는 DB의 접속 사용자명에 대한 외부 주입 설정 |
ACTION_STORE_PASSWORD |
DB 접속 비밀번호 |
LRA Coordinator가 사용하는 DB의 접속 비밀번호에 대한 외부 주입 설정 |
volumeMounts → mountPath |
/node_home |
LRA Coordinator의 재처리를 위한 Leader를 선출 할 때 사용되는 볼륨이다. LRA Coordinator가 Multi 환경으로 구성 시 해당 볼륨은 NAS 혹은 PVC로 설정되어야 한다. |
lra-coordinator-leader-elector |
LRA에서 재처리를 위해 Leader를 선출하기 위한 컨테이너이다. |
위의 yaml 파일에서 env로 정의되어 있는 사용자명, 패스워드등은 Kubernetes Secret으로 생성하여 처리할 수 있다. 다음은 Secret으로 처리하는 방법의 예이다. 1. Secret으로 처리할 값을 base64로 처리
2. Secret yaml 파일 생성
3. Secret 생성
4. 생성된 Secret 확인
5. lar.yaml 파일에 Secret 적용
|
다음은 LRA Coordinator 설치에 준비된 yaml 파일에 대한 실행한 예제이다.
-
lra-rbac.yaml 실행
$ kubectl apply -f lra-rbac.yaml
clusterrole.rbac.authorization.k8s.io/lra-coordinator-leader-elector unchanged
clusterrolebinding.rbac.authorization.k8s.io/lra-coordinator-leader-elector configured
-
lra.yaml 실행
$ kubectl apply -f lra.yaml
serviceaccount/lra-leader-elector created
service/bxframework-lra-coordinator created
deployment.apps/bxframework-lra-coordinator created
-
yaml 파일 실행 결과 확인
$ kubectl get clusterrole | grep lra
lra-coordinator-leader-elector 2024-01-16T01:56:59Z
$ kubectl get clusterrolebinding | grep lra
lra-coordinator-leader-elector ClusterRole/lra-coordinator-leader-elector 22d
$ kubectl get service | grep lra
bxframework-lra-coordinator ClusterIP 10.43.38.67 <none> 8082/TCP 102s
$ kubectl get deployment | grep lra
bxframework-lra-coordinator 1/1 1 1 112s
$ kubectl get pod | grep lra
bxframework-lra-coordinator-75ff7c5f5c-w6k5p 2/2 Running 0 2m
-
LRA Coordinator POD 로그 확인하여 정상적으로 기동하였는지 확인
$ kubectl logs -f bxframework-lra-coordinator-76cf44f4fb-t5w9z
Defaulted container "bxframework-lra-coordinator" out of: bxframework-lra-coordinator, lra-coordinator-leader-elector
Listening for transport dt_socket at address: 9999
2024-02-07 02:13:15.314 INFO [,,] 1 --- [ main] o.s.c.k.f.config.Fabric8ConfigUtils : config-map with name : 'application' not present in namespace : 'bxcm300'
2024-02-07 02:13:15.334 INFO [,,] 1 --- [ main] o.s.c.k.f.config.Fabric8ConfigUtils : config-map with name : 'application-kubernetes' not present in namespace : 'bxcm300'
2024-02-07 02:13:15.336 INFO [,,] 1 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-configmap.application.bxcm300'}]
2024-02-07 02:13:15.413 INFO [,,] 1 --- [ main] l.coordinator.LraCoordinatorApplication : The following 1 profile is active: "kubernetes"
2024-02-07 02:13:18.115 INFO [,,] 1 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=d9d66355-504c-3132-8536-0b9515952465
2024-02-07 02:13:19.650 INFO [,,] 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8082 (http)
2024-02-07 02:13:19.670 INFO [,,] 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-02-07 02:13:19.670 INFO [,,] 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71]
2024-02-07 02:13:19.776 INFO [,,] 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-02-07 02:13:19.776 INFO [,,] 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4342 ms
2024-02-07 02:13:22.096 INFO [,,] 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-02-07 02:13:22.602 INFO [,,] 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-02-07 02:13:23.871 INFO [,,] 1 --- [ main] lra.common.context.LRAService : LRAService.enabledRecovery
2024-02-07 02:13:24.644 INFO [,,] 1 --- [ main] l.c.config.LraCoordinatorConfiguration : handler interceptor: [lra.coordinator.context.LraCoordinatorRequestInterceptor] registered
2024-02-07 02:13:25.834 WARN [,,] 1 --- [ main] iguration$LoadBalancerCaffeineWarnLogger : Spring Cloud LoadBalancer is currently working with the default cache. While this cache implementation is useful for development and tests, it's recommended to use Caffeine cache in production.You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.
2024-02-07 02:13:25.978 INFO [,,] 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 16 endpoint(s) beneath base path '/actuator'
2024-02-07 02:13:26.079 INFO [,,] 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8082 (http) with context path ''
2024-02-07 02:13:26.116 INFO [,,] 1 --- [ main] l.coordinator.LraCoordinatorApplication : Started LraCoordinatorApplication in 14.563 seconds (JVM running for 16.224)
2024-02-07 02:13:26.125 INFO [,,] 1 --- [ main] l.coordinator.LraCoordinatorApplication : Lra Coordinator started.....