BWCE Application 실행 on Kubernetes

[toc]

1. 환경 이해

앞서 3.BWCE Application 실행 on Docker 의 작업을 모두 마치셨다면, 4.4 부터 작업을 진행 하시면 됩니다.

1.1 BusinessWorks Studio 환경 이해

TIBCO BusinessWorks는 One Source 개발 -> Multi Target 환경 배포를 지원합니다. 따라서 Application을 개발하는 BusinessWorks Studio는 TIBCO ActiveMatrix BusinessWorks™ 6.7.0 과 TIBCO BusinessWorks™ Container Edition 2.6.1 모두 지원합니다.

단, TIBCO ActiveMatrix BusinessWorks™ 6.7.0의 Studio에서 기존 Application을 Container 환경으로 개발시 Deployment Target을 Container로 변경해 주어야 합니다.

1.2 BusinessWorks 샘플 Application 이해 및 소스 다운로드

bwce_secnario

REST 서비스를 하는 두개의 마이크로서비스 (Consumer, Provider)를 샘플로 구현합니다. Consumer : 외부의 요청을 받아서 Provider를 호출하고 그 결과값을 외부 요청자에게 전달해 주는 서비스 Provider : 자체적인 서비스를 제공하는 벡엔드 서비스

샘플 Application 다운로드 : 샘플 Git 주소

샘플 Application을 Zip 파일로 다운로드 합니다.

sample down

2. BusinessWorks Studio에서 실행

2.1 샘플 Application Import

Project Explore 에서 Import

Git에서 다운 받은 bwce_provider_consumer-main.zip 파일을 Import 합니다.

bwce_provider_consumer-main.zip 파일에 Consumer 와 Provider 두개의 Application이 존재합니다.

2.2 샘플 Application 둘러보기

  1. Consumer REST 서비스 보기 consumerREST

  2. Consumer HTTP Client Resouce 보기 ConsumerHTTPClient

    Consumer가 호출하는 Provider의 HOST와 Port정보가 Module Property(PROVIDER_HOST, PROVIDER_PORT) 로 정의 되어 있습니다.

  3. Provider HTTP Connector Resouce 보기 ConsumerHTTPClient

    Provider의 Port정보가 Module Property - PROVIDER_PORT로 정의 되어 있습니다.

  4. Consumer Module Property 정보 consumerProperty

    Property 정보는 Applicatoin구동시 파라미터 정보로 변경 가능합니다.

2.3 샘플 Application Run

  1. Run -> Run Configurations -> BusinessWorks Application -> Run consumerProperty

    Consumer 와 Provider 두개의 Application을 체크 합니다.

  2. OSGI 명령어로 REST URLs (Swagger UI) 얻기 Console 창에서 lrestdoc 을 입력합니다. consumerProperty

    Consumer 와 Provider Application의 REST Discovery Url (Swagger UI) 을 얻습니다.

  3. Swagger UI를 통한 REST 서비스 테스트
    • Provider Application의 Swagger UI를 통한 REST 서비스 테스트

    브라우저에서 Provider Application의 REST Discovery Url (Swagger UI) 입력

    Provider -> Try it out -> RequestID 입력 -> Execute 클릭 -> Server Response 결과 값 확인

  • Consumer Application의 Swagger UI를 통한 REST 서비스 테스트

    브라우저에서 Consumer Application의 REST Discovery Url (Swagger UI) 입력

    Consumer -> Try it out -> RequestID 입력 -> Execute 클릭 -> Server Response 결과 값 확인

2.4 샘플 Application EAR 생성

Consumer와 Provider Application의 EAR 파일을 생성합니다.

  1. Project Explore -> Consumer.application -> Create Enterprise Archive(EAR)

  1. Project Explore -> Provider.application -> Create Enterprise Archive(EAR)

각 Provider.application_1.0.0.ear와 Consumer.application_1.0.0.ear 파일이 생성됩니다.

3 샘플 Application Docker Build

3.1 Provider Application Docker Build

3.1.1 Dockerfile 생성

$ cat <<EOF | tee Dockerfile_Provider
#BWCE Base Docker 이미지 태그 네임
FROM tibco/bwce:latest                    

#Base Docker에 Copy할 EAR 파일 이름
ADD Provider.application_1.0.0.ear /      
 
