TheKoguryo's 기술 블로그

 Version 2023.11.20

7.5 WebLogic Server를 Verrazzano를 통해 OKE에 배포하기

Verrazzano 설치시 WebLogic Operator가 함께 설치가 됩니다. 이번 내용은 아래 문서에 있는 내용을 따라 하며 정리한 내용으로, 기존 On-Premise에서 WebLogic Server 에 배포하여 사용하는 애플리케이션을 수정없이 WebLogic Server 를 통채로 Kubernetes 환경으로 이관을 원하는 경우 사용할 수 있는 방법에 대한 내용입니다.

수행하는 절차는 아래와 같습니다.

  • Step #1. WebLogic & MySQL 기반 애플리케이션을 이관한다는 가정하에 동일한 환경 및 앱을 준비
  • Step #2. WDT(WebLogic Deploy Tooling)을 통해 기 사용 WebLogic Server 분석후 메타데이터로 전환
  • Step #3. WIT(WebLogic Image Tool)을 통해 컨테이너 이미지 생성 및 배포 파일 생성
  • Step #4. 생성한 컨테이너 이미지와 배포 파일로 Verrazzano에 WebLogic 컨테이너 생성

Step #1. WebLogic & MySQL 기반 애플리케이션을 이관한다는 가정하에 동일한 환경 및 앱을 준비

MySQL 준비
  • 실제 On-Premise 환경에서는 베어메탈 또는 VM 등에 MySQL을 설치 사용하겠지만, 여기서는 데모용으로 도커 컨테이너를 사용합니다.
  1. MySQL 이미지 다운로드

    docker pull mysql:latest
    
  2. 도커 컨테이너 시작

    사용할 username, password로 변경

    export MYSQL_USER=<your-mysql-username>
    export MYSQL_PASSWORD=<your-mysql-password>
    export MYSQL_ROOT_PASSWORD=<your-mysql-rootpassword>
    docker run --name tododb \
      -p 3306:3306 \
      -e MYSQL_USER=$MYSQL_USER \
      -e MYSQL_PASSWORD=$MYSQL_PASSWORD \
      -e MYSQL_DATABASE=tododb \
      -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
      -d mysql:latest
    
  3. 패스워드 정책 변경

    MySQL 8.0 업그레이드후 기본 인증 방식이 변경되어 기존 클라이언트를 위해 이전 인증 방식으로 설정

    • MySQL CLI 클라이언트로 root로 접속, root 패스워드(your-mysql-rootpassword>) 입력

      docker exec \
         -it tododb mysql \
         -uroot \
         -p
      
    • 기본 인증 방식으로 변경

      ALTER USER '<your-mysql-username>'@'%' identified with mysql_native_password by '<your-mysql-password>';
      
WebLogic 서버 설치
  1. Oracle WebLogic Server 12.2.1.4 요구 사항에 따라 64비트 jdk1.8.0_211 이상 다운로드 및 설치

  2. 설치

    unzip fmw_12.2.1.4.0_wls_lite_Disk1_1of1.zip
    java -jar fmw_12.2.1.4.0_wls_lite_generic.jar
    
  3. 설치된 ORACLE_HOME 환경 변수 설정

    export ORACLE_HOME=/home/opc/fmw/wls12c
    
WebLogic 도메인 생성
  1. 구성 마법사 실행

    $ORACLE_HOME/oracle_common/common/bin/config.sh
    
  2. 기본 설정값 기준으로 tododomain 도메인을 $ORACLE_HOME/user_projects/domains/tododomain 에 생성

    export DOMAIN_HOME=$ORACLE_HOME/user_projects/domains/tododomain
    
  3. WebLogic Server 실행

    $ORACLE_HOME/user_projects/domains/tododomain/bin/startWebLogic.sh
    
MySQL 도커 컨테이너용 DataSource 생성
  1. WebLogic Admin Console, http://localhost:7001/console 에 접속

  2. 관리 콘솔 왼쪽 메뉴에서 서비스 > 데이터 소스 선택

  3. JDBC 데이터 소스 페이지에서 **새로 만들기 ** > 일반 데이터 소스 선택

  4. 데이터 소스 생성 페이지에서 다음 정보 입력

    Name: tododb
    JNDI Name: jdbc/ToDoDB
    Database Type: MySQ
    
  5. 다음 3번 클릭

  6. 데이터 소스 생성 페이지에서 다음 정보 입력

    Database Name: tododb
    Host name: localhost
    Database Port: 3306
    Database User Name: <your-mysql-username>
    Password: <your-mysql-password>
    Confirm Password: <your-mysql-password>
    Click Next.
    
  7. 다음 페이지에서 구성 테스트 클릭하여 접속 테스트 시행

  8. 다음 페이지로 이동하여 AdminServer로 대상 선택후 완료 클릭

