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 이해 및 소스 다운로드

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

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 둘러보기
-
Consumer REST 서비스 보기

- Consumer HTTP Client Resouce 보기
Consumer가 호출하는 Provider의 HOST와 Port정보가 Module Property(PROVIDER_HOST, PROVIDER_PORT) 로 정의 되어 있습니다.
- Provider HTTP Connector Resouce 보기
Provider의 Port정보가 Module Property - PROVIDER_PORT로 정의 되어 있습니다.
- Consumer Module Property 정보
Property 정보는 Applicatoin구동시 파라미터 정보로 변경 가능합니다.
2.3 샘플 Application Run
- Run -> Run Configurations -> BusinessWorks Application -> Run
Consumer 와 Provider 두개의 Application을 체크 합니다.
- OSGI 명령어로 REST URLs (Swagger UI) 얻기 Console 창에서
lrestdoc을 입력합니다.
Consumer 와 Provider Application의 REST Discovery Url (Swagger UI) 을 얻습니다.
- 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 파일을 생성합니다.
- Project Explore -> Consumer.application -> Create Enterprise Archive(EAR)

- 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)을 사용할 수 있습니다.
-
Public Docker Registry https://hub.docker.com/ 에 무료 가입 후 해당 Registry를 활용할 수 있습니다.
-
Private Docker Registry
-
자체 구성 Private Docker Registry

https://landscape.cncf.io/ 에서 Container Registry 영역을 참조하실수 있습니다. 대표적으로 HARBOR 혹은 Docker Registry(https://docs.docker.com/registry/)를 통해 나만의 Private Docker Registry환경을 구축하실수 있습니다.
-
Cloud 벤더 제공 Docker Registry
- AWS ECR : https://aws.amazon.com/ecr/
- Google Container Registry : https://cloud.google.com/container-registry/
- Azure Container Registry https://azure.microsoft.com/en-us/services/container-registry/
- Oracle Cloud Infrastructure Container Registry https://www.oracle.com/kr/cloud-native/container-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
- 로컬의 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 docker push를 통한 Docker Image push$ sudo docker push chungsju/provider $ sudo docker push chungsju/consumer $ sudo docker push chungsju/bwce-mon- https://hub.docker.com/repositories에서 Image Repository 확인

5. Kubernetes Resource 생성
샘플 Application을 Kubernetes 환경하에서 실행하기 위해 Kubernetes의 핵심적인 Deployment 와 Service Resource를 생성합니다.
Deployment: 실 Container가 운영되는 워크로드 Resource로Pod와ReplicaSet를 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/를 참조하시기 바랍니다.Service: 실행중인Pod에 접근하는 정책과 네트워크 서비스로 노출시키는 방법을 정의합니다. 상세 내역은 https://kubernetes.io/ko/docs/concepts/services-networking/service/를 참조하시기 바랍니다.Serviceresource를 외부 네트워크에서 접근하기 위해서는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 검증
- 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을 별도 복사하여 저장하여 둡니다.
- proxy 연계
$ kubectl proxy Starting to serve on 127.0.0.1:8001 - 브라우저로
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login에 접속 Service Resource 보기
Deployment Resource 보기
Pods Resource 보기 
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 접속
- 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 - http://[woker-node-ip]:30700/swagger 로 브라우저 접속

6.3.2 브라우저를 통한 Monitoring 접속
-
http://[woker-node-ip]:30080/ 로 브라우저 접속

-
Consumer Application Process 통계 정보 보기

-
Consumer Application Process Instance 히스토리 보기

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