#외부 오픈 포트 이름 
EXPOSE 8000

#환경변수 BWCE Module Property에 값 전달
ENV BW_PROFILE Docker
ENV PROVIDER_PORT 8000                    
EOF

ENV 환경 변수는 docker run -e 옵션을 통해서도 전달 가능하며, BWCE에서 기본으로 사용되는 환경 변수는 https://docs.tibco.com/pub/bwce/2.6.1/doc/html/GUID-25BD2BA4-6BA4-418C-98D4-6EB3C9196399.html 를 참조하시기 바랍니다.

3.1.2 Docker Build

$ docker build -t provider:latest -t provider:1.0 -f Dockerfile_Provider .

3.1.3 Docker image 결과 확인

$ docker images

3.2 Consumer Application Docker Build

3.2.1 Dockerfile 생성

$ cat <<EOF | tee Dockerfile_Consumer
#BWCE Base Docker 이미지 태그 네임
FROM tibco/bwce:latest        

#Base Docker에 Copy할 EAR 파일 이름
ADD Consumer.application_1.0.0.ear /      

#외부 오픈 포트 이름  
EXPOSE 7000   

#환경변수 BWCE Module Property에 값 전달
ENV BW_PROFILE Docker
ENV PROVIDER_PORT 8000               
#PROVIDER_HOST (Docker Host IP 혹은 Docker Link의 이름 )
ENV PROVIDER_HOST provider-host           
ENV CONSUMER_PORT 7000                    
EOF

ENV 환경 변수는 docker run -e 옵션을 통해서도 전달 가능하며, BWCE에서 기본으로 사용되는 환경 변수는 https://docs.tibco.com/pub/bwce/2.6.1/doc/html/GUID-25BD2BA4-6BA4-418C-98D4-6EB3C9196399.html 를 참조하시기 바랍니다.

3.2.2 Docker Build

$ docker build -t consumer:latest -t consumer:1.0 -f Dockerfile_Consumer .

3.2.3 Docker image 결과 확인

$ docker images

4. Docker Registry에 Docker Image 배포

Docker Image가 Build 된 노드와 해당 Docker Image를 이용하여 Container가 구동되는 노드 환경이 다를 경우, 해당 노드에서 Docker Image를 참조하기 위해서는 Docker Registry에 해당 Docker Image를 배포해 주어야 합니다.

4.1 Docker Registry 종류

Docker Registry는 크게 아래 종류로 나뉠수 있으며, 그 종류에 상관없이 동일한 명령 (docker login, docker pull docker push)을 사용할 수 있습니다.

  1. Public Docker Registry https://hub.docker.com/ 에 무료 가입 후 해당 Registry를 활용할 수 있습니다.

  2. Private Docker Registry

4.2 Docker Registry 에 docker login

본 블로그에서는 https://hub.docker.com/ 의 Public Docker Registry를 사용합니다. hub.docker.com에 가입한 ID와 Password를 사용하여 docker login을 합니다. 본 블로그에서는 User ID를 chungsju로 사용하였습니다.

$ sudo docker login -u chungsju -p xxxx
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

4.3 Docker Registry 에 docker push

  1. 로컬의 Docker Image의 Tag 이름을 Docker Registry의 Repository 이름으로 변경합니다.
    $ sudo docker tag provider:latest chungsju/provider:latest
    $ sudo docker tag provider:1.0 chungsju/provider:1.0
    $ sudo docker tag consumer:latest chungsju/consumer:latest
    $ sudo docker tag consumer:1.0 chungsju/consumer:1.0
    $ sudo docker tag tibco/bwce-mon:latest chungsju/bwce-mon:latest
    
  2. docker push 를 통한 Docker Image push
    $ sudo docker push chungsju/provider
    $ sudo docker push chungsju/consumer
    $ sudo docker push chungsju/bwce-mon
    
  3. https://hub.docker.com/repositories에서 Image Repository 확인 dockehub1 dockehub2

5. Kubernetes Resource 생성