샘플 애플리케이션 배포
  1. 기존에 WAS에 배포하던 일반적인 자바 애플리케이션을 가정하여 샘플 예제를 사용하여 빌드합니다.

  2. 소스 코드 복사후 빌드

    • git 클라이언트, maven 클라이언트 설치 필요
    git clone https://github.com/verrazzano/examples.git
    cd examples/todo-list/
    mvn clean package
    
  3. 빌드후 하위 target/todo.war 가 생김

  4. WebLogic Admin Console, http://localhost:7001/console 에 접속

  5. 관리 콘솔 왼쪽 메뉴에서 배치 선택

  6. 설치를 클릭하여 todo.war가 있는 경우 지정

  7. 다음을 클릭하고 이후는 기본값을 사용하여 앱을 배포

데이터 초기화
  1. http://localhost:7001/todo/rest/items/init 을 브라우저로 접속
  2. MySQL 도커 컨테이너와 연결되어 데이터 초기화 성공하면 ToDos table initialized. 응답 메시지 확인됨
애플리케이션 접속
  1. http://localhost:7001/todo/index.html 주소로 애플리케이션 접속하면, 정상적으로 데이터가 뜨는 것을 알 수 있습니다.

    image-20220107155645958

Step #2. WDT을 통해 기 사용 WebLogic Server 분석후 메타데이터로 전환

WebLogic Operator을 통해 아래 내용을 WDT Model을 통해 이관하는 방법입니다.

WDT(WebLogic Deploy Tooling) 모델 생성
  1. WebLogic Deploy Tooling (WDT)을 아래와 같은 명령으로 다운 받아 설치 합니다.

    curl -OL https://github.com/oracle/weblogic-deploy-tooling/releases/latest/download/weblogic-deploy.zip
    unzip  weblogic-deploy.zip
    cd weblogic-deploy
    export WDT_HOME=$(pwd)
    
  2. WDT에서 제공하는 discoverDomain.sh를 통해 앞서 앱을 배포한 DOMAIN_HOME을 분석하여 결과물로 메타데이터 모델을 생성합니다.

    • 실행전에 export JAVA_HOME으로 jdk home을 사전에 설정해야 합니다.
    mkdir v8o
    $WDT_HOME/bin/discoverDomain.sh \
      -oracle_home $ORACLE_HOME \
      -domain_home $DOMAIN_HOME \
      -model_file ./v8o/wdt-model.yaml \
      -archive_file ./v8o/wdt-archive.zip \
      -target vz \
      -output_dir v8o
    
  3. 실행결과

    $ ls -la v8o/
    total 32
    drwxrwxr-x. 2 opc opc  4096 Jan  7 08:00 .
    drwxrwxr-x. 4 opc opc    67 Jan  7 08:00 ..
    -rwxr-x---. 1 opc opc  1944 Jan  7 08:00 create_k8s_secrets.sh
    -rw-r-----. 1 opc opc  3156 Jan  7 08:00 vz-application.yaml
    -rw-r-----. 1 opc opc    51 Jan  7 08:00 vz_variable.properties
    -rw-r-----. 1 opc opc 10671 Jan  7 08:00 wdt-archive.zip
    -rw-r-----. 1 opc opc  1179 Jan  7 08:00 wdt-model.yaml
    
    • create_k8s_secrets.sh - 웹로직 관리자 정보 등을 kubernes secret으로 만들기 위한 헬프 스크립트
    • vz-application.yaml - Verrazzano 애플리케이션으로 배포하기 위한 YAML이 자동으로 생성
    • vz_variable.properties - Verrazzano 애플리케이션으로 배포하기 위한 변수값
    • wdt-archive.zip - 앞서 배포된 ToDO List 애플리케이션을 포함한 WDT 아카이브 파일
    • wdt-model.yaml - WebLogic Server 도메인에 대한 WDT model

