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가 생성이 되어, 정상적으로 기동이된다.

  • 설정된 h2는 휘발성 이므로, 기동 테스트를 할 경우에만 사용한다.

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
LRA Coordinator 설치 yaml 파일
설치 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 파일에 대한 주요 항목에 대한 설명이다.

설치 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로 처리

                $ echo -n "bxcm300" | base64
                YnhjbTIwMA==

2. Secret yaml 파일 생성

                apiVersion: v1
                kind: Secret
                metadata:
                  name: lra-coordinator-secrets
                type: Opaque
                data:
                  ACTION_STORE_USERNAME: YnhjbTIwMA==
                  ACTION_STORE_PASSWORD: YnhjbTIwMA==

3. Secret 생성

                $ kubectl apply -f secret.yaml
                secret/lra-coordinator-secrets created

4. 생성된 Secret 확인

                $ kubectl get secret
                NAME                      TYPE     DATA   AGE
                lra-coordinator-secrets   Opaque   2      2m34s

5. lar.yaml 파일에 Secret 적용

                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
                          envFrom:
                            - secretRef:
                                name: lra-coordinator-secrets
                          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"
                          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: /

다음은 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.....
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

Copyright© Bankwareglobal All Rights Reserved.