샘플 Application을 Kubernetes 환경하에서 실행하기 위해 Kubernetes의 핵심적인 DeploymentService Resource를 생성합니다.

  • Deployment : 실 Container가 운영되는 워크로드 Resource로 PodReplicaSet를 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/를 참조하시기 바랍니다.
  • Service : 실행중인 Pod에 접근하는 정책과 네트워크 서비스로 노출시키는 방법을 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/services-networking/service/를 참조하시기 바랍니다.
  • Service resource를 외부 네트워크에서 접근하기 위해서는 type: LoadBalancer 혹은 type: NodePort를 사용합니다. 본 블로그에서는 NodePort를 사용하였으며, NodePort로 접근하기 위해서는 Kubernetes Worker Node 중 하나의 Host IP가 필요합니다. 하나의 Woker Node의 IP 및 NodePort로 접근하면, Kubernetes 내부의 Cluster IP로 라우팅 되면서 내부 로드벨런싱 됩니다.
  • Kubernetes 의 버전에 따라 지원되는 Resource의 apiVersion 이 상이할 수 있습니다. 현재 사용하는 Kubernetes의 Resource 별 apiVersion을 확인하시기 바랍니다.
    $ for kind in `kubectl api-resources | tail +2 | awk '{ print $1 }'`; do kubectl explain $kind; done | grep -e "KIND:" -e "VERSION:"
    

5.1 Application Monitoring 용 Resouce 생성

5.1.1 Monitoring 결과 DB(PostgreSQL) Resouce 생성

5.1.1.1 Service Resource 생성

postgres-bwce-mon-service.yaml 파일 생성

apiVersion: v1
kind: Service
metadata:
  name: postgres-bwce-mon-svc
  labels:
    app: postgres-bwce-mon
spec:
  type: NodePort
  ports:
   - port: 5432
     targetPort:5432
     nodePort:30432
  selector:
   app: postgres-bwce-mon

postgres-bwce-mon-service.yaml 파일 적용

$ kubectl create -f postgres-bwce-mon-service.yaml
service/postgres-bwce-mon-svc created
5.1.1.2 Deployment Resource 생성

postgres-bwce-mon-deployment.yaml 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-bwce-mon
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-bwce-mon      
  template:
    metadata:
      labels:
        app: postgres-bwce-mon
    spec:
      containers:
        - name: postgres-bwce-mon
          image: postgres:latest
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          env :
            - name: POSTGRES_USER
              value: bwuser
            - name: POSTGRES_PASSWORD
              value: bwuser            

postgres-bwce-mon-deployment.yaml 파일 적용

$ kubectl create -f postgres-bwce-mon-deployment.yaml
5.1.1.3 Resource 생성 검증
$ kubectl get services
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.96.0.1      <none>        443/TCP          45d
postgres-bwce-mon-svc   NodePort    10.99.130.39   <none>        5432:30432/TCP   2d12h
$ kubectl get deployments
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
postgres-bwce-mon   1/1     1            1           27m

5.1.2 BWCE Applicatoin Monitoring Resouce 생성

5.1.2.1. Service Resource 생성

bwce-mon-service.yaml 파일 생성

apiVersion: v1
kind: Service
metadata:
  name: bwce-mon-svc
  labels:
    app: bwce-mon
spec:
  type: NodePort
  ports:
   - port: 8080
     targetPort: 8080
     nodePort: 30080
  selector:
   app: bwce-mon

bwce-mon-service.yaml 파일 적용

$ kubectl create -f bwce-mon-service.yaml
service/bwce-mon-svc created
5.1.2.2. Deployment Resource 생성

bwce-mon-deployment.yaml 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bwce-mon
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bwce-mon
  template:
    metadata:
      labels:
        app: bwce-mon
    spec:
      containers:
        - name: bwce-mon
          image: chungsju/bwce-mon:latest
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 8080
          resources:
            limits:
               memory: 512Mi
            requests:
               memory: 512Mi
          env:
           - name: PERSISTENCE_TYPE
             value: postgres
           - name: DB_URL
             value: postgres://bwuser:bwuser@postgres-bwce-mon-svc:5432/postgres

image: chungsju/bwce-mon:latest 는 public docker hub에 push한 Image repository 이름입니다. value: postgres://bwuser:bwuser@postgres-bwce-mon-svc:5432/postgres 에서 앞서 Monitoring 결과 DB에서 설정한 ID/PW 및 Service resource의 이름(postgres-bwce-mon-svc) 및 port를 입력합니다.

bwce-mon-deployment.yaml 파일 적용