Step #3. WebLogic Image Tool을 통해 컨테이너 이미지 생성 및 배포 파일 생성

  1. WebLogic Image Tool을 아래와 같은 명령으로 다운 받아 설치 합니다.

    curl -OL https://github.com/oracle/weblogic-image-tool/releases/latest/download/imagetool.zip
    unzip imagetool.zip
    cd imagetool
    export WIT_HOME=$(pwd)
    
  2. WIT를 통해 컨테이너 이미지를 생성합니다. 툴을 사용하기 위해서는 앞서 다운 받은 WebLogic 설치 Zip 파일과 JDK 설치 파일이 필요합니다.

    • 설치 파일이 위치한 경로를 맞게 수정하고 최종적으로 생성될 컨테이너 이미지의 태그를 원하는 값으로 수정합니다.
    # The directory created previously to hold the generated scripts and models.
    cd v8o
    
    $WIT_HOME/bin/imagetool.sh cache addInstaller \
      --path ~/stage/jdk-8u301-linux-x64.tar.gz \
      --type jdk \
      --version 8u301
    
    # The installer file name may be slightly different depending on
    # which version of the 12.2.1.4.0 installer that you downloaded, slim or generic.
    $WIT_HOME/bin/imagetool.sh cache addInstaller \
      --path ~/stage/fmw_12.2.1.4.0_wls_lite_Disk1_1of1.zip \
      --type wls \
      --version 12.2.1.4.0
    
    $WIT_HOME/bin/imagetool.sh cache addInstaller \
      --path $WDT_HOME/../weblogic-deploy.zip \
      --type wdt \
      --version latest
    
    # Paths for the files in this command assume that you are running it from the
    # v8o directory created during the `discoverDomain` step.
    $WIT_HOME/bin/imagetool.sh create \
      --tag <region-key>.ocir.io/<tenancy-namespace>/<username>/todo:1 \
      --version 12.2.1.4.0 \
      --jdkVersion 8u301 \
      --wdtModel ./wdt-model.yaml \
      --wdtArchive ./wdt-archive.zip \
      --wdtVariables ./vz_variable.properties \
      --resourceTemplates=./vz-application.yaml \
      --wdtModelOnly
    
  3. 생성된 컨테이너 이미지를 OCIR 레지스트리에 푸쉬합니다.

    docker push <region-key>.ocir.io/<tenancy-namespace>/<username>/todo:1
    

Step #4. 생성한 컨테이너 이미지와 배포 파일로 Verrazzano에 WebLogic 컨테이너 생성

namespace 생성 및 라벨 달기
  1. 단일 클러스터 기준 다음과 같이 실행합니다.

    kubectl create namespace tododomain
    kubectl label namespace tododomain verrazzano-managed=true istio-injection=enabled
    
Secret 생성
  1. WDT 실행으로 만들어지 헬프 스크립트(v8o/create_k8s_secrets.sh)로 secret을 만듭니다.

  2. 아래 username과 password를 원하는 값으로 변경합니다.

    • weblogic 관리자 이름, 암호
    • ToDo 애플리케이션이 사용할 MySQL DB 유저 이름, 암호
      • 여기서 만들어지는 secret으로 OKE에 배포될 MySQL도 바라보게 해야 합니다. 이후 배포되는 예제는 사전에 그렇게 설정되어 있습니다.
    # Update <user> and <password> for weblogic-credentials
    create_paired_k8s_secret weblogic-credentials <user> <password>
    
    # Update <user> and <password> for jdbc-tododb
    create_paired_k8s_secret jdbc-tododb tododb <password>
    
    # Update <password> used to encrypt model and domain hashes
    # This secret is only required for model-in-image deployments
    create_k8s_secret runtime-encryption-secret <password>
    
  3. 스크립트를 실행합니다.

    • 기본적으로 도메인 이름(tododomain)의 namespace에 생성됩니다. create_k8s_secrets.sh 설정 참고
    $ ./create_k8s_secrets.sh
    secret/tododomain-weblogic-credentials created
    secret/tododomain-weblogic-credentials labeled
    secret/tododomain-jdbc-tododb created
    secret/tododomain-jdbc-tododb labeled
    secret/tododomain-runtime-encryption-secret created
    secret/tododomain-runtime-encryption-secret labeled
    $ kubectl get secret -n tododomain
    NAME                                   TYPE                                  DATA   AGE
    default-token-snckl                    kubernetes.io/service-account-token   3      7m58s
    tododomain-jdbc-tododb                 Opaque                                2      93s
    tododomain-runtime-encryption-secret   Opaque                                1      83s
    tododomain-weblogic-credentials        Opaque                                2      103s
    
  4. OCIR에서 이미지를 가져오기 위한 imagePullSecret을 만듭니다. v8o/vz-application.yaml을 보면 tododomain-registry-credentials으로 사용하고 있습니다. 동일한 이름으로 secret을 생성합니다.

    kubectl create secret docker-registry tododomain-registry-credentials \
      --docker-server=<region-key>.ocir.io \
      --docker-email=your.name@example.com \
      --docker-username=<tenancy-namespace>/<username> \
      --docker-password='<AUTH_TOKEN>' \
      --namespace=tododomain
    
Verrazzano에 애플리케이션 배포

배포되는 예제 애플리케이션은 MySQL DB를 저장소로 사용하고 있습니다. OKE에 이관된 WebLogic Server 위에 애플리케이션도 구동을 위해서는 MySQL DB가 필요합니다. 문서 예제에서는 MySQL DB를 Verrazzano Component로 배포하고 있으며, 해당 Component를 사용하도록 v8o/vz-application.yaml에서 Data Source 주소를 변경하고 있습니다. 이 배포되는 MySQL DB Component가 배포시 앞서 만들 jdbc-tododb secret을 사용합니다.

MySQL Component 배포
  1. mysql-oam.yaml 파일을 다운로드 받습니다.

  2. 아래와 같이 다운로드 받은 YAML 파일을 배포합니다.

    [opc@bastion-host v8o (|managed-cluster-1:default)]$ kubectl apply -f mysql-oam.yaml
    component.core.oam.dev/todo-mysql-service created
    component.core.oam.dev/todo-mysql-deployment created
    component.core.oam.dev/todo-mysql-configmap created
    [opc@bastion-host v8o (|managed-cluster-1:default)]$ kubectl get component -n tododomain
    NAME                    WORKLOAD-KIND   AGE
    todo-mysql-configmap    ConfigMap       13s
    todo-mysql-deployment   Deployment      13s
    todo-mysql-service      Service         13s
    
Verrazzano 배포용 application configuration설정 업데이트
  1. v8o/vz-application.yaml에 component 3개 추가

    apiVersion: core.oam.dev/v1alpha2
    kind: ApplicationConfiguration
    metadata:
      name: tododomain-appconf
      ...
    spec:
      components:
        - componentName: tododomain-domain
          ...
        - componentName: tododomain-configmap
        - componentName: todo-mysql-service
        - componentName: todo-mysql-deployment
        - componentName: todo-mysql-configmap    
    
  2. v8o/vz-application.yaml에 Data Source의 URL 업데이트

    apiVersion: core.oam.dev/v1alpha2
    kind: Component
    metadata:
      name: tododomain-configmap
      ...
    spec:
      workload:
        ...
        data:
          wdt_jdbc.yaml: |
            resources:
              JDBCSystemResource:
                'tododb':
                  JdbcResource:
                    JDBCDriverParams:
                      # This is the URL of the database used by the WebLogic Server application
                      URL: "jdbc:mysql://mysql.tododomain.svc.cluster.local:3306/tododb"        
    
애플리케이션(ToDo 애플리케이션 + MySQL) 배포
  1. 애플리케이션을 Verrazzano가 설치된 OKE에 배포합니다.

    $ kubectl apply -f vz-application.yaml
    applicationconfiguration.core.oam.dev/tododomain-appconf created
    component.core.oam.dev/tododomain-domain created
    component.core.oam.dev/tododomain-configmap created
    
  2. tododomain-appconf 애플리케이션이 배포되고 VerrazzanoWebLogicWorkload 유형의 tododomain-domain이 배포됩니다.

    #v8o/vz-application.yaml 참고
    ...
    ---
    apiVersion: core.oam.dev/v1alpha2
    kind: Component
    metadata:
      name: tododomain-domain
      namespace: tododomain
    spec:
      workload:
        apiVersion: oam.verrazzano.io/v1alpha1
        kind: VerrazzanoWebLogicWorkload
    ...
    
  3. 배포가 완료되고 POD가 기동됩니다.

    $ kubectl get pod -n tododomain
    NAME                     READY   STATUS    RESTARTS   AGE
    mysql-7bfb67d9f8-gn4qc   2/2     Running   0          5m35s
    tododomain-adminserver   4/4     Running   0          3m16s
    
  4. istio상의 애플리케이션 주소를 확인합니다.

    kubectl get gateway tododomain-tododomain-appconf-gw \
        -n tododomain \
        -o jsonpath={.spec.servers[0].hosts[0]}; echo
    
    • 결과 예시

      $ kubectl get gateway tododomain-tododomain-appconf-gw \
      >     -n tododomain \
      >     -o jsonpath={.spec.servers[0].hosts[0]}; echo
      tododomain-appconf.tododomain.thekoguryo.ml
      
  5. /todo를 추가하여 애플리케이션에 접속할 수 있습니다.

    https://tododomain-appconf.tododomain.thekoguryo.ml/todo

  6. On-Premise와 동일하게 데이터 초기화하여 MySQL DB Component와 연결되어 데이터가 정상 입력되는 것을 확인할 수 있습니다.

    https://tododomain-appconf.tododomain.thekoguryo.ml/todo/rest/items/init