$ kubectl create -f bwce-mon-deployment.yaml
5.1.2.3. Resource 생성 검증
$ kubectl get services
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
bwce-mon-svc            NodePort    10.99.135.150   <none>        8080:30080/TCP   4m7s
kubernetes              ClusterIP   10.96.0.1       <none>        443/TCP          45d
postgres-bwce-mon-svc   NodePort    10.99.130.39    <none>        5432:30432/TCP   2d14h
$ kubectl get deployments
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
bwce-mon            1/1     1            1           70s
postgres-bwce-mon   1/1     1            1           173m

5.2 Provider Application 용 Resouce 생성

5.2.1. Service Resource 생성

provider-service.yaml 파일 생성

apiVersion: v1
kind: Service
metadata:
  name: provider-svc
  labels:
    app: provider
spec:
  type: NodePort
  ports:
   - port: 8000
     targetPort: 8000
     nodePort: 30800
  selector:
   app: provider

provider-service.yaml 파일 적용

$ kubectl create -f provider-service.yaml
service/provider-svc created

5.2.2. Deployment Resource 생성

provider-deployment.yaml 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: provider
spec:
  replicas: 1
  selector:
    matchLabels:
      app: provider
  template:
    metadata:
      labels:
        app: provider
    spec:
      containers:
        - name: provider
          image: chungsju/provider:1.0
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 8000
          env:
           - name: BW_PROFILE
             value: Docker
           - name: PROVIDER_PORT
             value: "8000"
           - name: BW_APP_MONITORING_CONFIG
             value: '{"url":"http://bwce-mon-svc:8080"}'

image: chungsju/provider:1.0 는 public docker hub에 push한 Image repository 이름입니다. BW_APP_MONITORING_CONFIG 의 값으로 앞서 Monitoring Service resource의 이름(bwce-mon-svc) 및 port를 입력합니다.

provider-deployment.yaml 파일 적용

$ kubectl create -f provider-deployment.yaml

5.2.3. Resource 생성 검증

$ kubectl get services
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
bwce-mon-svc            NodePort    10.99.135.150    <none>        8080:30080/TCP   58m
kubernetes              ClusterIP   10.96.0.1        <none>        443/TCP          45d
postgres-bwce-mon-svc   NodePort    10.99.130.39     <none>        5432:30432/TCP   2d15h
provider-svc            NodePort    10.102.243.120   <none>        8000:30800/TCP   26m
$ kubectl get deployments
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
bwce-mon            1/1     1            1           55m
postgres-bwce-mon   1/1     1            1           3h48m
provider            1/1     1            1           11m

5.3 Consumer Application 용 Resouce 생성

5.3.1. Service Resource 생성

consumer-service.yaml 파일 생성

apiVersion: v1
kind: Service
metadata:
  name: consumer-svc
  labels:
    app: consumer
spec:
  type: NodePort
  ports:
   - port: 7000
     targetPort: 7000
     nodePort: 30700
  selector:
   app: consumer

consumer-service.yaml 파일 적용

$ kubectl create -f consumer-service.yaml
service/consumer-svc created

5.3.2. Deployment Resource 생성

consumer-deployment.yaml 파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: consumer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: consumer
  template:
    metadata:
      labels:
        app: consumer
    spec:
      containers:
        - name: consumer
          image: chungsju/consumer:1.0
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 7000
          env:
           - name: BW_PROFILE
             value: Docker
           - name: PROVIDER_HOST
             value: provider-svc  
           - name: PROVIDER_PORT
             value: "8000"
           - name: CONSUMER_PORT
             value: "7000"
           - name: BW_APP_MONITORING_CONFIG
             value: '{"url":"http://bwce-mon-svc:8080"}'

image: chungsju/consumer:1.0 는 public docker hub에 push한 Image repository 이름입니다. BW_APP_MONITORING_CONFIG 의 값으로 앞서 Monitoring Service resource의 이름(bwce-mon-svc) 및 port를 입력합니다. PROVIDER_HOST 의 값으로 앞서 Provider Service resource의 이름(provider-svc)을 입력합니다.

consumer-deployment.yaml 파일 적용

$ kubectl create -f consumer-deployment.yaml

5.3.3. Resource 생성 검증