WebLogic Admin Console 접속
  1. 기본 배포되면 애플리케이션만 istio ingress에 등록되어 있어, WebLogic Admin Console은 포트 포워딩을 통해 접속합니다.

    kubectl port-forward pods/tododomain-adminserver 7001:7001 -n tododomain
    
  2. 다만 포트 포워딩 에러가 나는 경우, 아래와 같이 ingress에 노출하여 외부에서 접속하게 추가할 수도 있습니다. 운영에서는 Public IP로 접근은 추천하지 않습니다.

    • vz-application.yaml을 아래와 같이 - path: “/console” 포함 2줄을 추가하고 다시 배포(kubectl apply -f vz-application.yaml)합니다.

      ...
      apiVersion: core.oam.dev/v1alpha2
      kind: ApplicationConfiguration
      metadata:
        name: tododomain-appconf
        ...
      spec:
        components:
          - componentName: tododomain-domain
            traits:
              - trait:
                  ...
              - trait:
                  apiVersion: oam.verrazzano.io/v1alpha1
                  kind: IngressTrait
                  spec:
                    rules:
                      - paths:
                          # application todo
                          - path: "/todo"
                            pathType: Prefix
                          - path: "/console"
                            pathType: Prefix
      ...
      
  3. 이전 주소에서 /todo 대신 /console로 접속하고 v8o/create_k8s_secrets.sh 에서 입력한 WebLogic 관리자 이름, 암호를 사용합니다.

    https://tododomain-appconf.tododomain.thekoguryo.ml/console

    image-20220107184435029

모니터링

로그 모니터링(Elasticsearch / Kibana)
  1. Verrazzano 콘솔에서 Kibana 링크를 클릭합니다. SSO 구성이 되어 추가 로그인은 필요없습니다.

  2. 단일 클러스터와 배포시와 동일한 방법으로 verrazzano-namespace-hello-helidon 네임스페이스로 인덱스 패턴을 생성합니다.

  3. kubectl로 조회한 컨테이너 로그가 Kibana에서 생성한 인덱스 패턴에 대해 수집된 로그, 대상 namespace 상의 전체 수집된 로그가 보입니다.

    • 로그 조회

      $ kubectl logs tododomain-adminserver -n tododomain -c weblogic-server -f
      ...
      <Jan 7, 2022 9:21:58,416 AM UTC> <Notice> <WebLogicServer> <BEA-000331> <Started the WebLogic Server Administration Server "AdminServer" for domain "tododomain" running in development mode.>
      <Jan 7, 2022 9:21:58,416 AM UTC> <Notice> <Server> <BEA-002613> <Channel "Default" is now listening on 10.244.1.15:7001 for protocols iiop, t3, ldap, snmp, http.>
      <Jan 7, 2022 9:21:58,416 AM UTC> <Notice> <Server> <BEA-002613> <Channel "http-probe" is now listening on 127.0.0.1:8888 for protocols http.>
      <Jan 7, 2022 9:21:58,416 AM UTC> <Notice> <Server> <BEA-002613> <Channel "http-probe-ext" is now listening on 10.244.1.15:8888 for protocols http.>
      <Jan 7, 2022 9:21:58,417 AM UTC> <Notice> <Server> <BEA-002613> <Channel "Default" is now listening on 10.244.1.15:7001 for protocols iiop, t3, ldap, snmp, http.>
      <Jan 7, 2022 9:21:58,417 AM UTC> <Notice> <Server> <BEA-002613> <Channel "http-probe" is now listening on 127.0.0.1:8888 for protocols http.>
      <Jan 7, 2022 9:21:58,417 AM UTC> <Notice> <Server> <BEA-002613> <Channel "http-probe-ext" is now listening on 10.244.1.15:8888 for protocols http.>
      <Jan 7, 2022 9:21:58,428 AM UTC> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.>
      Successfully started server AdminServer ...
      ...
      
    • Kibana

      image-20220107213201264

메트릭 모니터링(Prometheus / Grafana)
  1. Verrazzano 콘솔에서 Grafana 링크를 클릭합니다. SSO 구성이 되어 추가 로그인은 필요없습니다.

  2. 기본 제공하고 있는 대쉬보드 중에 WebLogic Server 대쉬보드를 선택합니다.

  3. 기본 제공하는 WebLogic Server 대쉬보드를 통해 Verrazzano가 관리하는 모든 클러스터 상에 있는 WebLogic 기반 컨테이너의 상태를 모니터링 할 수 있습니다.

    image-20220107185037749



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 7 Jan 2022