$ kubectl get services
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
bwce-mon-svc            NodePort    10.99.135.150    <none>        8080:30080/TCP   89m
consumer-svc            NodePort    10.98.151.184    <none>        7000:30700/TCP   93s
kubernetes              ClusterIP   10.96.0.1        <none>        443/TCP          45d
postgres-bwce-mon-svc   NodePort    10.99.130.39     <none>        5432:30432/TCP   2d15h
provider-svc            NodePort    10.102.243.120   <none>        8000:30800/TCP   57m
$ kubectl get deployments
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
bwce-mon            1/1     1            1           86m
consumer            1/1     1            1           79s
postgres-bwce-mon   1/1     1            1           4h19m
provider            1/1     1            1           43m

6. Application 검증 및 모니터링

6.1 kubectl 을 통한 Resouce 검증

$ kubectl get services
$ kubectl get deployments
$ kubectl get pods

6.2 Kubernetes Dashboard 를 통한 Resource 검증

  1. dashboard 접근 토큰 얻기
    $ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
    Data
    ====
    token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImVrLS1aVDRURnNnNFVZMTRuMXhXeFZhVWtzbzVTYU01YjUzYVh3dVNFSG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWw2azh0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0YzkwNTI0Mi05YzM2LTQ2ZjMtYjA0Yi04MjYzZmM0OWYyNjEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.l3g6OmUqJxN3ulB32P9OEWW6Qg31j9MQ4rYFgj6yujPoUHcXP1WnN2bSAfDdc7oBk_9jXmUGaYCeQyoskwu6-x6cvcQ2yoSl2YtUyHQaLSp7FAX-mexnLiw3Po0Oy-aeqcgbmu63uE69ib4cN4eh28xSROW75hD8paaec7iN3JWRen1qd3Qx0VYI1Vwa1rRjccnrXJNtjGD-ahaduF_7O9v8ysgI42Zgv1OoyshFo4-M8113FohldOqCPmW26E-t85CWPkV_C9miya98nQHF1YRNj3BGh1ysa69R_nL9joJeFy76ifxPIRfdAFDQq9uPZb9dQTkMu81s_t1-YecO5g
    ca.crt:     1066 bytes
    namespace:  11 bytes
    

    향후 지속적인 Dashboard 접근을 위해서는 해당 token을 별도 복사하여 저장하여 둡니다.

  2. proxy 연계
    $ kubectl proxy
    Starting to serve on 127.0.0.1:8001
    
  3. 브라우저로 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login 에 접속 Service Resource 보기 kube-service Deployment Resource 보기 kube-deployment Pods Resource 보기 kube-pods

6.3 Application 검증 및 모니터링

Service resource를 외부 네트워크에서 접근하기 위해서는 type: LoadBalancer 혹은 type: NodePort를 사용합니다. 본 블로그에서는 NodePort를 사용하였으며, NodePort로 접근하기 위해서는 Kubernetes Worker Node 중 하나의 Host IP가 필요합니다. 하나의 Woker Node의 IP 및 NodePort로 접근하면, Kubernetes 내부의 Cluster IP로 라우팅 되면서 내부 로드벨런싱 됩니다.

6.3.1 Consumer Application Swagger 접속

  1. Kubernetes의 Worker node중의 하나의 host ip 얻기
    $ kubectl get node -o wide
    NAME                                               STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    ip-172-31-48-90.ap-northeast-2.compute.internal    Ready    <none>                 47d   v1.20.2   172.31.48.90    <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://20.10.2
    ip-172-31-56-200.ap-northeast-2.compute.internal   Ready    <none>                 47d   v1.20.2   172.31.56.200   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://20.10.2
    ip-172-31-62-29.ap-northeast-2.compute.internal    Ready    control-plane,master   47d   v1.20.2   172.31.62.29    <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://20.10.2
    
  2. http://[woker-node-ip]:30700/swagger 로 브라우저 접속 kube-consumer

6.3.2 브라우저를 통한 Monitoring 접속

  1. http://[woker-node-ip]:30080/ 로 브라우저 접속 kube-monitoring

  2. Consumer Application Process 통계 정보 보기 monitoring_stats

  3. Consumer Application Process Instance 히스토리 보기 monitoring_stats

    Process 호출 이력 및 호출 당시의 각 엑티비티의 성공 여부와 Input/Output에 대한 값을 확인 할 수 있습니다.