OpenShift 기반 Fuse 가이드


Red Hat Fuse 7.4

OpenShift에서 Red Hat Fuse를 사용하여 설치 및 개발

Fuse Documentation Team

초록

OpenShift에서 Fuse 사용 가이드

머리말

OpenShift의 Red Hat Fuse를 사용하면 OpenShift Container Platform에 Fuse 애플리케이션을 배포할 수 있습니다.

1장. 시작하기 전

릴리스 노트

이 릴리스에 대한 중요한 정보는 릴리스 노트 에서 참조하십시오.

버전 호환성 및 지원

버전 호환성 및 지원에 대한 자세한 내용은 Red Hat JBoss Fuse 지원 구성 페이지를 참조하십시오.

Windows O/S 지원

OpenShift의 Fuse용 개발자 툴링(oc 클라이언트 및 컨테이너 개발 키트)은 Windows O/S에서 완전히 지원됩니다. Linux 명령줄 구문에 표시된 예제는 Windows O/S에서도 작동할 수 있으며 Windows 명령줄 구문을 따르도록 적절하게 수정되는 경우입니다.

1.1. 비교: OpenShift에서 Fuse 독립 실행형 및 Fuse

몇 가지 주요 기능 차이점이 있습니다.

  • OpenShift에서 Fuse를 사용한 애플리케이션 배포는 Docker 이미지 내에 패키지된 애플리케이션 및 모든 필수 런타임 구성 요소로 구성됩니다. 애플리케이션은 Fuse Standalone과 마찬가지로 런타임에 배포되지 않으며, 애플리케이션 이미지 자체는 OpenShift를 통해 배포 및 관리되는 완전한 런타임 환경입니다.
  • OpenShift 환경에서 패치는 Fuse Standalone과 다릅니다. 각 애플리케이션 이미지는 완전한 런타임 환경이므로 마찬가지입니다. 패치를 적용하기 위해 애플리케이션 이미지가 다시 빌드되어 OpenShift 내에서 재배포됩니다. 핵심 OpenShift 관리 기능을 사용하면 롤링 업그레이드 및 병렬 배포를 통해 업그레이드 중에 애플리케이션의 가용성을 유지할 수 있습니다.
  • Fuse에서 Fabric에서 제공하는 프로비저닝 및 클러스터링 기능은 Kubernetes 및 OpenShift에서 동등한 기능으로 교체되었습니다. OpenShift가 애플리케이션을 배포하고 확장하는 과정의 일부로 이 작업을 자동으로 수행하므로 개별 하위 컨테이너를 만들거나 구성할 필요가 없습니다.
  • Fabric 엔드포인트는 OpenShift 환경 내에서 사용되지 않습니다. 대신 Kubernetes 서비스를 사용해야 합니다.
  • 메시징 서비스는 A-MQ for OpenShift 이미지를 사용하여 생성 및 관리되며 Karaf 컨테이너에는 직접 포함되지 않습니다. OpenShift의 Fuse는 Kubernetes를 통해 OpenShift의 메시징 서비스에 원활하게 연결할 수 있도록 향상된 버전의 camel-amq 구성 요소를 제공합니다.
  • Karaf 쉘을 사용하여 Karaf 인스턴스를 실행하는 실시간 업데이트는 애플리케이션 컨테이너를 다시 시작하거나 확장하면 업데이트가 유지되지 않으므로 권장되지 않습니다. 이는 불변 아키텍처의 기본이며 OpenShift 내에서 확장성 및 유연성을 달성하는 데 필수적입니다.
  • Red Hat Fuse 구성 요소에 직접 연결된 Maven 종속 항목은 Red Hat에서 지원합니다. 사용자가 도입한 타사 Maven 종속 항목은 지원되지 않습니다.
  • SSH 에이전트는 Apache Karaf micro-container에 포함되어 있지 않으므로 bin/client 콘솔 클라이언트를 사용하여 연결할 수 없습니다.
  • OpenShift 애플리케이션의 Fuse 내의 프로토콜 호환성 및 Camel 구성 요소: HTTP 기반이 아닌 통신은 TLS 및 SNI를 사용하여 OpenShift 외부에서 Fuse 서비스(Camel 소비자 끝점)로 라우팅할 수 있어야 합니다.

2장. 관리자 시작하기

OpenShift 관리자인 경우 다음을 통해 OpenShift 배포에 대해 OpenShift 클러스터를 준비할 수 있습니다.

  1. Red Hat Container Registry에 대한 인증 구성.
  2. OpenShift 이미지 및 템플릿에 Fuse 설치.

2.1. Red Hat Container Registry Authentication 구성

OpenShift 이미지 스트림 및 템플릿에서 Red Hat Fuse를 가져오고 사용하려면 Red Hat 컨테이너 레지스트리에 대한 인증을 구성해야 합니다.

프로세스

  1. 관리자로 OpenShift Server에 로그인합니다.

    oc login -u system:admin
    Copy to Clipboard
  2. 이미지 스트림을 설치하려는 OpenShift 프로젝트에 로그인합니다. OpenShift 이미지 스트림에서 Fuse 프로젝트를 사용하는 것이 좋습니다.

    oc project openshift
    Copy to Clipboard
  3. Red Hat Customer Portal 계정 또는 Red Hat Developer Program 계정 자격 증명을 사용하여 docker-registry 시크릿을 생성합니다. & lt;pull_secret_name >을 생성하려는 보안 이름으로 바꿉니다.

    oc create secret docker-registry <pull_secret_name> \
      --docker-server=registry.redhat.io \
      --docker-username=CUSTOMER_PORTAL_USERNAME \
      --docker-password=CUSTOMER_PORTAL_PASSWORD \
      --docker-email=EMAIL_ADDRESS
    Copy to Clipboard
    참고

    이미지 스트림이 있고 registry.redhat.io를 사용하는 모든 네임스페이스에 docker-registry 시크릿을 생성해야 합니다.

  4. Pod의 이미지를 가져오는 데 시크릿을 사용하려면 서비스 계정에 보안을 추가합니다. 서비스 계정 이름은 서비스 계정 Pod에서 사용하는 이름과 일치해야 합니다. 다음 예제에서는 default 서비스 계정을 사용합니다.

    oc secrets link default <pull_secret_name> --for=pull
    Copy to Clipboard
  5. 빌드 이미지를 푸시하고 가져오는 데 시크릿을 사용하려면 Pod 내부에서 보안을 마운트할 수 있어야 합니다. 시크릿을 마운트하려면 다음 명령을 사용합니다.

    oc secrets link builder <pull_secret_name>
    Copy to Clipboard

Red Hat 계정 사용자 이름과 암호를 사용하여 시크릿을 생성하지 않으려면 레지스트리 서비스 계정을 사용하여 인증 토큰을 생성해야 합니다.

자세한 내용은 다음을 참조하십시오.

2.2. OpenShift 4.x Server에 Fuse Imagestreams 및 템플릿 설치

OpenShift Container Platform 4.1은 OpenShift 네임스페이스에서 작동하는 Samples Operator를 사용하여 RHEL(Red Hat Enterprise Linux) 기반 OpenShift Container Platform 이미지 스트림 및 템플릿을 설치하고 업데이트합니다. OpenShift 이미지 스트림 및 템플릿에 Fuse를 설치하려면 다음을 수행합니다.

  • Samples Operator 재구성
  • Fuse 이미지 스트림과 템플릿을 Skipped Imagestreams 및 Skipped Templates 필드에 추가합니다.

    • 건너뛴 이미지 스트림: Samples Operator 인벤토리에 있지만 클러스터 관리자가 Operator에서 무시하거나 관리하지 않도록 하려는 이미지 스트림입니다.
    • 건너뛰기된 템플릿: Samples Operator 인벤토리에 있지만 클러스터 관리자가 Operator에서 무시하거나 관리하지 않도록 하려는 템플릿입니다.

사전 요구 사항

  • OpenShift Server에 액세스할 수 있습니다.
  • Red Hat Container Registry에 대한 인증을 구성했습니다.
  • 선택적으로 설치한 후 OpenShift 대시보드에 Fuse 템플릿을 표시하려면 먼저 OpenShift 문서( https://docs.openshift.com/container-platform/4.1/applications/service_brokers/installing-service-catalog.html)에 설명된 대로 서비스 카탈로그 및 템플릿 서비스 브로커를 설치해야 합니다.https://docs.openshift.com/container-platform/4.1/applications/service_brokers/installing-service-catalog.html

프로세스

  1. OpenShift 4 Server를 시작합니다.
  2. 관리자로 OpenShift 서버에 로그인합니다.

    oc login -u system:admin
    Copy to Clipboard
  3. docker-registry 시크릿을 생성한 프로젝트를 사용하고 있는지 확인합니다.

    oc project openshift
    Copy to Clipboard
  4. Samples Operator의 현재 구성을 확인합니다.

    oc get configs.samples.operator.openshift.io -n openshift-cluster-samples-operator -o yaml
    Copy to Clipboard
  5. 추가된 fuse 템플릿 및 이미지 스트림을 무시하도록 Samples Operator를 구성합니다.

    oc edit configs.samples.operator.openshift.io -n openshift-cluster-samples-operator
    Copy to Clipboard
  6. Fuse 이미지 스트림과 템플릿을 각각 Skipped Imagestreams 및 Skipped Templates 섹션에 추가합니다.

    [...]
    spec:
      architectures:
      - x86_64
      managementState: Managed
      skippedImagestreams:
      - fis-java-openshift
      - fis-karaf-openshift
      - fuse7-console
      - fuse7-eap-openshift
      - fuse7-java-openshift
      - fuse7-karaf-openshift
      - jboss-fuse70-console
      - jboss-fuse70-eap-openshift
      - jboss-fuse70-java-openshift
      - jboss-fuse70-karaf-openshift
      - fuse-apicurito-generator
      - apicurito-ui
      skippedTemplates:
      - s2i-fuse74-eap-camel-amq
      - s2i-fuse74-eap-camel-cdi
      - s2i-fuse74-eap-camel-cxf-jaxrs
      - s2i-fuse74-eap-camel-cxf-jaxws
      - s2i-fuse74-eap-camel-jpa
      - s2i-fuse74-karaf-camel-amq
      - s2i-fuse74-karaf-camel-log
      - s2i-fuse74-karaf-camel-rest-sql
      - s2i-fuse74-karaf-cxf-rest
      - s2i-fuse74-spring-boot-camel
      - s2i-fuse74-spring-boot-camel-amq
      - s2i-fuse74-spring-boot-camel-config
      - s2i-fuse74-spring-boot-camel-drools
      - s2i-fuse74-spring-boot-camel-infinispan
      - s2i-fuse74-spring-boot-camel-rest-sql
      - s2i-fuse74-spring-boot-camel-xa
      - s2i-fuse74-spring-boot-camel-xml
      - s2i-fuse74-spring-boot-cxf-jaxrs
    Copy to Clipboard
  7. OpenShift 이미지 스트림에 Fuse를 설치합니다.

    BASEURL=https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003
    
    oc create -n openshift -f ${BASEURL}/fis-image-streams.json
    Copy to Clipboard
  8. 빠른 시작 템플릿을 설치합니다.

    for template in eap-camel-amq-template.json \
     eap-camel-cdi-template.json \
     eap-camel-cxf-jaxrs-template.json \
     eap-camel-cxf-jaxws-template.json \
     eap-camel-jpa-template.json \
     karaf-camel-amq-template.json \
     karaf-camel-log-template.json \
     karaf-camel-rest-sql-template.json \
     karaf-cxf-rest-template.json \
     spring-boot-camel-amq-template.json \
     spring-boot-camel-config-template.json \
     spring-boot-camel-drools-template.json \
     spring-boot-camel-infinispan-template.json \
     spring-boot-camel-rest-sql-template.json \
     spring-boot-camel-template.json \
     spring-boot-camel-xa-template.json \
     spring-boot-camel-xml-template.json \
     spring-boot-cxf-jaxrs-template.json \
     spring-boot-cxf-jaxws-template.json ;
     do
     oc create -n openshift -f \
     https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/quickstarts/${template}
     done
    Copy to Clipboard
  9. Fuse Console용 템플릿을 설치합니다.

    oc create -n openshift -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-cluster-template.json
    oc create -n openshift -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-namespace-template.json
    Copy to Clipboard
    참고

    Fuse Console 배포에 대한 자세한 내용은 OpenShift에 Fuse Console 설정을 참조하십시오.

  10. (선택 사항) OpenShift 이미지 및 템플릿에서 설치된 Fuse를 확인합니다.

    oc get template -n openshift
    Copy to Clipboard

2.3. OpenShift 4.x Server에 Apicurito Operator 설치

Red Hat Fuse on OpenShift는 REST API를 설계하는 데 사용할 수 있는 웹 기반 API인 Apicurito를 제공합니다. 새로운 Apicurito Operator는 Openshift Container Platform 4.1에 설치 및 업그레이드를 단순화합니다. Fuse 7.4의 경우 OperatorHub에서 Apicurito Operator를 사용할 수 있습니다. 다음 단계에 따라 Operator를 설치합니다.

사전 요구 사항

  • OpenShift Server에 액세스할 수 있습니다.
  • Red Hat Container Registry에 대한 인증을 구성했습니다.

프로세스

  1. OpenShift 4.x 서버를 시작합니다.
  2. 브라우저에서 OpenShift 콘솔로 이동합니다. 인증 정보를 사용하여 콘솔에 로그인합니다.
  3. Catalog 를 클릭한 다음 OperatorHub 를 클릭합니다.
  4. 검색 필드 창에 Apicurito 를 입력하고 Enter 키를 누릅니다. 오른쪽 패널에 Apicurito Operator를 볼 수 있습니다.
  5. Apicurito Operator 를 클릭합니다. Apicurito Operator 설치 창이 표시됩니다.
  6. 설치를 클릭합니다. Create Operator Subscription 양식이 표시됩니다. 양식에는 다음에 대한 옵션이 있습니다.

    • 설치 모드
    • 업데이트 채널
    • 승인 전략.

      기본 설정에 따라 선택하거나 기본값을 유지할 수 있습니다.

  7. Subscribe를 클릭합니다. 이제 Apicurito Operator가 선택한 네임스페이스에 설치됩니다.
  8. 확인하려면 카탈로그 를 클릭한 다음 Installed Operator 를 클릭합니다. Apicurito Operator는 목록에서 확인할 수 있습니다.
  9. Name 열에서 Apicurito Operator 를 클릭합니다. 제공된 API 에서 새로 만들기 클릭합니다. 새 CRD(Custom Resource Definition)가 기본값을 사용하여 생성됩니다. 다음 필드는 CR의 일부로 지원됩니다.

    • size: apicurito Operator의 Pod 수입니다.
    • image: apicurito 이미지. 기존 설치에서 이 이미지를 변경하면 Operator 업그레이드가 트리거됩니다.
  10. 생성을 클릭합니다. 그러면 새 apicurito-service 가 생성됩니다.

2.4. OpenShift 3.x Server에 Fuse 이미지 스트림 및 템플릿 설치

Red Hat 컨테이너 레지스트리에 대한 인증을 구성한 후 OpenShift 이미지 스트림 및 템플릿에서 Red Hat Fuse를 가져와서 사용합니다.

프로세스

  1. OpenShift Server를 시작합니다.
  2. 관리자로 OpenShift 서버에 로그인합니다.

    oc login -u system:admin
    Copy to Clipboard
  3. docker-registry 시크릿을 생성한 프로젝트를 사용하고 있는지 확인합니다.

    oc project openshift
    Copy to Clipboard
  4. OpenShift 이미지 스트림에 Fuse를 설치합니다.

    BASEURL=https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003
    
    oc create -n openshift -f ${BASEURL}/fis-image-streams.json
    Copy to Clipboard
  5. 빠른 시작 템플릿을 설치합니다.

    for template in eap-camel-amq-template.json \
     eap-camel-cdi-template.json \
     eap-camel-cxf-jaxrs-template.json \
     eap-camel-cxf-jaxws-template.json \
     eap-camel-jpa-template.json \
     karaf-camel-amq-template.json \
     karaf-camel-log-template.json \
     karaf-camel-rest-sql-template.json \
     karaf-cxf-rest-template.json \
     spring-boot-camel-amq-template.json \
     spring-boot-camel-config-template.json \
     spring-boot-camel-drools-template.json \
     spring-boot-camel-infinispan-template.json \
     spring-boot-camel-rest-sql-template.json \
     spring-boot-camel-template.json \
     spring-boot-camel-xa-template.json \
     spring-boot-camel-xml-template.json \
     spring-boot-cxf-jaxrs-template.json \
     spring-boot-cxf-jaxws-template.json ;
     do
     oc create -n openshift -f \
     https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/quickstarts/${template}
     done
    Copy to Clipboard
  6. Fuse Console용 템플릿을 설치합니다.

    oc create -n openshift -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-cluster-template.json
    oc create -n openshift -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-namespace-template.json
    Copy to Clipboard
    참고

    Fuse Console 배포에 대한 자세한 내용은 OpenShift에 Fuse Console 설정을 참조하십시오.

  7. Apicurito 템플릿을 설치합니다.

    oc create -n openshift -f ${BASEURL}/fuse-apicurito.yml
    Copy to Clipboard
  8. (선택 사항) OpenShift 이미지 및 템플릿에서 설치된 Fuse를 확인합니다.

    oc get template -n openshift
    Copy to Clipboard

3장. OpenShift에 Fuse를 비관리자 사용자로 설치

OpenShift에서 Fuse를 사용하여 애플리케이션을 생성하고 OpenShift에 배포할 수 있습니다. 먼저 OpenShift 이미지 및 템플릿에 Fuse를 설치해야 합니다.

3.1. OpenShift 이미지 및 템플릿에 Fuse를 비관리자 사용자로 설치

사전 요구 사항

  • OpenShift 서버에 액세스할 수 있습니다. CDK 또는 원격 OpenShift 서버별 가상 OpenShift 서버일 수 있습니다.
  • Red Hat Container Registry에 대한 인증을 구성했습니다.

자세한 내용은 다음을 참조하십시오.

프로세스

  1. OpenShift 프로젝트에서 Fuse를 빌드하고 배포할 수 있도록 다음과 같이 OpenShift Server에 로그인합니다.

    oc login -u developer -p developer https://OPENSHIFT_IP_ADDR:8443
    Copy to Clipboard

    여기서 OPENSHIFT_IP_ADDR 은 이 IP 주소가 항상 동일하지 않기 때문에 OpenShift 서버의 IP 주소 자리 표시자입니다.

    참고

    developer 사용자(개발 암호 포함)는 CDK를 통해 가상 OpenShift Server에서 자동으로 생성되는 표준 계정입니다. 원격 서버에 액세스하는 경우 OpenShift 관리자가 제공한 URL 및 인증 정보를 사용합니다.

  2. test 라는 새 프로젝트 네임스페이스를 생성합니다(아직 존재하지 않는다고 가정).

    oc new-project test
    Copy to Clipboard

    test 프로젝트 네임스페이스가 이미 있는 경우 해당 네임스페이스로 전환합니다.

    oc project test
    Copy to Clipboard
  3. OpenShift 이미지 스트림에 Fuse를 설치합니다.

    BASEURL=https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003
    
    oc create -n test -f ${BASEURL}/fis-image-streams.json
    Copy to Clipboard

    명령 출력에는 OpenShift 프로젝트의 Fuse에서 사용할 수 있는 Fuse 이미지 스트림이 표시됩니다.

  4. 빠른 시작 템플릿을 설치합니다.

    for template in eap-camel-amq-template.json \
     eap-camel-cdi-template.json \
     eap-camel-cxf-jaxrs-template.json \
     eap-camel-cxf-jaxws-template.json \
     eap-camel-jpa-template.json \
     karaf-camel-amq-template.json \
     karaf-camel-log-template.json \
     karaf-camel-rest-sql-template.json \
     karaf-cxf-rest-template.json \
     spring-boot-camel-amq-template.json \
     spring-boot-camel-config-template.json \
     spring-boot-camel-drools-template.json \
     spring-boot-camel-infinispan-template.json \
     spring-boot-camel-rest-sql-template.json \
     spring-boot-camel-template.json \
     spring-boot-camel-xa-template.json \
     spring-boot-camel-xml-template.json \
     spring-boot-cxf-jaxrs-template.json \
     spring-boot-cxf-jaxws-template.json ;
     do
     oc create -n test -f \
     ${BASEURL}/quickstarts/${template}
     done
    Copy to Clipboard
  5. Fuse Console용 템플릿을 설치합니다.

    oc create -n test -f ${BASEURL}/fis-console-cluster-template.json
    oc create -n test -f ${BASEURL}/fis-console-namespace-template.json
    Copy to Clipboard
    참고

    Fuse Console 배포에 대한 자세한 내용은 OpenShift에 Fuse Console 설정을 참조하십시오.

  6. (선택 사항) OpenShift 이미지 및 템플릿에서 설치된 Fuse를 확인합니다.

    oc get template -n test
    Copy to Clipboard
  7. 브라우저에서 OpenShift 콘솔로 이동합니다.

    1. https://OPENSHIFT_IP_ADDR:8443 을 사용하고 OPENSHIFT_IP_ADDR 을 OpenShift 서버의 IP 주소로 바꿉니다.
    2. 인증 정보를 사용하여 OpenShift 콘솔에 로그인합니다(예: 사용자 이름 developer 및 암호 developer).

4장. 개발자를 위한 시작하기

4.1. 개발 환경 준비

OpenShift 프로젝트에서 Fuse를 개발하고 테스트하는 데 필요한 기본적인 요구 사항은 OpenShift Server에 액세스하는 것입니다. 다음과 같은 기본 대안이 있습니다.

4.1.1. 로컬 머신에 컨테이너 개발 키트(CDK) 설치

개발자로서 빠르게 시작하려는 경우 가장 실용적인 대안은 로컬 시스템에 Red Hat CDK 를 설치하는 것입니다. CDK를 사용하여 RHEL(Red Hat Enterprise Linux) 7에서 OpenShift 이미지를 실행하는 VM(가상 머신) 인스턴스를 부팅할 수 있습니다. CDK 설치는 다음 주요 구성 요소로 구성됩니다.

  • 가상 머신(libvirt, Cryostat 또는 Hyper-V)
  • Minishift: 컨테이너 개발 환경 시작 및 관리
중요

Red Hat CDK는 개발 목적으로만 사용됩니다. 프로덕션 환경과 같은 다른 용도로는 사용되지 않으며 알려진 보안 취약점을 해결하지 못할 수 있습니다. docker 형식의 컨테이너 내에서 미션 크리티컬 애플리케이션을 완전히 실행하려면 활성 RHEL 7 또는 RHEL Atomic 서브스크립션이 필요합니다. 자세한 내용은 Red Hat Container Development Kit (CDK) 지원을 참조하십시오.

사전 요구 사항

  • Java 버전

    개발자 시스템에서 Fuse 7.4에서 지원하는 Java 버전을 설치했는지 확인합니다. 지원되는 Java 버전에 대한 자세한 내용은 지원되는 구성을 참조하십시오.

프로세스

로컬 시스템에 CDK를 설치하려면 다음을 수행합니다.

  1. OpenShift의 Fuse의 경우 CDK 버전 3.9를 설치하는 것이 좋습니다. CDK 3.9 설치 및 사용에 대한 자세한 지침은 Red Hat CDK 3.9 시작 가이드에서 제공됩니다.
  2. Red Hat Container Registry 인증 구성 지침에 따라 Red Hat 컨테이너 레지스트리에 액세스하도록 OpenShift 인증 정보를 구성합니다.
  3. 2장. 관리자 시작하기 에 설명된 대로 OpenShift 이미지 및 템플릿에 Fuse를 수동으로 설치합니다.

    참고

    CDK 버전에는 OpenShift 이미지 및 템플릿에 Fuse가 사전 설치되어 있을 수 있습니다. 그러나 OpenShift 인증 정보를 구성한 후 OpenShift 이미지 및 템플릿에 Fuse를 설치(또는 업데이트)해야 합니다.

  4. 이 장의 예제를 진행하기 전에 Red Hat CDK 3.9 시작 가이드 의 내용을 읽고 이해해야 합니다.

4.1.2. 기존 OpenShift Server에 대한 원격 액세스 가져오기

IT 부서에서 이미 일부 서버 시스템에 OpenShift 클러스터를 설정했을 수 있습니다. 이 경우 OpenShift에서 Fuse를 시작하려면 다음 요구 사항을 충족해야 합니다.

  • 서버 머신은 지원되는 OpenShift Container Platform 버전을 실행해야 합니다( 지원 구성 페이지에 설명되어 있음). 이 가이드의 예제는 3.11 버전에 대해 테스트되었습니다.
  • OpenShift 관리자에게 OpenShift 컨테이너 기본 이미지에 최신 Fuse를 설치하고 OpenShift 서버의 OpenShift 템플릿에 Fuse를 설치하도록 요청합니다.
  • 일반적인 개발자 권한이 있는 사용자 계정을 작성하도록 OpenShift 관리자에게 문의하십시오(OpenShift 프로젝트를 생성, 배포 및 실행할 수 있음).
  • 관리자에게 OpenShift Server의 URL(사용 중 하나를 사용하여 OpenShift 콘솔로 이동하거나 oc 명령줄 클라이언트를 사용하여 OpenShift에 연결할 수 있음) 및 계정의 로그인 인증 정보를 요청합니다.

4.1.3. 클라이언트-Side 툴 설치

개발자 시스템에 다음 도구가 설치되어 있는 것이 좋습니다.

  • Apache Maven 3.6.x: OpenShift 프로젝트의 로컬 빌드에 필요합니다. Apache Maven 다운로드 페이지에서 적절한 패키지를 다운로드합니다. 3.6.x 이상 버전이 설치되어 있는지 확인합니다. 그러지 않으면 프로젝트를 빌드할 때 Maven에 종속성을 해결하는 데 문제가 있을 수 있습니다.
  • Git: OpenShift S2I 소스 워크플로우에 필요하며 일반적으로 OpenShift 프로젝트에서 Fuse의 소스 제어에 권장됩니다. Git 다운로드 페이지에서 적절한 패키지를 다운로드합니다.
  • OpenShift 클라이언트: CDK를 사용하는 경우 쉘에 입력하는 데 필요한 명령을 표시하는 Mini shift oc -env 를 사용하여 PATH에 oc 바이너리를 추가할 수 있습니다( oc-env 의 출력은 OS 및 쉘 유형에 따라 다릅니다).

    $ minishift oc-env
    export PATH="/Users/john/.minishift/cache/oc/v1.5.0:$PATH"
    # Run this command to configure your shell:
    # eval $(minishift oc-env)
    Copy to Clipboard

    자세한 내용은 CDK 3.9 시작 가이드 의 OpenShift 클라이언트 바이너리 사용을 참조하십시오.

    CDK를 사용하지 않는 경우 CLI 참조 의 지침에 따라 oc 클라이언트 툴을 설치합니다.

  • (선택 사항) Docker 클라이언트: 고급 사용자가 Docker 클라이언트 도구를 설치하는 것이 편리합니다(OpenShift 서버에서 실행되는 docker 데몬과 통신하기 위해). 운영 체제의 특정 바이너리 설치에 대한 자세한 내용은 Docker 설치 사이트를 참조하십시오.

    자세한 내용은 CDK 3.9 시작 가이드 의 docker Daemon 재사용 을 참조하십시오.

    중요

    OpenShift Server에서 실행 중인 OpenShift 버전과 호환되는 oc 툴 버전 및 docker 툴을 설치해야 합니다.

추가 리소스

(선택 사항) Red Hat JBoss CodeReady Studio: Red Hat JBoss CodeReady Studio 는 OpenShift 애플리케이션에서 Fuse 개발을 지원하는 Eclipse 기반 개발 환경입니다. 이 개발 환경을 설치하는 방법에 대한 자세한 내용은 Red Hat JBoss CodeReady Studio 설치를 참조하십시오.

4.1.4. Maven 리포지토리 구성

로컬 시스템에서 OpenShift 프로젝트에 Fuse를 빌드하는 데 필요한 archetypes 및 아티팩트를 보유하는 Maven 리포지토리를 구성합니다.

프로세스

  1. 일반적으로 ~/.m2/ settings.xml (Linux 또는 macOS) 또는 Documents 및 Settings\<USER_NAME>\.m2\settings.xml(Windows의 경우)에 있는 Maven settings.xml 파일을 엽니다.
  2. 다음 Maven 리포지토리를 추가합니다.

4.2. OpenShift에서 Fuse에서 애플리케이션 생성 및 배포

OpenShift에서 Fuse를 사용하여 애플리케이션을 생성하고 다음 OpenShift S2I(Source-to-Image) 애플리케이션 개발 워크플로우 중 하나를 사용하여 OpenShift에 배포할 수 있습니다.

S2I 바이너리 워크플로
바이너리 소스 의 빌드 입력이 있는 S2I입니다. 이 워크플로는 빌드가 개발자의 자체 시스템에서 부분적으로 실행된다는 사실이 특징입니다. 바이너리 패키지를 로컬로 빌드한 후 이 워크플로는 바이너리 패키지를 OpenShift로 전달합니다. 자세한 내용은 OpenShift 3.5 개발자 가이드의 바이너리 소스 를 참조하십시오.
S2I 소스 워크플로우
Git 소스 의 빌드 입력이 있는 S2I . 이 워크플로는 빌드가 전적으로 OpenShift 서버에서 실행된다는 사실이 특징입니다. 자세한 내용은 OpenShift 3.5 개발자 가이드의 Git 소스 를 참조하십시오.

4.2.1. S2I 바이너리 워크플로우를 사용하여 프로젝트 생성 및 배포

이 섹션에서는 OpenShift S2I 바이너리 워크플로우를 사용하여 OpenShift 프로젝트에서 Fuse를 생성, 빌드 및 배포합니다.

프로세스

  1. Maven archetype을 사용하여 OpenShift 프로젝트에서 새 Fuse를 생성합니다. 이 예제에서는 샘플 Spring Boot Camel 프로젝트를 생성하는 archetype을 사용합니다. 새 쉘 프롬프트를 열고 다음 Maven 명령을 입력합니다.

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
      -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \
      -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
      -DarchetypeArtifactId=spring-boot-camel-xml-archetype \
      -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
    Copy to Clipboard

    archetype 플러그인은 대화형 모드로 전환되어 나머지 필드를 입력하라는 메시지를 표시합니다.

    Define value for property 'groupId': : org.example.fis
    Define value for property 'artifactId': : fuse74-spring-boot
    Define value for property 'version':  1.0-SNAPSHOT: :
    Define value for property 'package':  org.example.fis: :
    [INFO] Using property: spring-boot-version = 1.5.17.RELEASE
    Confirm properties configuration:
    groupId: org.example.fis
    artifactId: fuse74-spring-boot
    version: 1.0-SNAPSHOT
    package: org.example.fis
    spring-boot-version: 1.5.17.RELEASE
     Y: :
    Copy to Clipboard

    메시지가 표시되면 groupId 값으로 org.example.fis 를 입력하고 artifactId 값으로 fuse74-spring-boot 를 입력합니다. 나머지 필드의 기본값을 수락합니다.

  2. 이전 명령이 BUILD SUCCESS 상태로 종료되면 이제 fuse74-spring-boot 하위 디렉터리에 OpenShift 프로젝트에서 새 Fuse가 있어야 합니다. fuse74-spring-boot/src/main/resources/spring/camel-context.xml 파일에서 XML DSL 코드를 검사할 수 있습니다. 데모 코드는 임의의 숫자가 포함된 메시지를 로그에 지속적으로 전송하는 간단한 Camel 경로를 정의합니다.
  3. OpenShift 프로젝트에서 Fuse를 빌드하고 배포할 수 있도록 다음과 같이 OpenShift Server에 로그인합니다.

    oc login -u developer -p developer https://OPENSHIFT_IP_ADDR:8443
    Copy to Clipboard

    여기서 OPENSHIFT_IP_ADDR 은 이 IP 주소가 항상 동일하지 않기 때문에 OpenShift 서버의 IP 주소 자리 표시자입니다.

    참고

    developer 사용자(개발 암호 포함)는 CDK를 통해 가상 OpenShift Server에서 자동으로 생성되는 표준 계정입니다. 원격 서버에 액세스하는 경우 OpenShift 관리자가 제공한 URL 및 인증 정보를 사용합니다.

  4. 다음 명령을 실행하여 OpenShift 이미지 및 템플릿의 Fuse가 이미 설치되어 있고 액세스할 수 있는지 확인합니다.

    oc get template -n openshift
    Copy to Clipboard

    이미지 및 템플릿이 사전 설치되지 않았거나 제공된 버전이 최신 버전이 아닌 경우 Fuse를 OpenShift 이미지 및 템플릿에 수동으로 설치(또는 업데이트)합니다. OpenShift 이미지에 Fuse를 설치하는 방법에 대한 자세한 내용은 2장. 관리자 시작하기 을 참조하십시오.

  5. 다음과 같이 test 라는 새 프로젝트 네임스페이스(아직 존재하지 않는다고 가정)를 생성합니다.

    oc new-project test
    Copy to Clipboard

    test 프로젝트 네임스페이스가 이미 존재하는 경우 다음 명령을 사용하여 이 네임스페이스로 전환할 수 있습니다.

    oc project test
    Copy to Clipboard
  6. 이제 fuse74-spring-boot 프로젝트를 빌드하고 배포할 준비가 되었습니다. OpenShift에 로그인되어 있다고 가정하면 fuse74-spring-boot 프로젝트의 디렉터리로 변경한 다음 다음과 같이 프로젝트를 빌드하고 배포합니다.

    cd fuse74-spring-boot
    mvn fabric8:deploy -Popenshift
    Copy to Clipboard

    빌드가 성공적으로 완료되면 다음과 같은 일부 출력이 표시됩니다.

    ...
    [INFO] OpenShift platform detected
    [INFO] Using project: test
    [INFO] Creating a Service from openshift.yml namespace test name fuse74-spring-boot
    [INFO] Created Service: target/fabric8/applyJson/test/service-fuse74-spring-boot.json
    [INFO] Using project: test
    [INFO] Creating a DeploymentConfig from openshift.yml namespace test name fuse74-spring-boot
    [INFO] Created DeploymentConfig: target/fabric8/applyJson/test/deploymentconfig-fuse74-spring-boot.json
    [INFO] Creating Route test:fuse74-spring-boot host: null
    [INFO] F8: HINT: Use the command `oc get pods -w` to watch your pods start up
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 05:38 min
    [INFO] Finished at: 2019-02-22T12:08:11+01:00
    [INFO] Final Memory: 63M/272M
    [INFO] ------------------------------------------------------------------------
    Copy to Clipboard
    참고

    이 명령을 처음 실행하는 경우 Maven은 많은 종속 항목을 다운로드해야 하며 몇 분 정도 걸립니다. 후속 빌드가 더 빨라집니다.

  7. 브라우저에서 OpenShift 콘솔로 이동하여 인증 정보를 사용하여 콘솔에 로그인합니다(예: 사용자 이름 developer 및 암호 developer).
  8. OpenShift 콘솔에서 아래로 스크롤하여 test 프로젝트 네임스페이스를 찾습니다. 테스트 프로젝트를 클릭하여 테스트 프로젝트 네임스페이스를 엽니다. test 프로젝트의 개요 탭이 열리고 fuse74-spring-boot 애플리케이션이 표시됩니다.
  9. 다음과 같이 fuse74-spring-boot 배포 왼쪽에 있는 화살표를 클릭하여 이 배포의 세부 정보를 확장하고 확인합니다.

    OpenShift console test namespace overview showing fuse74-spring-boot application and associated pods

  10. Pod 아이콘(파란색 원)의 중앙을 클릭하여 fuse74-spring-boot.

    List of pods associated with the fuse74-spring-boot service

  11. Pod 이름 (이 예에서 fuse74-spring-boot-1-kxdjm)을 클릭하여 실행 중인 Pod의 세부 정보를 확인합니다.

    Detail view of the running pod for fuse74-spring-boot

  12. 로그 탭을 클릭하여 애플리케이션 로그를 보고 로그를 아래로 스크롤하여 Camel 애플리케이션에서 생성한 임의의 수 로그 메시지를 찾습니다.

    ...
    07:30:32.406 [Camel (camel) thread #0 - timer://foo] INFO  simple-route - >>> 985
    07:30:34.405 [Camel (camel) thread #0 - timer://foo] INFO  simple-route - >>> 741
    07:30:36.409 [Camel (camel) thread #0 - timer://foo] INFO  simple-route - >>> 796
    07:30:38.409 [Camel (camel) thread #0 - timer://foo] INFO  simple-route - >>> 211
    07:30:40.411 [Camel (camel) thread #0 - timer://foo] INFO  simple-route - >>> 511
    07:30:42.411 [Camel (camel) thread #0 - timer://foo] INFO simple-route - >>> 942
    Copy to Clipboard
  13. 왼쪽 탐색 모음에서 개요 를 클릭하여 테스트 네임스페이스의 애플리케이션 개요로 돌아갑니다. 실행 중인 Pod를 종료하려면 Pod 아이콘 옆에 있는 아래쪽 화살표 get started s2i binary 05 를 클릭합니다. 스케일 다운 배포 fuse74-spring-boot-1? 라는 질문을하는 대화 상자가 표시되면 스케일 다운 을 클릭합니다.
  14. (선택 사항) CDK를 사용하는 경우 쉘 프롬프트로 돌아가서 다음 명령을 입력하여 가상 OpenShift 서버를 완전히 종료할 수 있습니다.

    minishift stop
    Copy to Clipboard

4.2.2. 프로젝트 배포 취소 및 재배포

다음과 같이 프로젝트 배포를 취소하거나 재배포할 수 있습니다.

프로세스

  • 프로젝트 배포를 취소하려면 다음 명령을 입력합니다.

    mvn fabric8:undeploy
    Copy to Clipboard
  • 프로젝트를 재배포하려면 명령을 입력합니다.

    mvn fabric8:undeploy
    mvn fabric8:deploy -Popenshift
    Copy to Clipboard

4.2.3. OpenShift에서 Fuse Console 설정

OpenShift에서는 다음 두 가지 방법으로 Fuse Console에 액세스할 수 있습니다.

  • 특정 포드에서 실행 중인 단일 Fuse 컨테이너를 모니터링할 수 있습니다.
  • 프로젝트에 중앙 집중식 Fuse Console 카탈로그 항목을 추가하여 프로젝트에서 실행 중인 모든 Fuse 컨테이너를 모니터링할 수 있습니다.

OpenShift 콘솔 또는 명령줄에서 Fuse 콘솔을 배포할 수 있습니다.

참고
  • OpenShift 4에서 Fuse 7.4 서비스를 Fuse Console로 관리하려면 Fuse 7.4 릴리스 노트에 설명된 대로 커뮤니티 버전(Hawtio)을 설치해야 합니다.
  • Fuse Console의 보안 및 사용자 관리는 OpenShift에서 처리합니다.
  • Fuse Console 템플릿은 브라우저에서 클러스터 내 서비스로의 보안 엔드 투 엔드 요청이 되도록 기본적으로 엔드 투 엔드 암호화를 구성합니다.
  • 배포 후 Fuse Console에 액세스하는 사용자의 경우 OpenShift에서 Fuse를 사용할 수 없습니다.

사전 요구 사항

  • OpenShift의 Fuse에 설명된 대로 OpenShift 이미지 스트림에 Fuse 및 Fuse 콘솔 템플릿을 설치합니다.
  • OpenShift Container Platform 환경에서 클러스터 모드에서 Fuse Console을 배포하려면 클러스터 관리자 역할과 클러스터 모드 템플릿이 필요합니다. 다음 명령을 실행합니다.
oc adm policy add-cluster-role-to-user cluster-admin system:serviceaccount:openshift-infra:template-instance-controller
Copy to Clipboard
참고

클러스터 모드 템플릿은 기본적으로 최신 버전의 OpenShift Container Platform에서만 사용할 수 있습니다. OpenShift Online 기본 카탈로그는 제공되지 않습니다.

4.2.3.1. Fuse 콘솔에서 단일 Fuse Pod 모니터링

OpenShift에서 실행 중인 Fuse Pod의 Fuse Console을 열 수 있습니다.

  1. OpenShift 프로젝트의 애플리케이션 → 포드 보기에서 Pod 이름을 클릭하여 실행 중인 Fuse Pod의 세부 정보를 확인합니다. 이 페이지 오른쪽에는 컨테이너 템플릿에 대한 요약이 표시됩니다.

    Container Template View

  2. 이 보기에서 Open Java Console 링크를 클릭하여 Fuse 콘솔을 엽니다.

    Fuse Console view

    참고

    포드 뷰에 Fuse Console에 대한 링크를 표시하도록 OpenShift를 구성하려면 OpenShift 이미지에서 Fuse를 실행하는 Pod에서 jolokia 로 설정된 name 속성 내에서 TCP 포트를 선언해야 합니다.

    {
      "kind": "Pod",
      [...]
      "spec": {
        "containers": [
          {
            [...]
            "ports": [
              {
                "name": "jolokia",
                "containerPort": 8778,
                "protocol": "TCP"
              }
    Copy to Clipboard
4.2.3.2. OpenShift 콘솔에서 Fuse 콘솔 배포

OpenShift 콘솔의 OpenShift 클러스터에 Fuse Console을 배포하려면 다음 단계를 따르십시오.

프로세스

  1. OpenShift 콘솔에서 기존 프로젝트를 열거나 새 프로젝트를 생성합니다.
  2. OpenShift 프로젝트에 Fuse 콘솔을 추가합니다.

    1. Add to ProjectBrowse Catalog 를 선택합니다.

      현재 프로젝트에 추가할 항목 선택 페이지가 열립니다.

    2. 검색 필드에 Fuse Console 을 입력합니다.

      Red Hat Fuse 7.x 콘솔Red Hat Fuse 7.x 콘솔(cluster) 항목이 검색 결과에 표시됩니다.

참고

Red Hat Fuse Console 항목이 검색 결과로 나타나지 않거나 표시되는 항목이 최신 버전이 아닌 경우 OpenShift Guide의 "OpenShift 서버 전" 섹션에 설명된 대로 수동으로 Fuse Console 템플릿을 설치할 수 있습니다.

  1. Red Hat Fuse Console 항목 중 하나를 클릭합니다.

    • Red Hat Fuse 7.x 콘솔 - 이 버전의 Fuse Console은 현재 OpenShift 프로젝트에 배포된 Fuse 애플리케이션을 검색하고 연결합니다.
    • Red Hat Fuse 7.x Console(클러스터) - 이 버전의 Fuse Console은 OpenShift 클러스터의 여러 프로젝트에 배포된 Fuse 애플리케이션을 검색하고 연결할 수 있습니다.
  2. Red Hat Fuse Console 마법사에서 다음을 클릭합니다. 마법사의 구성 페이지가 열립니다.

    선택적으로 구성 매개변수의 기본값을 변경할 수 있습니다.

    1. 생성을 클릭합니다.

      마법사의 결과 페이지에는 Red Hat Fuse Console이 생성되었음을 나타냅니다.

    2. Continue to the project overview 링크를 클릭하여 Fuse Console 애플리케이션이 프로젝트에 추가되었는지 확인합니다.
    3. Fuse 콘솔을 열려면 제공된 URL 링크를 클릭한 다음 로그인합니다.

      필요한 권한이 나열된 브라우저에서 권한 부여 페이지가 열립니다.

    4. 선택한 권한 허용을 클릭합니다.

      브라우저에서 Fuse Console이 열리고 프로젝트에서 실행 중인 Fuse Pod가 표시됩니다.

    5. 확인할 애플리케이션에 대한 연결을 클릭합니다.

      Fuse Console에 애플리케이션이 표시되는 새 브라우저 창이 열립니다.

4.2.3.3. 명령줄에서 Fuse 콘솔 배포

표 4.1. “Fuse 콘솔 템플릿” Fuse 애플리케이션 배포 유형에 따라 명령줄에서 Fuse Console에 액세스하는 데 사용할 수 있는 두 OpenShift 템플릿을 설명합니다.

표 4.1. Fuse 콘솔 템플릿
유형설명

cluster

cluster-admin 역할을 생성해야 하는 OAuth 클라이언트를 사용합니다. Fuse Console은 여러 네임스페이스 또는 프로젝트에 배포된 Fuse 애플리케이션을 검색하고 연결할 수 있습니다.

네임스페이스

서비스 계정을 OAuth 클라이언트로 사용합니다. 이 클라이언트는 프로젝트에서 admin 역할만 생성해야 합니다. 이렇게 하면 이 단일 프로젝트에 대한 Fuse Console 액세스가 제한되므로 단일 테넌트 배포 역할을 합니다.

선택적으로 다음 명령을 실행하여 템플릿 매개변수 목록을 볼 수 있습니다.

oc process --parameters -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-namespace-template.json
Copy to Clipboard

프로세스

명령줄에서 Fuse 콘솔을 배포하려면 다음을 수행합니다.

  1. 다음 명령 중 하나를 실행하여 Fuse Console 템플릿을 기반으로 새 애플리케이션을 생성합니다(여기서 myproject 는 프로젝트 이름임).

    • Fuse Console 클러스터 템플릿의 경우 myhost 는 Fuse Console에 액세스할 수 있는 호스트 이름입니다.

      oc new-app -n myproject -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-cluster-template.json -p ROUTE_HOSTNAME=myhost
      Copy to Clipboard
    • Fuse Console 네임스페이스 템플릿의 경우:

      oc new-app -n myproject -f https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003/fis-console-namespace-template.json
      Copy to Clipboard
      참고

      OpenShift가 자동으로 생성되므로 네임스페이스 템플릿의 route_hostname 매개변수를 생략할 수 있습니다.

  2. 다음 명령을 실행하여 Fuse Console 배포의 상태 및 URL을 가져옵니다.

    oc status
    Copy to Clipboard
  3. 브라우저에서 Fuse 콘솔에 액세스하려면 제공된 URL(예: https://fuse-console.192.168.64.12.nip.io)을 사용합니다.
4.2.3.4. Fuse Console에 데이터가 올바르게 표시되도록 합니다.

Fuse Console의 대기열 및 연결 표시에 큐가 없거나 연결이 누락되었거나 일관성 없는 아이콘을 표시하는 경우 Jolokia 컬렉션 크기 매개변수를 조정하여 Jolokia marshals를 응답에 마샬링하는 배열의 최대 요소 수를 지정합니다.

프로세스

  1. Fuse Console의 오른쪽 상단에서 사용자 아이콘을 클릭한 다음 기본 설정을 클릭합니다.

    mf preferences

  2. 최대 컬렉션 크기 옵션의 값을 늘립니다(기본값은 50,000).
  3. 닫기를 클릭합니다.

4.2.4. S2I 소스 워크플로우를 사용하여 프로젝트 생성 및 배포

이 섹션에서는 OpenShift S2I 소스 워크플로를 사용하여 템플릿을 기반으로 OpenShift 프로젝트에 Fuse를 빌드하고 배포합니다. 이 데모의 시작점은 원격 Git 리포지토리에 저장된 빠른 시작 프로젝트입니다. OpenShift 콘솔을 사용하면 OpenShift 서버에서 이 빠른 시작 프로젝트를 다운로드, 빌드 및 배포합니다.

프로세스

  1. 브라우저에서 OpenShift 콘솔(https://OPENSHIFT_IP_ADDR:8443, OPENSHIFT_IP_ADDR 을 CDK의 경우 표시되는 IP 주소로 교체)하고 인증 정보(예: 사용자 이름 developer 및 암호, developer)로 콘솔에 로그인합니다.
  2. 카탈로그 검색 필드에 검색 문자열로 Red Hat Fuse 7.4 Camel XML 을 입력하고 Spring Boot 템플릿으로 Red Hat Fuse 7.4 Camel XML DSL 을 선택합니다.

    get started s2i source 01

  3. 템플릿 마법사의 정보 단계가 열립니다. 다음을 클릭합니다.
  4. 다음과 같이 템플릿 마법사의 구성 단계가 열립니다. Add to Project (프로젝트에 추가) 드롭다운에서 My Project 를 선택합니다.

    참고

    또는 이 예제에 대한 새 프로젝트를 생성하려면 Add to Project (프로젝트에 추가) 드롭다운에서 Create Project 를 선택합니다. 그러면 새 프로젝트의 이름을 채울 프로젝트 이름 필드가 표시됩니다.

  5. 구성 단계에서 나머지 설정에 기본값을 허용할 수 있습니다. 생성을 클릭합니다.

    get started s2i source 02

    참고

    애플리케이션 코드를 수정하려면(현재 빠른 시작만 실행하는 대신) 원래 빠른 시작 Git 리포지토리를 분기하고 Git 리포지토리 URL 및 Git 참조 필드에 적절한 값을 작성해야 합니다.

  6. 템플릿 마법사의 결과 단계가 열립니다. 닫기를 클릭합니다.
  7. 오른쪽 내 프로젝트 창에서 내 프로젝트 를 클릭합니다. My Project 프로젝트의 개요 탭이 열리고 s2i-fuse74-spring-boot-camel-xml 애플리케이션이 표시됩니다.
  8. 다음과 같이 s2i-fuse74-spring-boot-camel-xml 배포 왼쪽에 있는 화살표를 클릭하여 이 배포의 세부 정보를 확장하고 확인합니다.

    get started s2i source 03

  9. 이 보기에서 빌드 로그를 볼 수 있습니다. 어떤 이유로든 빌드가 실패하면 빌드 로그가 문제를 진단하는 데 도움이 될 수 있습니다.

    참고

    원격 Maven 리포지토리에서 많은 종속 항목을 다운로드해야 하므로 빌드를 완료하는 데 몇 분이 걸릴 수 있습니다. 빌드 시간을 단축하려면 로컬 네트워크에 Nexus 서버를 배포하는 것이 좋습니다.

  10. 빌드가 완료되면 Pod 아이콘이 1 개의 Pod가 실행되는 파란색 원으로 표시됩니다. Pod 아이콘(파란색 원)의 중심을 클릭하여 s2i-fuse74-spring-boot-camel-xml 의 Pod 목록을 확인합니다.

    참고

    여러 Pod가 실행 중인 경우 이 시점에서 실행 중인 Pod 목록이 표시됩니다. Pod가 하나만 있는 경우 실행 중인 Pod의 세부 정보 보기로 바로 이동합니다.

  11. Pod 세부 정보 보기가 열립니다. 로그 탭을 클릭하여 애플리케이션 로그를 보고 로그를 아래로 스크롤하여 Camel 애플리케이션에서 생성한 로그 메시지를 찾습니다.

    Details view of the running pod

  12. 왼쪽 탐색 모음에서 개요 를 클릭하여 내 프로젝트 네임스페이스에 있는 애플리케이션의 개요로 돌아갑니다. 실행 중인 Pod를 종료하려면 Pod 아이콘 옆에 있는 아래쪽 화살표 get started s2i binary 05 를 클릭합니다. 스케일 다운 배포 s2i-fuse74-spring-boot-camel-xml-1? ? 를 묻는 메시지가 표시되면 스케일 다운 을 클릭합니다.
  13. (선택 사항) CDK를 사용하는 경우 쉘 프롬프트로 돌아가서 다음 명령을 입력하여 가상 OpenShift 서버를 완전히 종료할 수 있습니다.

    minishift stop
    Copy to Clipboard

5장. Spring Boot Image용 애플리케이션 개발

이 장에서는 Spring Boot 이미지용 애플리케이션을 개발하는 방법을 설명합니다.

5.1. Maven Archetype을 사용하여 Spring Boot 프로젝트 생성

Maven archetypes를 사용하여 Spring Boot 프로젝트를 생성하려면 다음 단계를 따르십시오.

프로세스

  1. 시스템의 적절한 디렉터리로 이동합니다.
  2. 쉘 프롬프트에서 다음 mvn 명령을 입력하여 Spring Boot 프로젝트를 생성합니다.

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
      -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \
      -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
      -DarchetypeArtifactId=spring-boot-camel-xml-archetype \
      -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
    Copy to Clipboard

    archetype 플러그인은 대화형 모드로 전환되어 나머지 필드를 입력하라는 메시지를 표시합니다.

    Define value for property 'groupId': : org.example.fis
    Define value for property 'artifactId': : fuse74-spring-boot
    Define value for property 'version':  1.0-SNAPSHOT: :
    Define value for property 'package':  org.example.fis: :
    [INFO] Using property: spring-boot-version = 1.5.17.RELEASE
    Confirm properties configuration:
    groupId: org.example.fis
    artifactId: fuse74-spring-boot
    version: 1.0-SNAPSHOT
    package: org.example.fis
    spring-boot-version: 1.5.17.RELEASE
     Y: :
    Copy to Clipboard

    메시지가 표시되면 groupId 값으로 org.example.fis 를 입력하고 artifactId 값으로 fuse74-spring-boot 를 입력합니다. 나머지 필드의 기본값을 수락합니다.

  3. 예제를 빌드하고 배포하는 방법에 대한 퀵스타트의 지침에 따릅니다.
참고

사용 가능한 Spring Boot archetypes의 전체 목록은 Spring Boot Archetype Catalog 를 참조하십시오.

5.2. Camel Spring Boot 애플리케이션 구조

Camel Spring Boot 애플리케이션의 디렉터리 구조는 다음과 같습니다.

  ├── LICENSE.md
  ├── pom.xml
  ├── README.md
  ├── configuration
  │   └── settings.xml
  └── src
      ├── main
      │   ├── fabric8
      │   │   └── deployment.yml
      │   ├── java
      │   │   └── org
      │   │       └── example
      │   │           └── fis
      │   │               ├── Application.java
      │   │               └── MyTransformer.java
      │   └── resources
      │       ├── application.properties
      │       ├── logback.xml
      │       └── spring
      │           └── camel-context.xml
      └── test
          └── java
              └── org
                  └── example
                      └── fis
Copy to Clipboard

다음 파일이 애플리케이션을 개발하는 데 중요한 위치:

pom.xml
추가 종속 항목을 포함합니다. Spring Boot와 호환되는 Camel 구성 요소는 시작 버전(예: camel-jdbc-starter 또는 camel-infinispan-starter )에서 사용할 수 있습니다. 시작자가 pom.xml 에 포함되면 부팅 시 Camel 컨텐츠에 자동으로 구성 및 등록됩니다. 사용자는 application.properties 파일을 사용하여 구성 요소의 속성을 구성할 수 있습니다.
application.properties

구성을 외부화하고 다른 환경에서 동일한 애플리케이션 코드로 작업할 수 있습니다. 자세한 내용은 Externalized Configuration을 참조하십시오.

예를 들어 이 Camel 애플리케이션에서는 애플리케이션 이름 또는 IP 주소와 같은 특정 속성을 구성할 수 있습니다.

application.properties

#spring.main.sources=org.example.fos

logging.config=classpath:logback.xml

# the options from org.apache.camel.spring.boot.CamelConfigurationProperties can be configured here
camel.springboot.name=MyCamel

# lets listen on all ports to ensure we can be invoked from the pod IP
server.address=0.0.0.0
management.address=0.0.0.0

# lets use a different management port in case you need to listen to HTTP requests on 8080
management.port=8081

# disable all management endpoints except health
endpoints.enabled = false
endpoints.health.enabled = true
Copy to Clipboard

Application.java

애플리케이션을 실행하는 데 중요한 파일입니다. 사용자는 여기에서 Spring DSL을 사용하여 경로를 구성하기 위해 camel-context.xml 파일을 가져옵니다.

Application.java 파일은 @Configuration,@EnableAutoConfiguration@ComponentScan 과 동일한 @SpringBootApplication 주석을 지정합니다.

Application.java

@SpringBootApplication
// load regular Blueprint file from the classpath that contains the Camel XML DSL
@ImportResource({"classpath:blueprint/camel-context.xml"})
Copy to Clipboard

Spring Boot 애플리케이션을 실행하는 기본 방법이 있어야 합니다.

Application.java

public class Application {
    /**
     * A main method to start this application.
     */
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Copy to Clipboard

camel-context.xml

src/main/resources/spring/camel-context.xml 은 Camel 경로가 포함되어 있으므로 애플리케이션을 개발하는 데 중요한 파일입니다.

참고

Spring-Boot 애플리케이션 개발에 대한 자세한 내용은 첫 번째 Spring Boot Application 개발에서확인할 수 있습니다.

src/main/fabric8/deployment.yml

fabric8-maven-plugin에서 생성된 기본 OpenShift 구성 파일과 병합되는 추가 구성을 제공합니다.

참고

이 파일은 Spring Boot 애플리케이션의 일부를 사용하지 않지만 CPU 및 메모리 사용과 같은 리소스를 제한하는 데 모든 빠른 시작에서 사용됩니다.

5.3. Spring Boot Archetype Catalog

Spring Boot Archetype 카탈로그에는 다음 예제가 포함되어 있습니다.

표 5.1. Spring Boot Maven Archetypes
이름설명

spring-boot-camel-archetype

fabric8 Java 기본 이미지를 기반으로 Apache Camel을 Spring Boot와 함께 사용하는 방법을 보여줍니다.

spring-boot-camel-amq-archetype

Spring Boot 애플리케이션을 ActiveMQ 브로커에 연결하고 Kubernetes 또는 OpenShift를 사용하여 두 Camel 경로 간에 JMS 메시징을 사용하는 방법을 보여줍니다.

spring-boot-camel-config-archetype

Kubernetes ConfigMaps 및 Secrets를 사용하여 Spring Boot 애플리케이션을 구성하는 방법을 보여줍니다.

spring-boot-camel-drools-archetype

Apache Camel을 사용하여 Kubernetes 또는 OpenShift에서 실행되는 Spring Boot 애플리케이션을 원격 Kie 서버와 통합하는 방법을 보여줍니다.

spring-boot-camel-infinispan-archetype

Hot Rod 프로토콜을 사용하여 Spring Boot 애플리케이션을 JBoss Data Grid 또는 Infinispan 서버에 연결하는 방법을 보여줍니다.

spring-boot-camel-rest-sql-archetype

Camel의 REST DSL과 함께 JDBC를 통한 SQL을 사용하여 RESTful API를 노출하는 방법을 보여줍니다.

spring-boot-camel-xa-archetype

Spring Boot, Camel 및 XA 트랜잭션. 이 예제에서는 두 개의 외부 트랜잭션 리소스에서 XA 트랜잭션을 지원하는 Spring Boot에서 Camel 서비스를 실행하는 방법(A-MQ) 및 데이터베이스(PostgreSQL)를 보여줍니다. 이 빠른 시작에는 PostgreSQL 데이터베이스가 필요하며 A-MQ 브로커가 먼저 배포 및 실행 중 하나는 Openshift 서비스 카탈로그에 제공된 템플릿을 사용하는 것입니다.

spring-boot-camel-xml-archetype

블루프린트 구성 파일을 통해 Spring Boot에서 Camel 경로를 구성하는 방법을 보여줍니다.

spring-boot-cxf-jaxrs-archetype

fabric8 Java 기본 이미지를 기반으로 Apache CXF를 Spring Boot와 함께 사용하는 방법을 보여줍니다. 빠른 시작에서는 Spring Boot를 사용하여 Swagger가 활성화된 CXF CryostatRS 끝점이 포함된 애플리케이션을 구성합니다.

spring-boot-cxf-jaxws-archetype

fabric8 Java 기본 이미지를 기반으로 Apache CXF를 Spring Boot와 함께 사용하는 방법을 보여줍니다. 빠른 시작에서는 Spring Boot를 사용하여 CXF CryostatWS 엔드포인트가 포함된 애플리케이션을 구성합니다.

중요

기술 프리뷰 빠른 시작도 사용할 수 있습니다. Spring Boot Camel XA 트랜잭션 빠른 시작은 Spring Boot를 사용하여 XA 트랜잭션을 지원하는 Camel 서비스를 실행하는 방법을 보여줍니다. 이 빠른 시작에서는 JMS(AMQ) 브로커와 데이터베이스(PostgreSQL)의 두 가지 외부 트랜잭션 리소스를 사용하는 방법을 보여줍니다. 이 빠른 시작은 https://github.com/jboss-fuse/spring-boot-camel-xa 에서 확인할 수 있습니다.

기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있으며 프로덕션 환경에서 사용하는 것이 좋습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다. 자세한 내용은 Red Hat 기술 프리뷰 기능 지원 범위를 참조하십시오.

5.4. BOM 파일 for Spring Boot

BOM(Maven bill of materials) 파일의 목적은 잘 작동하는 Maven 종속성 버전 집합을 제공하여 모든 Maven 아티팩트에 대해 버전을 개별적으로 정의할 필요가 없도록 하는 것입니다.

중요

사용 중인 Spring Boot 버전에 따라 올바른 Fuse BOM을 사용하고 있는지 확인합니다(부팅 1 또는 Spring Boot 2).

Fuse BOM for Spring Boot는 다음과 같은 이점을 제공합니다.

  • POM에 종속성을 추가할 때 버전을 지정할 필요가 없도록 Maven 종속 항목에 대한 버전을 정의합니다.
  • 특정 버전의 Fuse에서 완전히 테스트 및 지원되는 선별된 종속성 세트를 정의합니다.
  • Fuse 업그레이드 간소화.
중요

Fuse BOM에서 정의한 종속성 세트만 Red Hat에서 지원합니다.

5.4.1. BOM 파일 통합

BOM 파일을 Maven 프로젝트에 통합하려면 아래 Spring Boot 2 및 Spring Boot 1의 예와 같이 프로젝트의 pom.xml 파일(또는 상위 POM 파일에서)에 dependencyManagement 요소를 지정합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- configure the versions you want to use here -->
    <fuse.version>7.4.0.fuse-sb2-740019-redhat-00005</fuse.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-springboot-bom</artifactId>
        <version>${fuse.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
</project>
Copy to Clipboard


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- configure the versions you want to use here -->
    <fuse.version>7.4.0.fuse-740036-redhat-00002</fuse.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-springboot-bom</artifactId>
        <version>${fuse.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
</project>
Copy to Clipboard

종속성 관리 메커니즘을 사용하여 BOM을 지정하면 아티팩트 버전을 지정하지 않고 Maven 종속성을 POM에 추가할 수 있습니다. 예를 들어 camel-hystrix 구성 요소에 대한 종속성을 추가하려면 POM의 종속성 요소에 다음 XML 조각을 추가합니다.

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-hystrix-starter</artifactId>
</dependency>
Copy to Clipboard

Camel 아티팩트 ID를 -starter suffix Cryostat- Cryostat로 지정하는 방법에 유의하십시오. 즉 Camel Hystrix 구성 요소를 camel-hystrix -starter 로 지정합니다. Camel 시작 구성 요소는 Spring Boot 환경에 최적화된 방식으로 패키지됩니다.

5.5. Spring Boot Maven 플러그인

Spring Boot Maven 플러그인은 Spring Boot에서 제공하며 Spring Boot 프로젝트를 빌드하고 실행하기 위한 개발자 유틸리티입니다.

  • 프로젝트 디렉터리에 mvn 패키지를 입력하여 Spring Boot 애플리케이션에 대한 실행 가능한 Jar 패키지를 빌드 합니다. 빌드 출력은 Maven 프로젝트의 target/ 하위 디렉터리에 배치됩니다.
  • 편의를 위해 mvn spring-boot:start 명령을 사용하여 새로 빌드된 애플리케이션을 실행할 수 있습니다.

Spring Boot Maven 플러그인을 프로젝트 POM 파일에 통합하려면 다음 예와 같이 pom.xml 파일의 project/build/plugins 섹션에 플러그인 구성을 추가합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- configure the versions you want to use here -->
    <fuse.version>7.4.0.fuse-740036-redhat-00002</fuse.version>

  </properties>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>${fuse.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
Copy to Clipboard

6장. Apache Camel in Spring Boot

6.1. Camel Spring Boot 소개

Camel Spring Boot 구성 요소는 Apache Camel에 대한 자동 구성을 제공합니다. Camel 컨텍스트의 자동 구성에서는 Spring 컨텍스트에서 사용할 수 있는 Camel 경로를 자동으로 감지하고 생산자 템플릿, 소비자 템플릿 및 유형 변환기와 같은 주요 Camel 유틸리티를 빈으로 등록합니다.

모든 Camel Spring Boot 애플리케이션은 제품화된 버전으로 dependencyManagement 를 사용해야 합니다. 빠른 시작 시를 참조하십시오. 나중에 태그된 버전은 BOM의 버전을 덮어쓰지 않도록 생략할 수 있습니다.

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.jboss.redhat-fuse</groupId>
			<artifactId>fuse-springboot-bom</artifactId>
			<version>${fuse.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
Copy to Clipboard
참고

Camel-spring-boot param에는 spring.factories 파일이 포함되어 있어 해당 종속성을 클래스 경로에 추가할 수 있으므로 Spring Boot는 자동으로 Camel을 설정합니다.

6.2. Camel Spring Boot Starter 소개

Apache Camel에는 시작자를 사용하여 Spring Boot 애플리케이션을 개발할 수 있는 Spring Boot Starter 모듈이 포함되어 있습니다.

참고

자세한 내용은 소스 코드의 샘플 애플리케이션을 참조하십시오.

시작자를 사용하려면 Spring Boot pom.xml 파일에 다음 스니펫을 추가합니다.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
</dependency>
Copy to Clipboard

시작자를 사용하면 아래 코드 조각에 표시된 것처럼 Camel 경로가 포함된 클래스를 추가할 수 있습니다. 이러한 경로가 클래스 경로에 추가되면 경로가 자동으로 시작됩니다.

package com.example;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MyRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer:foo").to("log:bar");
    }
}
Copy to Clipboard

application.properties 또는 application.yml 파일에서 Camel 애플리케이션을 사용자 지정할 수 있습니다. 

Camel Spring Boot는 이제 Camel 시작 구성 요소 중 하나를 구성할 때 구성 파일(application.properties 또는 yaml 파일)에서 id 이름으로 8080을 참조할 수 있습니다. src/main/resources/application.properties (또는 yaml) 파일에서 빈 ID 이름을 참조하여 다른 빈을 참조하는 Camel에서 옵션을 쉽게 구성할 수 있습니다. 예를 들어 xslt 구성 요소는 다음과 같이 8080 ID를 사용하여 사용자 지정 빈을 참조할 수 있습니다.

다음과 같이 ID myExtensionFactory에 의해 사용자 지정 8080을 참조하십시오.

camel.component.xslt.saxon-extension-functions=myExtensionFactory
Copy to Clipboard

Spring Boot @Bean 주석을 사용하여 다음과 같이 생성할 수 있는 것은 다음과 같습니다.

@Bean(name = "myExtensionFactory")
public ExtensionFunctionDefinition myExtensionFactory() {
    }
Copy to Clipboard

또는 camel-jackson 데이터 형식의 jackson ObjectMapper의 경우:

camel.dataformat.json-jackson.object-mapper=myJacksonMapper
Copy to Clipboard

6.3. 자동 구성 Camel 컨텍스트

Camel 자동 구성에서는 CamelContext 인스턴스를 제공하고 SpringCamelContext 를 생성합니다. 또한 해당 컨텍스트의 종료를 초기화하고 수행합니다. 이 Camel 컨텍스트는 camelContext 8080 이름 아래에 Spring 애플리케이션 컨텍스트에 등록되며 다른 Spring 8080과 마찬가지로 액세스할 수 있습니다.

예를 들어 다음과 같이 camelContext 에 액세스할 수 있습니다.

@Configuration
public class MyAppConfig {

  @Autowired
  CamelContext camelContext;

  @Bean
  MyService myService() {
    return new DefaultMyService(camelContext);
  }

}
Copy to Clipboard

6.4. Camel 경로 자동 감지

Camel 자동 구성은 Spring 컨텍스트에서 모든 RouteBuilder 인스턴스를 수집하여 CamelContext 에 자동으로 삽입합니다. Spring Boot 시작기를 사용하여 새 Camel 경로를 생성하는 프로세스를 단순화합니다. 클래스 경로에 @Component 주석이 달린 클래스를 추가하여 경로를 생성할 수 있습니다.

@Component
public class MyRouter extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    from("jms:invoices").to("file:/invoices");
  }

}
Copy to Clipboard

@Configuration 클래스에 새 경로 RouteBuilder 8080을 생성하려면 아래를 참조하십시오.

@Configuration
public class MyRouterConfiguration {

  @Bean
  RoutesBuilder myRouter() {
    return new RouteBuilder() {

      @Override
      public void configure() throws Exception {
        from("jms:invoices").to("file:/invoices");
      }

    };
  }
 
}
Copy to Clipboard

6.5. Camel 속성

Spring Boot 자동 구성은 속성 자리 표시자, OS 환경 변수 또는 Camel 속성을 지원하는 시스템 속성과 같은 Spring Boot 외부 구성에 자동으로 연결됩니다.

이러한 속성은 application.properties 파일에 정의되어 있습니다.  

route.from = jms:invoices
Copy to Clipboard

시스템 속성으로 사용

java -Droute.to=jms:processed.invoices -jar mySpringApp.jar
Copy to Clipboard

Camel 경로에서 자리 표시자로 사용합니다.

@Component
public class MyRouter extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    from("{{route.from}}").to("{{route.to}}");
  }

}
Copy to Clipboard

6.6. 사용자 정의 Camel 컨텍스트 구성

Camel 자동 구성으로 생성된 CamelContext 8080에서 작업을 수행하려면 다음과 같이 Spring 컨텍스트에서 CamelContextConfiguration 인스턴스를 등록해야 합니다.

@Configuration
public class MyAppConfig {

  ...

  @Bean
  CamelContextConfiguration contextConfiguration() {
    return new CamelContextConfiguration() {
      @Override
      void beforeApplicationStart(CamelContext context) {
        // your custom configuration goes here
      }
    };
  }

}
Copy to Clipboard
참고

CamelContextConfigurationbeforeApplicationStart(CamelContext) 방법은 Spring 컨텍스트가 시작되기 전에 호출되므로 이 콜백에 전달된 CamelContext 인스턴스는 완전히 자동으로 구성됩니다. CamelContextConfiguration 의 많은 인스턴스를 Spring 컨텍스트에 추가할 수 있으며 모든 인스턴스가 실행됩니다.

6.7. Cryostat 비활성화

auto-configured CamelContext use camel.springboot.jmxEnabled 속성을 비활성화하려면 기본적으로 활성화되어 있습니다.

예를 들어 application.properties 파일에 다음 속성을 추가할 수 있습니다.

camel.springboot.jmxEnabled = false
Copy to Clipboard

6.8. 자동 구성된 소비자 및 생산자 템플릿

Camel 자동 구성은 사전 구성된 ConsumerTemplateProducerTemplate 인스턴스를 제공합니다. 이를 Spring 관리 빈에 삽입할 수 있습니다.

@Component
public class InvoiceProcessor {

  @Autowired
  private ProducerTemplate producerTemplate;

  @Autowired
  private ConsumerTemplate consumerTemplate;
  public void processNextInvoice() {
    Invoice invoice = consumerTemplate.receiveBody("jms:invoices", Invoice.class);
    ...
    producerTemplate.sendBody("netty-http:http://invoicing.com/received/" + invoice.id());
  }

}
Copy to Clipboard

기본적으로 소비자 템플릿 및 생산자 템플릿에는 엔드포인트 캐시 크기가 1000으로 설정되어 있습니다. 다음 Spring 속성을 사용하여 해당 값을 변경할 수 있습니다.

camel.springboot.consumerTemplateCacheSize = 100
camel.springboot.producerTemplateCacheSize = 200
Copy to Clipboard

6.9. Auto-configured TypeConverter

Camel 자동 구성은 Spring 컨텍스트에서 typeConverter 라는 TypeConverter 인스턴스를 등록합니다.

@Component
public class InvoiceProcessor {

  @Autowired
  private TypeConverter typeConverter;

  public long parseInvoiceValue(Invoice invoice) {
    String invoiceValue = invoice.grossValue();
    return typeConverter.convertTo(Long.class, invoiceValue);
  }

}
Copy to Clipboard

6.10. Spring 유형 변환 API 브리지

Spring은 유형 변환 API 로 구성됩니다. Spring API는 Camel 유형 변환기 API 와 유사합니다. 두 API Camel Spring Boot 간의 유사점으로 인해 Spring 변환 API에 위임하는 브리지 변환기(SpringTypeConverter)가 자동으로 등록됩니다. 즉, 즉시 사용 가능한 Camel은 Camel과 유사한 Spring Cryostat를 처리합니다.

이를 통해 다음과 같이 Camel TypeConverter API를 사용하여 Camel 및 Spring 컨버터에 모두 액세스할 수 있습니다.

@Component
public class InvoiceProcessor {

  @Autowired
  private TypeConverter typeConverter;

  public UUID parseInvoiceId(Invoice invoice) {
    // Using Spring's StringToUUIDConverter
    UUID id = invoice.typeConverter.convertTo(UUID.class, invoice.getId());
  }

}
Copy to Clipboard

여기에서 Spring Boot는 애플리케이션 컨텍스트에서 사용할 수 있는 Spring의 ConversionService 인스턴스로 변환을 위임합니다. ConversionService 인스턴스를 사용할 수 없는 경우 Camel Spring Boot 자동 구성이 ConversionService 인스턴스를 생성합니다.

6.11. 유형 변환 기능 비활성화

TypeConverter 인스턴스 또는 Spring 브리지와 같은 Camel Spring Boot의 유형 변환 기능을 비활성화하려면 다음과 같이 camel.springboot.typeConversion 속성을 false 로 설정합니다.

camel.springboot.typeConversion = false
Copy to Clipboard

6.12. XML 경로 추가

기본적으로 Camel XML 경로를 classpath에 배치하면 camel-spring-boot 가 자동으로 탐지되고 포함됩니다. Camel 버전 2.17 이상에서 다음과 같이 구성 옵션을 사용하여 디렉터리 이름을 구성하거나 이 기능을 비활성화할 수 있습니다.

// turn off
camel.springboot.xmlRoutes = false
// scan in the com/foo/routes classpath
camel.springboot.xmlRoutes = classpath:com/foo/routes/*.xml
Copy to Clipboard
참고

XML 파일은 다음과 같이 CamelContext 경로가 아닌 Camel XML 경로여야 합니다.

   <routes xmlns="http://camel.apache.org/schema/spring">
        <route id="test">
            <from uri="timer://trigger"/>
            <transform>
                <simple>ref:myBean</simple>
            </transform>
            <to uri="log:out"/>
        </route>
    </routes>
Copy to Clipboard

<camelContext>와 함께 Spring XML 파일을 사용하는 경우 Spring XML 파일 및 application.properties 파일에서 Camel을 구성할 수 있습니다. 예를 들어 Camel에 이름을 설정하고 스트림 캐싱을 켜려면 다음을 추가합니다.

camel.springboot.name = MyCamel
camel.springboot.stream-caching-enabled=true
Copy to Clipboard

6.13. XML Rest-DSL 추가

기본적으로 Camel Rest-DSL XML 경로를 클래스 경로의 camel-rest 디렉토리에 배치할 수 있으며, camel-spring-boot 는 자동으로 감지되고 포함됩니다. 다음과 같이 구성 옵션을 사용하여 디렉터리 이름을 구성하거나 이 기능을 비활성화할 수 있습니다.

// turn off
camel.springboot.xmlRests = false
// scan in the com/foo/routes classpath
camel.springboot.xmlRests = classpath:com/foo/rests/*.xml
Copy to Clipboard
참고

Rest-DSL XML 파일은 Camel XML rests이어야 하며 다음과 같은 CamelContext 가 아니어야 합니다.

   <rests xmlns="http://camel.apache.org/schema/spring">
      <rest>
         <post uri="/persons">
            <to uri="direct:postPersons"/>
         </post>
         <get uri="/persons">
            <to uri="direct:getPersons"/>
         </get>
         <get uri="/persons/{personId}">
             <to uri="direct:getPersionId"/>
         </get>
         <put uri="/persons/{personId}">
             <to uri="direct:putPersionId"/>
         </put>
         <delete uri="/persons/{personId}">
             <to uri="direct:deletePersionId"/>
         </delete>
      </rest>
    </rests>
Copy to Clipboard

6.14. Camel Spring Boot로 테스트

Spring Boot에서 실행되는 Camel의 경우 Spring Boot는 @Component 로 주석이 추가된 Camel 및 모든 경로를 자동으로 포함합니다. Spring 부팅으로 테스트할 때 @ContextConfiguration 대신 @SpringBootTest 를 사용하여 사용할 구성 클래스를 지정합니다.

다른 RouteBuilder 클래스에 Camel 경로가 여러 개인 경우 Camel Spring Boot에 이러한 경로가 모두 포함됩니다. 따라서 하나의 RouteBuilder 클래스에서만 경로를 테스트하려면 다음 패턴을 사용하여 활성화할 RouteBuilders를 포함하거나 제외할 수 있습니다.

  • java-routes-include-pattern: 패턴과 일치하는 RouteBuilder 클래스를 포함하는 데 사용됩니다.
  • java-routes-exclude-pattern: 패턴과 일치하는 RouteBuilder 클래스를 제외하는 데 사용됩니다. exclude는 include보다 우선합니다.

다음과 같이 단위 테스트 클래스에서 이러한 패턴을 @SpringBootTest 주석의 속성으로 지정할 수 있습니다.

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = {MyApplication.class);
   properties = {"camel.springboot.java-routes-include-pattern=**/Foo*"})
public class FooTest {
Copy to Clipboard

FooTest 클래스에서 포함 패턴은 **/Foo* 이며, 이는 Cryostat 스타일 패턴을 나타냅니다. 여기에서 패턴은 선행 패키지 이름과 일치하는 이중 별표로 시작됩니다. /foo* 는 클래스 이름이 FooRoute로 시작해야 함을 의미합니다. 다음 maven 명령을 사용하여 테스트를 실행할 수 있습니다.

mvn test -Dtest=FooTest
Copy to Clipboard

6.15. 예를 들면 다음과 같습니다.

7장. XA 트랜잭션을 사용하여 Spring Boot에서 Camel 서비스 실행

Spring Boot Camel XA 트랜잭션 빠른 시작은 두 개의 외부 트랜잭션 리소스, A-MQ(A-MQ) 및 데이터베이스(PostgreSQL)에서 XA 트랜잭션을 지원하는 Spring-Boot에서 Camel 서비스를 실행하는 방법을 보여줍니다. 이러한 외부 리소스는 OpenShift에서 제공하며 이 빠른 시작을 실행하기 전에 시작해야 합니다.

7.1. StatefulSet 리소스

이 빠른 시작에서는 OpenShift StatefulSet 리소스를 사용하여 트랜잭션 관리자의 고유성을 보장하고 트랜잭션 로그를 저장하려면 PersistentVolume이 필요합니다. 애플리케이션은 StatefulSet 리소스에서 스케일링을 지원합니다. 각 인스턴스에는 자체 프로세스 내 복구 관리자가 있습니다. 특수 컨트롤러를 사용하면 애플리케이션이 축소될 때 보류 중인 트랜잭션을 종료하지 않고도 모든 인스턴스를 올바르게 완료할 수 있습니다. 복구 관리자가 종료하기 전에 보류 중인 모든 작업을 플러시할 수 없는 경우 컨트롤러에서 축소 작업을 롤백합니다. 이 빠른 시작에서는 Spring Bootnaana 복구 컨트롤러를 사용합니다.

7.2. Spring Boot Narayana Recovery Controller

Spring Boot Narayana 복구 컨트롤러를 사용하면 종료 전에 보류 중인 트랜잭션을 정리하여 StatefulSet의 축소 단계를 정상적으로 처리할 수 있습니다. 축소 작업이 실행되고 종료 후 Pod가 정리되지 않으면 이전 복제본 수가 복원되므로 축소 작업을 효과적으로 취소합니다.

StatefulSet의 모든 Pod는 StatefulSet에 속하는 각 Pod의 종료 상태를 저장하는 데 사용되는 공유 볼륨에 액세스해야 합니다. StatefulSet의 pod-0은 주기적으로 상태를 확인하고 불일치가 있는 경우 StatefulSet을 올바른 크기로 스케일링합니다.

복구 컨트롤러가 작동하려면 현재 네임스페이스에 대한 권한을 편집해야 합니다(OpenShift에 게시된 리소스 세트에 역할 바인딩이 포함되어 있음). CLUSTER_RECOVERY_ENABLED 환경 변수를 사용하여 복구 컨트롤러를 비활성화할 수 있습니다. 이 경우 서비스 계정에 특별한 권한이 필요하지 않지만 축소 작업에서는 사전 통지 없이 종료된 Pod에 보류 중인 트랜잭션이 남길 수 있습니다.

7.3. Spring Boot Narayana 복구 컨트롤러 구성

다음 예제에서는 복구 컨트롤러를 사용하여 OpenShift에서 작동하도록narayana를 구성하는 방법을 보여줍니다.

프로세스

  1. 샘플 application.properties 파일입니다. Kubernetes yaml 설명자에서 다음 옵션을 교체합니다.

    # Cluster
    cluster.nodename=1
    cluster.base-dir=./target/tx
    
    # Transaction Data
    spring.jta.transaction-manager-id=${cluster.nodename}
    spring.jta.log-dir=${cluster.base-dir}/store/${cluster.nodename}
    
    # Narayana recovery settings
    snowdrop.narayana.openshift.recovery.enabled=true
    snowdrop.narayana.openshift.recovery.current-pod-name=${cluster.nodename}
    # You must enable resource filtering in order to inject the Maven artifactId
    snowdrop.narayana.openshift.recovery.statefulset=${project.artifactId}
    snowdrop.narayana.openshift.recovery.status-dir=${cluster.base-dir}/status
    Copy to Clipboard
  2. 종료와 관련된 트랜잭션 및 정보를 모두 저장하려면 공유 볼륨이 필요합니다. 다음과 같이 StatefulSet yaml 설명자에 마운트할 수 있습니다.

    apiVersion: apps/v1beta1
    kind: StatefulSet
    #...
    spec:
    #...
      template:
    #...
        spec:
          containers:
          - env:
            - name: CLUSTER_BASE_DIR
              value: /var/transaction/data
              # Override CLUSTER_NODENAME with Kubernetes Downward API (to use `pod-0`, `pod-1` etc. as tx manager id)
            - name: CLUSTER_NODENAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
    #...
            volumeMounts:
            - mountPath: /var/transaction/data
              name: the-name-of-the-shared-volume
    #...
    Copy to Clipboard

Camel Extension for Spring Bootnaana Recovery Controller

Camel이 Spring Boot 애플리케이션 컨텍스트에서 발견되면 보류 중인 모든 트랜잭션을 플러시하기 전에 Camel 컨텍스트가 자동으로 중지됩니다.

7.4. OpenShift에서 Camel Spring Boot XA 빠른 시작 실행

다음 절차에서는 실행 중인 단일 노드 OpenShift 클러스터에서 퀵스타트를 실행하는 방법을 보여줍니다.

프로세스

  1. Camel Spring Boot XA 프로젝트를 다운로드합니다.

    git clone https://github.com/jboss-fuse/spring-boot-camel-xa
    Copy to Clipboard
  2. spring-boot-camel-xa 디렉토리로 이동하여 다음 명령을 실행합니다.

    mvn clean install
    Copy to Clipboard
  3. OpenShift 서버에 로그인합니다.

    oc login -u developer -p developer
    Copy to Clipboard
  4. test 라는 새 프로젝트 네임스페이스를 생성합니다(아직 존재하지 않는다고 가정).

    oc new-project test
    Copy to Clipboard

    test 프로젝트 네임스페이스가 이미 있는 경우 해당 네임스페이스로 전환합니다.

    oc project test
    Copy to Clipboard
  5. 종속 항목을 설치합니다.

    • OpenShift 카탈로그에서 사용자 이름으로 사용자 이름 및 암호 Thepassword1! 를 사용하여 postgresql 를 설치합니다.
    • OpenShift 카탈로그에서 사용자 이름으로 사용자 이름 및 암호를 Thepassword1! 로 사용하여 A-MQ 브로커를 설치합니다.
  6. prepare 문을 수락하도록 Postgresql 데이터베이스를 변경합니다.

    oc env dc/postgresql POSTGRESQL_MAX_PREPARED_TRANSACTIONS=100
    Copy to Clipboard
  7. 트랜잭션 로그에 대한 영구 볼륨 클레임을 생성합니다.

    oc create -f persistent-volume-claim.yml
    Copy to Clipboard
  8. 빠른 시작을 빌드하고 배포합니다.

    mvn fabric8:deploy -P openshift
    Copy to Clipboard
  9. 원하는 복제본 수까지 확장합니다.

    oc scale statefulset spring-boot-camel-xa --replicas 3
    Copy to Clipboard

    참고: Pod 이름은 트랜잭션 관리자 ID(spring.jta. Cryostat-manager-id 속성)로 사용됩니다. 현재 구현은 트랜잭션 관리자 ID의 길이도 제한합니다. 다음 사항에 유의하십시오.

    • StatefulSet의 이름은 트랜잭션 시스템의 식별자이므로 변경할 수 없습니다.
    • 모든 Pod 이름의 길이가 23자보다 작거나 같도록 StatefulSet의 이름을 지정해야 합니다. Pod 이름은 <statefulset-name>-0, <statefulset-name>-1 등을 사용하여 OpenShift에 의해 생성됩니다. Narayana는 동일한 ID를 가진 여러 복구 관리자가 없도록하기 위해 최선을 다하므로 Pod 이름이 제한보다 길면 마지막 23 바이트가 트랜잭션 관리자 ID로 사용됩니다 (와 같은 일부 문자를 제거 한 후).
  10. 빠른 시작이 실행되면 다음 명령을 사용하여 기본 서비스 URL을 가져옵니다.

    NARAYANA_HOST=$(oc get route spring-boot-camel-xa -o jsonpath={.spec.host})
    Copy to Clipboard

7.5. 성공적인 XA 트랜잭션 테스트

다음 워크플로는 성공적인 XA 트랜잭션을 테스트하는 방법을 보여줍니다.

프로세스

  1. audit_log 테이블의 메시지 목록을 가져옵니다.

    curl -w "\n" http://$NARAYANA_HOST/api/
    Copy to Clipboard
  2. 처음에는 목록이 비어 있습니다. 이제 첫 번째 요소를 삽입할 수 있습니다.

    curl -w "\n" -X POST http://$NARAYANA_HOST/api/?entry=hello
    Copy to Clipboard

    잠시 기다린 후 새 목록을 받으십시오.

    curl -w "\n" http://$NARAYANA_HOST/api/
    Copy to Clipboard
  3. 새 목록에는 hellohello-ok 이라는 두 개의 메시지가 포함되어 있습니다. hello-ok 은 메시지가 발신 큐로 전송된 다음 기록되었음을 확인합니다. 여러 메시지를 추가하고 로그를 볼 수 있습니다.

7.6. 테스트 실패 XA 트랜잭션

다음 워크플로우에서는 실패한 XA 트랜잭션을 테스트하는 방법을 보여줍니다.

프로세스

  1. fail 이라는 메시지를 보냅니다.

    curl -w "\n" -X POST http://$NARAYANA_HOST/api/?entry=fail
    Copy to Clipboard
  2. 잠시 기다린 후 새 목록을 받으십시오.

    curl -w "\n" http://$NARAYANA_HOST/api/
    Copy to Clipboard
  3. 이 메시지는 경로 끝에 예외를 생성하므로 트랜잭션이 항상 롤백됩니다. audit_log 표에서 메시지의 추적을 찾을 수 없습니다.

8장. Camel 애플리케이션과 A-MQ Broker 통합

이 튜토리얼에서는 A-MQ 이미지를 사용하여 빠른 시작을 배포하는 방법을 보여줍니다.

8.1. Spring Boot Camel A-MQ 빠른 시작 빌드 및 배포

이 예제에는 JBoss A-MQ 6 이미지 및 배포 템플릿이 필요합니다. CDK 3.1.1 이상을 사용하는 경우 JBoss A-MQ 6 이미지 및 템플릿이 기본적으로 openshift 네임스페이스에 이미 설치되어 있어야 합니다.

사전 요구 사항

  • OpenShift가 올바르게 실행 중이고 Fuse 이미지 스트림이 이미 OpenShift에 설치되어 있는지 확인합니다. 관리자용 시작하기를 참조하십시오.
  • Maven 리포지토리가 fuse용으로 구성되었는지 확인합니다. Maven 리포지토리 구성을 참조하십시오.

프로세스

  1. 빠른 시작을 빌드하고 배포할 준비가 되었으면 합니다.

    1. OpenShift에 개발자로 로그인합니다.

      oc login -u developer -p developer
      Copy to Clipboard
    2. 새 프로젝트 amq-quickstart 를 생성합니다.

      oc new-project amq-quickstart
      Copy to Clipboard
    3. 설치된 A-MQ 6 이미지 및 템플릿의 버전을 확인합니다.

      $ oc get template -n openshift
      Copy to Clipboard

      amqXX-basic 이라는 템플릿을 찾을 수 있어야 합니다. 여기서 XX 는 Openshift에 설치된 A-MQ 버전입니다.

  2. amq-quickstart 네임스페이스에 A-MQ 6 이미지를 배포합니다(이전 단계에서 발견된 실제 A-MQ 버전으로 XX 를 대체).

    $ oc process openshift//amqXX-basic -p APPLICATION_NAME=broker -p MQ_USERNAME=admin -p MQ_PASSWORD=admin -p MQ_QUEUES=test -p MQ_PROTOCOL=amqp -n amq-quickstart | oc create -f -
    Copy to Clipboard
    참고

    이전 버전의 oc 를 사용하는 경우 이 oc 명령이 실패할 수 있습니다. 이 구문은 oc 버전 3.5.x(Kubernetes 1.5.x 기반)에서 작동합니다.

  3. 메시 끝점을 검색하는 데 필요한 사용자 역할을 추가합니다(Kubernetes REST API 에이전트를 통해).

    $ oc policy add-role-to-user view system:serviceaccount:amq-quickstart:default
    Copy to Clipboard
  4. Maven 워크플로를 사용하여 빠른 시작 프로젝트를 생성합니다.

    $ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
    -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \
    -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
    -DarchetypeArtifactId=spring-boot-camel-amq-archetype \
    -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
    Copy to Clipboard
  5. archetype 플러그인은 대화형 모드로 전환되어 나머지 필드를 입력하라는 메시지를 표시합니다.

    Define value for property 'groupId': : org.example.fis
    Define value for property 'artifactId': : fuse74-spring-boot-camel-amq
    Define value for property 'version':  1.0-SNAPSHOT: :
    Define value for property 'package':  org.example.fis: :
    [INFO] Using property: spring-boot-version = 1.5.17.RELEASE
    Confirm properties configuration:
    groupId: org.example.fis
    artifactId: fuse74-spring-boot-camel-amq
    version: 1.0-SNAPSHOT
    package: org.example.fis
    spring-boot-version: 1.5.17.RELEASE
     Y: :
    Copy to Clipboard

    메시지가 표시되면 groupId 값으로 org.example.fis 를 입력하고 artifactId 값으로 fuse74-spring-boot-camel-amq 를 입력합니다. 나머지 필드의 기본값을 수락합니다.

  6. 빠른 시작 디렉터리 fuse74-spring-boot-camel-amq 로 이동합니다.

    $ cd fuse74-spring-boot-camel-amq
    Copy to Clipboard
  7. ACTIVEMQ_BROKER_USERNAMEACTIVEMQ_BROKER_PASSWORD 환경 변수를 설정하여 브로커에 로그인할 클라이언트 자격 증명을 사용자 지정합니다. fuse74-spring-boot-camel-amq 프로젝트에서 다음과 같이 src/main/fabric8/deployment.yml 파일을 편집합니다.

    spec:
      template:
        spec:
          containers:
            -
              resources:
                requests:
                  cpu: "0.2"
    #              memory: 256Mi
                limits:
                  cpu: "1.0"
    #              memory: 256Mi
              env:
              - name: AMQP_HOST
                value: broker-amq-amqp
              - name: SPRING_APPLICATION_JSON
                value: '{"server":{"undertow":{"io-threads":1, "worker-threads":2 }}}'
              - name: AMQP_USERNAME
                value: admin
              - name: AMQP_PASSWORD
                value: admin
    Copy to Clipboard
  8. mvn 명령을 실행하여 OpenShift 서버에 퀵스타트를 배포합니다.

    mvn fabric8:deploy -Popenshift
    Copy to Clipboard
  9. 빠른 시작이 성공적으로 실행 중인지 확인하려면 다음을 수행하십시오.

    1. OpenShift 콘솔로 이동합니다.
    2. amq-quickstart 프로젝트를 선택합니다.
    3. 애플리케이션을 클릭합니다.
    4. 포드 를 선택합니다.
    5. fis-spring-boot-camel-am-1-xxxxx 를 클릭합니다.
    6. 로그를 클릭합니다.

      출력에 메시지가 성공적으로 전송됨이 표시됩니다.

      10:17:59.825 [Camel (camel) thread #10 - timer://order] INFO  generate-order-route - Generating order order1379.xml
      10:17:59.829 [Camel (camel) thread #8 - JmsConsumer[incomingOrders]] INFO  jms-cbr-route - Sending order order1379.xml to the UK
      10:17:59.829 [Camel (camel) thread #8 - JmsConsumer[incomingOrders]] INFO  jms-cbr-route - Done processing order1379.xml
      10:18:02.825 [Camel (camel) thread #10 - timer://order] INFO  generate-order-route - Generating order order1380.xml
      10:18:02.829 [Camel (camel) thread #7 - JmsConsumer[incomingOrders]] INFO  jms-cbr-route - Sending order order1380.xml to another country
      10:18:02.829 [Camel (camel) thread #7 - JmsConsumer[incomingOrders]] INFO jms-cbr-route - Done processing order1380.xml
      Copy to Clipboard
  10. 웹 인터페이스에서 경로를 보려면 Open Java Console 을 클릭하고 A-MQ 대기열에서 메시지를 확인합니다.

9장. Spring Boot와 Kubernetes 통합

Spring Cloud Kubernetes 플러그인을 사용하면 현재 Spring Boot 및 Kubernetes의 다음 기능을 통합할 수 있습니다.

9.1. Spring Boot Externalized Configuration

Spring Boot에서 외부화된 구성은 외부 소스의 구성 값을 Java 코드에 삽입할 수 있는 메커니즘입니다. Java 코드에서는 일반적으로 @Value 주석(단일 필드에 삽입) 또는 @ConfigurationProperties 주석(Java Cryostat 클래스의 여러 속성에 삽입)에 주석을 달아 삽입할 수 있습니다.

구성 데이터는 다양한 소스(또는 속성소스)에서 가져올 수 있습니다. 특히 구성 속성은 프로젝트의 application.properties 파일(또는 원하는 경우 application.yaml 파일)에 설정되는 경우가 많습니다.

9.1.1. Kubernetes ConfigMap

Kubernetes ConfigMap 은 배포된 애플리케이션에 구성 데이터를 제공할 수 있는 메커니즘입니다. ConfigMap 오브젝트는 일반적으로 YAML 파일에 정의되어 있으며, 그런 다음 Kubernetes 클러스터에 업로드되어 배포된 애플리케이션에서 구성 데이터를 사용할 수 있습니다.

9.1.2. Kubernetes 시크릿

Kubernetes 시크릿 은 배포된 애플리케이션에 중요한 데이터(암호, 인증서 등)를 제공하는 메커니즘입니다.

9.1.3. Spring Cloud Kubernetes 플러그인

Spring Cloud Kubernetes 플러그인은 Kubernetes와 Spring Boot 간의 통합을 구현합니다. 기본적으로 Kubernetes API를 사용하여 ConfigMap의 구성 데이터에 액세스할 수 있습니다. 그러나 Kubernetes ConfigMap을 Spring Boot 외부화된 구성 메커니즘과 직접 통합하여 Kubernetes ConfigMap이 Spring Boot 구성의 대체 속성 소스로 작동하는 것이 훨씬 더 편리합니다. 기본적으로 Spring Cloud Kubernetes 플러그인이 제공하는 것입니다.

9.1.4. Kubernetes 통합으로 Spring Boot 활성화

pom.xml 파일에 Maven 종속성으로 추가하여 Kubernetes 통합을 활성화할 수 있습니다.

프로세스

  1. Spring Boot Maven 프로젝트의 pom.xml 파일에 다음 Maven 종속성을 추가하여 Kubernetes 통합을 활성화합니다.

    <project ...>
      ...
      <dependencies>
        ...
        <dependency>
          <groupId>io.fabric8</groupId>
          <artifactId>spring-cloud-kubernetes-core</artifactId>
        </dependency>
        ...
      </dependencies>
      ...
    </project>
    Copy to Clipboard
  2. 통합을 완료하려면,

    • Java 소스 코드에 몇 가지 주석을 추가합니다.
    • Kubernetes ConfigMap 오브젝트 생성
    • 애플리케이션이 ConfigMap 오브젝트를 읽을 수 있도록 OpenShift 서비스 계정 권한을 수정합니다.

9.2. ConfigMap 속성 소스에 대한 튜토리얼 실행

다음 튜토리얼을 사용하면 Kubernetes 시크릿 및 ConfigMap 설정을 실험할 수 있습니다. Kubernetes 통합 활성화에 설명된 대로 Spring Cloud Kubernetes 플러그인을 활성화하여 Kubernetes 구성 오브젝트를 Spring Boot Externalized Configuration과 통합합니다.

9.2.1. Spring Boot Camel Config 빠른 시작 실행

다음 튜토리얼은 Kubernetes Secrets 및 ConfigMap을 설정할 수 있는 Spring -boot-camel-config-archetype Maven archetype을 기반으로 합니다.

프로세스

  1. 새 쉘 프롬프트를 열고 다음 Maven 명령을 입력하여 간단한 Camel Spring Boot 프로젝트를 생성합니다.

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
      -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \
      -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
      -DarchetypeArtifactId=spring-boot-camel-config-archetype \
      -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
    Copy to Clipboard

    archetype 플러그인은 대화형 모드로 전환되어 나머지 필드를 입력하라는 메시지를 표시합니다.

    Define value for property 'groupId': : org.example.fis
    Define value for property 'artifactId': : fuse74-configmap
    Define value for property 'version':  1.0-SNAPSHOT: :
    Define value for property 'package':  org.example.fis: :
    [INFO] Using property: spring-boot-version = 1.5.17.RELEASE
    Confirm properties configuration:
    groupId: org.example.fis
    artifactId: fuse74-configmap
    version: 1.0-SNAPSHOT
    package: org.example.fis
    spring-boot-version: 1.5.17.RELEASE
     Y: :
    Copy to Clipboard

    메시지가 표시되면 groupId 값으로 org.example.fis 를 입력하고 artifactId 값으로 fuse74-configmap 을 입력합니다. 나머지 필드의 기본값을 수락합니다.

  2. OpenShift에 로그인하고 애플리케이션을 배포할 OpenShift 프로젝트로 전환합니다. 예를 들어 developer 사용자로 로그인하고 test 프로젝트에 배포하려면 다음 명령을 입력합니다.

    oc login -u developer -p developer
    oc project test
    Copy to Clipboard
  3. 명령줄에서 새 fuse74-configmap 프로젝트의 디렉터리로 변경하고 이 애플리케이션에 대한 Secret 오브젝트를 생성합니다.

    oc create -f sample-secret.yml
    Copy to Clipboard
    참고

    애플리케이션을 배포하기 전에 Secret 오브젝트를 생성해야 합니다. 그러지 않으면 배포된 컨테이너가 Secret을 사용할 수 있을 때까지 대기 상태가 됩니다. 나중에 Secret을 생성하면 컨테이너가 대기 상태가 됩니다. Secret Object 설정 방법에 대한 자세한 내용은 시크릿 설정을 참조하십시오.

  4. 빠른 시작 애플리케이션을 빌드하고 배포합니다. fuse74-configmap 프로젝트의 최상위 수준에서 다음을 입력합니다.

    mvn fabric8:deploy -Popenshift
    Copy to Clipboard
  5. 다음과 같이 애플리케이션 로그를 확인합니다.

    1. 브라우저에서 OpenShift 콘솔을 열고 관련 프로젝트 네임스페이스(예: test)를 선택합니다.
    2. fuse74-configmap 서비스의 원형 pod 아이콘 중앙을 클릭합니다.
    3. Pod 보기에서 Pod 이름을 클릭하여 실행 중인 Pod의 세부 정보를 확인합니다(대체적으로 하나의 Pod만 실행 중인 경우 세부 정보 페이지로 바로 이동합니다).
    4. 로그 태그를 클릭하여 애플리케이션 로그를 보고 아래로 스크롤하여 Camel 애플리케이션에서 생성한 로그 메시지를 찾습니다.
  6. src/main/resources/application.properties 에 구성된 기본 수신자 목록은 생성된 메시지를 direct:async-queuedirect:file 이라는 두 개의 더미 엔드포인트로 보냅니다. 이로 인해 다음과 같은 메시지가 애플리케이션 로그에 기록됩니다.

    5:44:57.376 [Camel (camel) thread #0 - timer://order] INFO  generate-order-route - Generating message message-44, sending to the recipient list
    15:44:57.378 [Camel (camel) thread #0 - timer://order] INFO  target-route-queue - ----> message-44 pushed to an async queue (simulation)
    15:44:57.379 [Camel (camel) thread #0 - timer://order] INFO  target-route-queue - ----> Using username 'myuser' for the async queue
    15:44:57.380 [Camel (camel) thread #0 - timer://order] INFO  target-route--file - ----> message-44 written to a file
    Copy to Clipboard
  7. ConfigMap 오브젝트를 사용하여 fuse74-configmap 애플리케이션의 구성을 업데이트하려면 fuse74-configmap 애플리케이션 권한을 부여하여 OpenShift ApiServer에서 데이터를 볼 수 있는 권한을 부여해야 합니다. 다음 명령을 입력하여 fuse74-configmap 애플리케이션의 서비스 계정에 대한 보기 권한을 부여합니다.

    oc policy add-role-to-user view system:serviceaccount:test:qs-camel-config
    Copy to Clipboard
    참고

    서비스 계정은 system:serviceaccount:PROJECT_NAME:SERVICE_ACCOUNT_NAME 구문을 사용하여 지정됩니다. fis-config 배포 설명자는 qs-camel-configSERVICE_ACCOUNT_NAME 을 정의합니다.

  8. 작동 중인 실시간 다시 로드 기능을 보려면 다음과 같이 ConfigMap 오브젝트를 생성합니다.

    oc create -f sample-configmap.yml
    Copy to Clipboard

    새 ConfigMap은 실행 중인 애플리케이션에서 Camel 경로의 수신자 목록을 재정의하여 생성된 메시지를 direct:async-queue,direct:file, direct:mail. ConfigMap 오브젝트에 대한 자세한 내용은 ConfigMap 설정을 참조하십시오. 이로 인해 다음과 같은 메시지가 애플리케이션 로그에 기록됩니다.

    16:25:24.121 [Camel (camel) thread #0 - timer://order] INFO  generate-order-route - Generating message message-9, sending to the recipient list
    16:25:24.124 [Camel (camel) thread #0 - timer://order] INFO  target-route-queue - ----> message-9 pushed to an async queue (simulation)
    16:25:24.125 [Camel (camel) thread #0 - timer://order] INFO  target-route-queue - ----> Using username 'myuser' for the async queue
    16:25:24.125 [Camel (camel) thread #0 - timer://order] INFO  target-route--file - ----> message-9 written to a file (simulation)
    16:25:24.126 [Camel (camel) thread #0 - timer://order] INFO  target-route--mail - ----> message-9 sent via mail
    Copy to Clipboard

9.2.2. 구성 속성 Cryostat

구성 속성^n은 삽입을 통해 구성 설정을 수신할 수 있는 일반 Java 8080입니다. Java 코드와 외부 구성 메커니즘 간의 기본 인터페이스를 제공합니다.

외부 구성 및 Cryostat 레지스트리

다음 이미지는 Spring Boot Externalized Configuration이 spring-boot-camel-config quickstart에서 작동하는 방법을 보여줍니다.

kube spring boot 01

구성 메커니즘에는 다음과 같은 주요 부분이 있습니다.

속성 소스
구성에 삽입하기 위한 속성 설정을 제공합니다. 기본 속성 소스는 애플리케이션의 application.properties 파일이며, 선택적으로 ConfigMap 오브젝트 또는 Secret 오브젝트로 덮어쓸 수 있습니다.
구성 속성 metrics
속성 소스에서 configuraton 업데이트를 수신합니다. 구성 속성 8080은 @Configuration@ConfigurationProperties 주석으로 데코레이팅된 Java 8080입니다.
Spring 8080 레지스트리
필수 주석을 사용하면 구성 속성 metrics이 Spring 8080 레지스트리에 등록됩니다.
Camel 8080 레지스트리와 통합
Camel 8080 레지스트리는 Spring 8080 레지스트리와 자동으로 통합되어 Camel 경로에서 registered Spring 빈을 참조할 수 있습니다.

빠른 시작Configuration 클래스

fuse74-configmap 프로젝트의 구성 속성 sum은 다음과 같이 빠른 시작 구성 Java 클래스( src/main/java/org/example/fis/ 디렉터리에 있음)로 정의됩니다.

package org.example.fis;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration  
1

@ConfigurationProperties(prefix = "quickstart")  
2

public class QuickstartConfiguration {

    /**
     * A comma-separated list of routes to use as recipients for messages.
     */
    private String recipients;  
3


    /**
     * The username to use when connecting to the async queue (simulation)
     */
    private String queueUsername;  
4


    /**
     * The password to use when connecting to the async queue (simulation)
     */
    private String queuePassword;  
5


    // Setters and Getters for Bean properties
    // NOT SHOWN
    ...
}
Copy to Clipboard
1
@Configuration 주석을 사용하면 빠른 시작 클래스가 ID가 있는 빈으로 Spring에 인스턴스화되고 등록되며, quickstartConfiguration 클래스가 생성됩니다. 이렇게 하면 Camel에서 빈에 자동으로 액세스할 수 있습니다. 예를 들어 target-route-queue 경로는 Camel 구문 ${bean:quickstartConfiguration?method=getQueueUsername} 을 사용하여 queueUserName 속성에 액세스할 수 있습니다.
2
@ConfigurationProperties 주석은 속성 소스에서 속성 값을 정의할 때 사용해야 하는 접두사인 quickstart 를 정의합니다. 예를 들어 속성 파일은 recipient 속성을 quickstart.recipients 로 참조합니다.For example, a properties file would reference the recipient property as quickstart.recipients.
3
recipient 속성은 속성 소스에서 삽입할 수 있습니다.
4
queueUsername 속성은 속성 소스에서 삽입할 수 있습니다.
5
queuePassword 속성은 속성 소스에서 삽입할 수 있습니다.

9.2.3. 보안 설정

이 빠른 시작의 Kubernetes 시크릿은 추가 필수 단계 중 하나와 별도로 표준 방식으로 설정됩니다. Spring Cloud Kubernetes 플러그인은 시크릿의 마운트 경로로 구성되어야 런타임에 보안을 읽을 수 있습니다. 보안을 설정하려면 다음을 수행합니다.

  1. 샘플 시크릿 오브젝트 생성
  2. 시크릿의 볼륨 마운트 구성
  3. Secret 속성을 읽을 수 있도록 spring-cloud-kubernetes 구성

샘플 Secret 오브젝트

빠른 시작 프로젝트는 다음과 같이 샘플 Secret, sample-secret.yml 을 제공합니다. Secret 오브젝트의 속성 값은 항상 base64로 인코딩됩니다( base64 명령줄 유틸리티 사용). Pod의 파일 시스템에 보안이 마운트되면 값이 자동으로 일반 텍스트로 다시 디코딩됩니다.

sample-secret.yml 파일

apiVersion: v1
kind: Secret
metadata: 
1

  name: camel-config
type: Opaque
data:
  # The username is 'myuser'
  quickstart.queue-username: bXl1c2VyCg== 
2

  quickstart.queue-password: MWYyZDFlMmU2N2Rm 
3
Copy to Clipboard

1
metadata.name: 시크릿을 식별합니다. OpenShift 시스템의 다른 부분에서는 이 ID를 사용하여 보안을 참조합니다.
2
Quickstart.queue-username: quickstartConfiguration VLAN의 queueUsername 속성에 삽입해야 합니다. 값은 base64로 인코딩 되어야 합니다.
3
Quickstart.queue-password: quickstartConfiguration 8080의 queuePassword 속성에 삽입해야 합니다. 값은 base64로 인코딩 되어야 합니다.
참고

Kubernetes에서는 CamelCase에서 속성 이름을 정의할 수 없습니다(속성 이름이 모두 소문자여야 함). 이 제한을 해결하려면 Spring Boot가 queueUsername 과 일치하는 하이픈이 지정된 형식의 queue-username 을 사용합니다. 이는 외부화된 구성에 대한 Spring Boot의 완화된 바인딩 규칙을 활용합니다.

시크릿의 볼륨 마운트 구성

보안을 볼륨 마운트로 구성하여 런타임에 보안을 로드하도록 애플리케이션을 구성해야 합니다. 애플리케이션이 시작되면 Secret 속성이 파일 시스템의 지정된 위치에서 사용할 수 있게 됩니다. 애플리케이션의 deployment.yml 파일은 Secret의 볼륨 마운트를 정의하는 src/main/fabric8/ 디렉터리에 있습니다.

deployment.yml 파일

spec:
  template:
    spec:
      serviceAccountName: "qs-camel-config"
      volumes: 
1

        - name: "camel-config"
          secret:
            # The secret must be created before deploying this application
            secretName: "camel-config"
      containers:
        -
          volumeMounts: 
2

            - name: "camel-config"
              readOnly: true
              # Mount the secret where spring-cloud-kubernetes is configured to read it
              # see src/main/resources/bootstrap.yml
              mountPath: "/etc/secrets/camel-config"
          resources:
#            requests:
#              cpu: "0.2"
#              memory: 256Mi
#            limits:
#              cpu: "1.0"
#              memory: 256Mi
             env:
              - name: SPRING_APPLICATION_JSON
               value: '{"server":{"undertow":{"io-threads":1, "worker-threads":2 }}}'
Copy to Clipboard

1
volumes 섹션에서 배포는 camel-config 라는 시크릿을 참조하는 camel-config 라는 새 볼륨을 선언합니다.
2
volumeMounts 섹션에서 배포는 camel-config 볼륨을 참조하는 새 볼륨 마운트를 선언하고 Secret 볼륨을 Pod 파일 시스템의 경로 /etc/secrets/camel-config 에 마운트하도록 지정합니다.

Secret 속성을 읽을 수 있도록 spring-cloud-kubernetes 구성

시크릿을 Spring Boot 외부화된 구성과 통합하려면 Spring Cloud Kubernetes 플러그인을 시크릿의 마운트 경로로 구성해야 합니다. Spring Cloud Kubernetes는 지정된 위치에서 시크릿을 읽고 속성 소스로 Spring Boot에서 사용할 수 있도록 합니다. Spring Cloud Kubernetes 플러그인은 quickstart 프로젝트의 src/main/resources 아래에 있는 bootstrap.yml 파일의 설정으로 구성됩니다.

bootstrap.yml 파일

# Startup configuration of Spring-cloud-kubernetes
spring:
  application:
    name: camel-config
  cloud:
    kubernetes:
      reload:
        # Enable live reload on ConfigMap change (disabled for Secrets by default)
        enabled: true
      secrets:
        paths: /etc/secrets/camel-config
Copy to Clipboard

spring.cloud.kubernetes.secrets.paths 속성은 Pod의 보안 볼륨 마운트 경로 목록을 지정합니다.

참고

bootstrap.properties 파일(또는 bootstrap.yml 파일)은 application.properties 파일과 유사하게 작동하지만 애플리케이션 시작의 이전 단계에서 로드됩니다. bootstrap.properties 파일에서 Spring Cloud Kubernetes 플러그인과 관련된 속성을 설정하는 것이 더 안정적입니다.

9.2.4. ConfigMap 설정

ConfigMap 오브젝트를 생성하고 뷰 권한을 적절하게 설정하는 것 외에도 Spring Cloud Kubernetes와의 통합을 위해서는 ConfigMap의 metadata.name 값과 프로젝트의 bootstrap.yml 파일에 구성된 spring.application.name 속성 값과 일치해야 합니다. ConfigMap을 설정하려면 다음을 수행합니다.

  • 샘플 ConfigMap 오브젝트 생성
  • 보기 권한 설정
  • Spring Cloud Kubernetes 플러그인 구성

샘플 ConfigMap 오브젝트

빠른 시작 프로젝트는 샘플 ConfigMap인 sample-configmap.yml 을 제공합니다.

kind: ConfigMap
apiVersion: v1
metadata: 
1

  # Must match the 'spring.application.name' property of the application
  name: camel-config
data:
  application.properties: | 
2

    # Override the configuration properties here
    quickstart.recipients=direct:async-queue,direct:file,direct:mail 
3
Copy to Clipboard
1
metadata.name: ConfigMap을 식별합니다. OpenShift 시스템의 다른 부분에서는 이 ID를 사용하여 ConfigMap을 참조합니다.
2
data.application.properties: 이 섹션에는 애플리케이션과 함께 배포된 원래 application.properties 파일의 설정을 재정의할 수 있는 속성 설정이 나열됩니다.
3
Quickstart.recipients: quickstartConfiguration VLAN의 받는 사람 속성에 삽입해야 합니다.

보기 권한 설정

Secret의 deployment.yml 파일에 표시된 대로 프로젝트의 deployment.yml 파일에서 serviceAccountNameqs-camel-config 로 설정됩니다. 따라서 빠른 시작 애플리케이션에 대한 보기 권한을 활성화하려면 다음 명령을 입력해야 합니다( 테스트 프로젝트 네임스페이스에 배포된다고 가정).

oc policy add-role-to-user view system:serviceaccount:test:qs-camel-config
Copy to Clipboard

Spring Cloud Kubernetes 플러그인 구성

Spring Cloud Kubernetes 플러그인은 bootstrap.yml 파일의 다음 설정으로 구성됩니다.

spring.application.name
이 값은 ConfigMap 오브젝트의 metadata.name 과 일치해야 합니다(예: quickstart 프로젝트의 sample-configmap.yml 에 정의된 대로). 기본값은 application 입니다.
spring.cloud.kubernetes.reload.enabled
이를 true 로 설정하면 ConfigMap 오브젝트의 동적 재로드가 활성화됩니다.

지원되는 속성에 대한 자세한 내용은 PropertySource Reload Configuration Properties 을 참조하십시오.

9.3. ConfigMap PropertySource 사용

Kubernetes에는 구성을 애플리케이션에 전달하기 위한 ConfigMap 의 개념이 있습니다. Spring 클라우드 Kubernetes 플러그인은 ConfigMap 과 통합을 제공하여 Spring Boot에서 구성 맵에 액세스할 수 있도록 합니다.

활성화된 ConfigMap PropertySource 는 애플리케이션 다음에 이름이 지정된 ConfigMap 에 대해 Kubernetes를 조회합니다( spring.application.name참조). 맵이 발견되면 해당 데이터를 읽고 다음을 수행합니다.

9.3.1. 개별 속성 적용

속성을 사용하여 스레드 풀 구성을 읽는 demo 라는 Spring Boot 애플리케이션이 있다고 가정하겠습니다.

  • pool.size.core
  • pool.size.max

YAML 형식의 구성 맵에 외부화할 수 있습니다.

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  pool.size.core: 1
  pool.size.max: 16
Copy to Clipboard

9.3.2. 속성 이름 application.yaml 적용

개별 속성은 대부분의 경우에 적합하지만 YAML이 더 편리합니다. 이 경우 application.yaml 이라는 단일 속성을 사용하고 YAML을 여기에 삽입합니다.

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  application.yaml: |-
    pool:
      size:
        core: 1
        max:16
Copy to Clipboard

9.3.3. 속성 이름 애플리케이션.properties 적용

Spring Boot application.properties 파일의 스타일에 ConfigMap 속성을 정의할 수도 있습니다. 이 경우 application.properties 라는 단일 속성을 사용하고 그 안에 속성 설정을 나열합니다.

kind: ConfigMap
apiVersion: v1
metadata:
  name: demo
data:
  application.properties: |-
    pool.size.core: 1
    pool.size.max: 16
Copy to Clipboard

9.3.4. ConfigMap 배포

ConfigMap을 배포하고 Spring Boot 애플리케이션에 액세스하려면 다음 단계를 수행합니다.

프로세스

  1. Spring Boot 애플리케이션에서 외부화된 구성 메커니즘을 사용하여 ConfigMap 속성 소스에 액세스합니다. 예를 들어 Java 8080에 @Configuration 주석에 주석을 달면 ConfigMap을 통해 빈의 속성 값을 삽입할 수 있습니다.
  2. 프로젝트의 bootstrap.properties 파일(또는 bootstrap.yaml 파일)에서 ConfigMap의 이름과 일치하도록 spring.application.name 속성을 설정합니다.
  3. 애플리케이션과 연결된 서비스 계정에 대한 보기 권한을 활성화합니다(기본적으로 기본이라는 서비스 계정임). 예를 들어 기본 서비스 계정에 보기 권한을 추가하려면 다음을 수행합니다.

    oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
    Copy to Clipboard

9.4. Secrets PropertySource 사용

Kubernetes에는 암호, OAuth 토큰 등과 같은 중요한 데이터를 저장하기 위한 시크릿 개념이 있습니다. Spring 클라우드 Kubernetes 플러그인은 시크릿과 통합을 제공하여 Spring Boot에서 시크릿에 액세스할 수 있도록 합니다.

활성화된 Secrets 속성 소스는 다음 소스에서 Kubernetes for Secrets 를 찾습니다. 시크릿이 발견되면 해당 데이터를 애플리케이션에서 사용할 수 있습니다.

  1. 보안 마운트에서 재귀적으로 읽기
  2. 애플리케이션 이름( spring.application.name참조)
  3. 일부 라벨 일치

기본적으로 API(위 2 및 3)를 통해 Secrets를 사용하는 것은 활성화되지 않습니다.

9.4.1. 시크릿 설정 예

속성을 사용하여 ActiveMQ 및 PostreSQL 구성을 읽는 demo 라는 Spring Boot 애플리케이션이 있다고 가정하겠습니다.

amq.username
amq.password
pg.username
pg.password
Copy to Clipboard

이러한 보안은 YAML 형식의 시크릿 으로 외부화할 수 있습니다.

ActiveMQ Secrets
apiVersion: v1
kind: Secret
metadata:
  name: activemq-secrets
  labels:
    broker: activemq
type: Opaque
data:
  amq.username: bXl1c2VyCg==
  amq.password: MWYyZDFlMmU2N2Rm
Copy to Clipboard
PostreSQL 시크릿
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secrets
  labels:
    db: postgres
type: Opaque
data:
  pg.username: dXNlcgo=
  pg.password: cGdhZG1pbgo=
Copy to Clipboard

9.4.2. 보안 사용

다음과 같은 여러 가지 방법으로 사용할 보안을 선택할 수 있습니다.

  • 보안이 매핑되는 디렉터리를 나열하여 다음을 수행하십시오.

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/activemq,etc/secrets/postgres
    Copy to Clipboard

    공통 루트에 매핑된 모든 보안이 있는 경우 다음과 같이 설정할 수 있습니다.

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
    Copy to Clipboard
  • 이름이 지정된 보안을 설정하면 다음을 수행합니다.

    -Dspring.cloud.kubernetes.secrets.name=postgres-secrets
    Copy to Clipboard
  • 라벨 목록을 정의하여 다음을 수행합니다.

    -Dspring.cloud.kubernetes.secrets.labels.broker=activemq
    -Dspring.cloud.kubernetes.secrets.labels.db=postgres
    Copy to Clipboard

9.4.3. Secrets PropertySource에 대한 구성 속성

다음 속성을 사용하여 Secrets 속성 소스를 구성할 수 있습니다.

spring.cloud.kubernetes.secrets.enabled
Secrets 속성 소스를 활성화합니다. type은 부울 이며 기본값은 true 입니다.
spring.cloud.kubernetes.secrets.name
조회할 시크릿 이름을 설정합니다. type은 문자열 이며 기본값은 ${spring.application.name} 입니다.
spring.cloud.kubernetes.secrets.labels
보안을 조회하는 데 사용되는 레이블을 설정합니다. 이 속성은 Map 기반 바인딩에 의해 정의된 대로 작동합니다. type은 java.util.Map 이며 기본값은 null 입니다.
spring.cloud.kubernetes.secrets.paths
보안이 마운트된 경로를 설정합니다. 이 속성은 컬렉션 기반 바인딩에 의해 정의된 대로 작동합니다. type은 java.util.List 이며 기본값은 null 입니다.
spring.cloud.kubernetes.secrets.enableApi
API를 통해 보안 사용을 활성화/비활성화합니다. type은 부울 이며 기본값은 false 입니다.
참고

보안상의 이유로 API를 통해 시크릿에 대한 액세스가 제한될 수 있습니다. 즉, 권장되는 방법은 POD에 시크릿을 마운트하는 것입니다.

9.5. PropertySource Reload 사용

일부 애플리케이션은 외부 속성 소스의 변경 사항을 감지하고 새 구성을 반영하도록 내부 상태를 업데이트해야 할 수 있습니다. Spring Cloud Kubernetes의 다시 로드 기능은 관련 ConfigMap 또는 Secret이 변경되면 애플리케이션을 다시 로드할 수 있습니다.

9.5.1. PropertySource Reload 활성화

Spring Cloud Kubernetes의 PropertySource 다시 로드 기능은 기본적으로 비활성화되어 있습니다.

프로세스

  1. faststart 프로젝트의 src/main/resources 디렉터리로 이동하여 bootstrap.yml 파일을 엽니다.
  2. 설정 속성 spring.cloud.kubernetes.reload.enabled=true 를 변경합니다.

9.5.2. PropertySource Reload의 수준

속성 spring.cloud.kubernetes.reload.strategy:에 대해 다음 수준의 재로드가 지원됩니다.

새로고침

(기본값) @ConfigurationProperties 또는 @RefreshScope 주석이 추가된 구성 빈만 다시 로드됩니다. 이 다시 로드 수준은 Spring Cloud Context의 새로 고침 기능을 활용합니다.

참고

PropertySource 다시 로드 기능은 다시 로드 전략이 새로 고침 되도록 설정된 경우 간단한 속성(즉, 컬렉션이 아님)에만 사용할 수 있습니다. 컬렉션에서 지원하는 속성은 런타임 시 변경할 수 없습니다.

restart_context
전체 Spring ApplicationContext 가 정상적으로 다시 시작됩니다. 빈은 새 구성으로 다시 생성됩니다.
shutdown
Spring ApplicationContext 가 종료되어 컨테이너를 다시 시작합니다. 이 수준을 사용하는 경우 모든 비daemon 스레드의 라이프사이클이 ApplicationContext에 바인딩되고 복제 컨트롤러 또는 복제본 세트가 Pod를 재시작하도록 구성되어 있는지 확인합니다.

9.5.3. PropertySource Reload의 예

다음 예제에서는 다시 로드 기능이 활성화된 경우 어떤 일이 발생하는지 설명합니다.

프로세스

  1. 다시 로드 기능이 기본 설정(새로 고침 모드)으로 활성화되어 있다고 가정합니다. 구성 맵이 변경되면 다음 8080이 새로 고쳐집니다.

    @Configuration
    @ConfigurationProperties(prefix = "bean")
    public class MyConfig {
    
        private String message = "a message that can be changed live";
    
        // getter and setters
    
    }
    Copy to Clipboard
  2. 변경 사항을 확인하려면 다음과 같이 메시지를 주기적으로 출력하는 다른 8080을 만듭니다.

    @Component
    public class MyBean {
    
        @Autowired
        private MyConfig config;
    
        @Scheduled(fixedDelay = 5000)
        public void hello() {
            System.out.println("The message is: " + config.getMessage());
        }
    }
    Copy to Clipboard
  3. 다음과 같이 ConfigMap을 사용하여 애플리케이션에서 인쇄한 메시지를 변경할 수 있습니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: reload-example
    data:
      application.properties: |-
        bean.message=Hello World!
    Copy to Clipboard

    Pod와 연결된 구성 맵에서 metrics.message 라는 속성의 변경 사항은 프로그램 출력에 반영됩니다.

9.5.4. PropertySource 다시 로드 운영 모드

다시 로드 기능은 다음 두 가지 작동 모드를 지원합니다.

event
(기본값) Kubernetes API(웹 소켓)를 사용하여 ConfigMap 또는 시크릿의 변경 사항을 감시합니다. 모든 이벤트는 구성을 다시 확인하고 변경 시 다시 로드됩니다. 구성 맵 변경 사항을 수신하려면 서비스 계정의 view 역할이 필요합니다. 상위 수준 역할(예:). 보안에는 편집해야 합니다(기본적으로 시크릿은 모니터링되지 않음).
폴링
구성 맵 및 시크릿에서 정기적으로 구성을 다시 생성하여 변경되었는지 확인합니다. 폴링 기간은 spring.cloud.kubernetes.reload.period 속성을 사용하여 구성할 수 있으며 기본값은 15초입니다. 모니터링된 속성 소스와 동일한 역할이 필요합니다. 예를 들어, 파일 마운트된 시크릿 소스에서 폴링을 사용하면 특정 권한이 필요하지 않습니다.

9.5.5. PropertySource 구성 속성 다시 로드

다음 속성을 사용하여 다시 로드 기능을 구성할 수 있습니다.

spring.cloud.kubernetes.reload.enabled
속성 소스 및 구성 다시 로드를 모니터링할 수 있습니다. type은 부울 이며 기본값은 false 입니다.
spring.cloud.kubernetes.reload.monitoring-config-maps
구성 맵의 변경 사항을 모니터링할 수 있습니다. type은 부울 이며 기본값은 true 입니다.
spring.cloud.kubernetes.reload.monitoring-secrets
보안 변경 사항을 모니터링할 수 있습니다. type은 부울 이며 기본값은 false 입니다.
spring.cloud.kubernetes.reload.strategy
다시 로드를 실행할 때 사용할 전략입니다(새로 고침,restart_context,shutdown). type은 Enum 이고 기본값은 refresh 입니다.
spring.cloud.kubernetes.reload.mode
속성 소스의 변경 사항을 청취하는 방법(이벤트,폴링)을 지정합니다. type은 Enum 이고 기본값은 event 입니다.
spring.cloud.kubernetes.reload.period
폴링 전략을 사용할 때 변경 사항을 확인하는 데 사용되는 시간(밀리초)입니다. type은 Long 이고 기본값은 15000 입니다.

다음 사항에 유의하십시오.

  • spring.cloud.kubernetes.reload.* 속성은 ConfigMaps 또는 Secrets에서 사용해서는 안 됩니다. 런타임에 이러한 속성을 변경하면 예기치 않은 결과가 발생할 수 있습니다.
  • 속성 또는 전체 구성 맵을 삭제해도 새로 고침 수준을 사용할 때 빈의 원래 상태가 복원되지 않습니다.

10장. Karaf Image용 애플리케이션 개발

이 튜토리얼에서는 Karaf 이미지에 대한 애플리케이션을 만들고 배포하는 방법을 보여줍니다.

10.1. Maven Archetype을 사용하여 Karaf 프로젝트 생성

Maven archetype을 사용하여 Karaf 프로젝트를 생성하려면 다음 단계를 따르십시오.

프로세스

  1. 시스템의 적절한 디렉터리로 이동합니다.
  2. Maven 명령을 시작하여 Karaf 프로젝트를 생성합니다.

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \
      -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \
      -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \
      -DarchetypeArtifactId=karaf-camel-log-archetype \
      -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
    Copy to Clipboard
  3. archetype 플러그인이 대화형 모드로 전환하여 나머지 필드를 입력하라는 메시지를 표시합니다.

    Define value for property 'groupId': : org.example.fis
    Define value for property 'artifactId': : fuse74-karaf-camel-log
    Define value for property 'version':  1.0-SNAPSHOT: :
    Define value for property 'package':  org.example.fis: :
    Confirm properties configuration:
    groupId: org.example.fis
    artifactId: fuse74-karaf-camel-log
    version: 1.0-SNAPSHOT
    package: org.example.fis
     Y: :
    Copy to Clipboard

    메시지가 표시되면 groupId 값으로 org.example.fis 를 입력하고 artifactId 값에 대해 fuse74-karaf-camel-log 를 입력합니다. 나머지 필드의 기본값을 수락합니다.

  4. 예제를 빌드하고 배포하는 방법에 대한 퀵스타트의 지침에 따릅니다.
참고

사용 가능한 Karaf archetypes의 전체 목록은 Karaf Archetype Catalog 를 참조하십시오.

10.2. Camel Karaf 애플리케이션 구조

Camel Karaf 애플리케이션의 디렉터리 구조는 다음과 같습니다.

  ├── pom.xml 
1

  ├── README.md
  ├── configuration
  │   └── settings.xml
  └── src
      ├── main
      │   ├── fabric8
      │   │   └── deployment.yml 
2

      │   ├── java
      │   │   └── org
      │   │       └── example
      │   │           └── fis
      │   └── resources
      │       ├── assembly
      │       │   └── etc
      │       │       └── org.ops4j.pax.logging.cfg 
3

      │       └── OSGI-INF
      │           └── blueprint
      │               └── camel-log.xml 
4

      └── test
          └── java
              └── org
                  └── example
                      └── fis
Copy to Clipboard

Karaf 애플리케이션을 개발하는 데 다음 파일이 중요한 경우:

1
POM.xml: 추가 종속 항목을 포함합니다. pom.xml 파일에 종속 항목을 추가할 수 있습니다(예: 로깅의 경우 SLF4J를 사용할 수 있습니다.
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </dependency>
Copy to Clipboard
2
src/main/fabric8/deployment.yml: fabric8-maven-plugin에서 생성한 기본 OpenShift 구성 파일과 병합되는 추가 구성을 제공합니다.
참고

이 파일은 Karaf 애플리케이션의 일부로 사용되지 않지만 CPU 및 메모리 사용과 같은 리소스를 제한하는 데 모든 퀵스타트에서 사용됩니다.

3
org.ops4j.pax.logging.cfg: 로그 수준을 사용자 지정하는 방법을 시연하고, 로깅 수준을 기본값 INFO 대신 DEBUG로 설정합니다.
4
Camel-log.xml: 애플리케이션의 소스 코드를 포함합니다.

10.3. Karaf Archetype Catalog

Karaf archetype 카탈로그에는 다음 예제가 포함되어 있습니다.

표 10.1. Karaf Maven Archetypes
이름설명

karaf-camel-amq-archetype

Camel amq 구성 요소를 사용하여 Apache ActiveMQ 메시지 브로커에 메시지를 보내고 수신하는 방법을 보여줍니다.

karaf-camel-log-archetype

5초마다 서버 로그에 메시지를 기록하는 간단한 Apache Camel 애플리케이션을 보여줍니다.

karaf-camel-rest-sql-archetype

Camel의 REST DSL과 함께 JDBC를 통한 SQL을 사용하여 RESTful API를 노출하는 방법을 보여줍니다.

karaf-cxf-rest-archetype

CXF를 사용하여 RESTful(JAX-RS) 웹 서비스를 생성하고 OSGi HTTP Service를 통해 노출하는 방법을 보여줍니다.

10.4. Fabric8 Karaf 기능 사용

Fabric8은 Apache Karaf를 지원하여 Kubernetes용 OSGi 앱을 더 쉽게 개발할 수 있도록 지원합니다.

Fabric8의 중요한 기능은 다음과 같습니다.

  • 블루프린트 XML 파일에서 자리 표시자를 해결하기 위한 다양한 전략입니다.
  • 환경 변수
  • 시스템 속성
  • 서비스
  • Kubernetes ConfigMap
  • Kubernetes 시크릿
  • Kubernetes 구성 맵을 사용하여 OSGi 구성 관리를 동적으로 업데이트합니다.
  • OSGi 서비스에 대한 Kubernetes heath 검사를 제공합니다.

10.4.1. Fabric8 Karaf 기능 추가

이 기능을 사용하려면 프로젝트 pom 파일에 fabric8-karaf-features 종속성을 추가합니다.

프로세스

  1. 프로젝트의 pom.xml 파일을 열고 fabric8-karaf-features 종속성을 추가합니다.
<dependency>
  <groupId>io.fabric8</groupId>
  <artifactId>fabric8-karaf-features</artifactId>
  <version>${fabric8.version}</version>
  <classifier>features</classifier>
  <type>xml</type>
</dependency>
Copy to Clipboard

fabric8 karaf 기능은 Karaf 서버에 설치됩니다.

10.4.2. Fabric8 Karaf Core Bundle Functionality 추가

bundle fabric8-karaf-core 는 블루프린트 및 ConfigAdmin 확장에서 사용하는 기능을 제공합니다.

프로세스

  1. 프로젝트의 pom.xml 을 열고 fabric8-karaf-corestartupFeatures 섹션에 추가합니다.

    <startupFeatures>
      ...
      <feature>fabric8-karaf-core</feature>
      ...
    </startupFeatures>
    Copy to Clipboard

    그러면 사용자 지정 Karaf 배포에 fabric8-karaf-core 기능이 추가됩니다.

10.4.3. Property Placeholder 서비스 옵션 설정

bundle fabric8-karaf-core 는 다음 인터페이스로 서비스 PlaceholderResolver 를 내보냅니다.

public interface PlaceholderResolver {
    /**
     * Resolve a placeholder using the strategy indicated by the prefix
     *
     * @param value the placeholder to resolve
     * @return the resolved value or null if not resolved
     */
    String resolve(String value);

    /**
     * Replaces all the occurrences of variables with their matching values from the resolver using the given source string as a template.
     *
     * @param source the string to replace in
     * @return the result of the replace operation
     */
    String replace(String value);

    /**
     * Replaces all the occurrences of variables within the given source builder with their matching values from the resolver.
     *
     * @param value the builder to replace in
     * @rerurn true if altered
     */
    boolean replaceIn(StringBuilder value);

    /**
     * Replaces all the occurrences of variables within the given dictionary
     *
     * @param dictionary the dictionary to replace in
     * @rerurn true if altered
     */
    boolean replaceAll(Dictionary<String, Object> dictionary);

    /**
     * Replaces all the occurrences of variables within the given dictionary
     *
     * @param dictionary the dictionary to replace in
     * @rerurn true if altered
     */
    boolean replaceAll(Map<String, Object> dictionary);
}
Copy to Clipboard

PlaceholderResolver 서비스는 다양한 속성 자리 표시자 확인 전략에 대해 수집기 역할을 합니다. 기본적으로 제공되는 해결 전략은 표 Resolution Strategies 에 나열되어 있습니다. 속성 자리 표시자 서비스 옵션을 설정하려면 시스템 속성 또는 환경 변수 또는 둘 다를 사용할 수 있습니다.

프로세스

  1. OpenShift의 ConfigMap에 액세스하려면 서비스 계정에 보기 권한이 필요합니다. 서비스 계정에 보기 권한을 추가합니다.

    oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
    Copy to Clipboard
  2. API를 통해 보안에 대한 액세스가 제한될 수 있으므로 Pod에 보안을 마운트합니다.
  3. Pod에서 볼륨 마운트로 사용 가능한 시크릿은 다음과 같이 시크릿이라는 디렉터리에 매핑됩니다.

    containers:
      -
       env:
       - name: FABRIC8_K8S_SECRETS_PATH
         value: /etc/secrets
         volumeMounts:
       - name: activemq-secret-volume
         mountPath: /etc/secrets/activemq
         readOnly: true
       - name: postgres-secret-volume
         mountPath: /etc/secrets/postgres
         readOnly: true
    
    volumes:
      - name: activemq-secret-volume
      secret:
      secretName: activemq
      - name: postgres-secret-volume
       secret:
      secretName: postgres
    Copy to Clipboard

10.4.4. 사용자 정의 자산 위치 확인 프로그램 추가

사용자 지정 암호화와 같은 특정 요구 사항을 지원하기 위해 사용자 지정 자리 표시자 확인자를 추가할 수 있습니다. 또한 PlaceholderResolver 서비스를 사용하여 블루프린트 및 ConfigAdmin에서 해결자를 사용할 수 있습니다.

프로세스

  1. pom.xml 프로젝트에 다음 mvn 종속성을 추가합니다.

    pom.xml

    ---
    <dependency>
      <groupId>io.fabric8</groupId>
      <artifactId>fabric8-karaf-core</artifactId>
    </dependency>
    ---
    Copy to Clipboard

  2. PropertiesFunction 인터페이스를 구현하고 SCR을 사용하여 OSGi 서비스로 등록합니다.

    import io.fabric8.karaf.core.properties.function.PropertiesFunction;
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.ConfigurationPolicy;
    import org.apache.felix.scr.annotations.Service;
    
    @Component(
        immediate = true,
        policy = ConfigurationPolicy.IGNORE,
        createPid = false
    )
    @Service(PropertiesFunction.class)
    public class MyPropertiesFunction implements PropertiesFunction {
        @Override
        public String getName() {
            return "myResolver";
        }
    
        @Override
        public String apply(String remainder) {
            // Parse and resolve remainder
            return remainder;
        }
    }
    Copy to Clipboard
  3. 다음과 같이 구성 관리에서 해결자를 참조할 수 있습니다.

    속성

    my.property = $[myResolver:value-to-resolve]
    Copy to Clipboard

10.4.5. 해결 전략 목록

PlaceholderResolver 서비스는 다양한 속성 자리 표시자 확인 전략에 대해 수집기 역할을 합니다. 기본적으로 제공되는 해결 전략은 표에 나열되어 있습니다.

  1. 해결 전략 목록

접두사

설명

env

env:JAVA_HOME

OS 환경 변수에서 속성을 조회합니다.

'sys

sys:java.version

Java JVM 시스템 속성에서 속성을 조회합니다.

'service

service:amq

서비스 이름 지정 규칙을 사용하여 OS 환경 변수에서 속성을 조회합니다.

service.host

service.host:amq

hostname 부분만 반환하는 서비스 이름 지정 규칙을 사용하여 OS 환경 변수에서 속성을 조회합니다.

service.port

service.port:amq

포트 부분만 반환하는 서비스 이름 지정 규칙을 사용하여 OS 환경 변수에서 속성을 조회합니다.

k8s:map

k8s:map:myMap/myKey

Kubernetes ConfigMap에서 속성 검색(API를 통해)

k8s:secret

k8s:secret:amq/password

Kubernetes Secrets에서 속성 검색(API 또는 볼륨 마운트를 통해)

10.4.6. Property Placeholder 서비스 옵션 목록

속성 자리 표시자 서비스는 다음 옵션을 지원합니다.

  1. 속성 자리 표시자 서비스 옵션 목록
이름기본설명

fabric8.placeholder.prefix

$[

자리 표시자의 접두사

fabric8.placeholder.suffix

]

자리 표시자의 접미사

fabric8.k8s.secrets.path

null

보안이 매핑되는 쉼표로 구분된 경로 목록

fabric8.k8s.secrets.api.enabled

false

API를 통해 시크릿 활성화/비활성화

10.5. Fabric8 Karaf Config 관리 지원 추가

10.5.1. Fabric8 Karaf Config 관리 지원 추가

사용자 지정 Karaf 배포에 Fabric8 Karaf Config 관리자 지원을 추가할 수 있습니다.

프로세스

  • 프로젝트의 pom.xml 을 열고 startupFeatures 섹션에 fabric8-karaf-cm 를 추가합니다.

    pom.xml

    <startupFeatures>
      ...
      <feature>fabric8-karaf-cm</feature>
      ...
    </startupFeatures>
    Copy to Clipboard

10.5.2. ConfigMap Cryostat 추가

fabric8-karaf-cm 는 Karaf의 ConfigAdminConfigMap 값을 삽입하는 ConfigAdmin 브리지를 제공합니다.

프로세스

  1. ConfigAdmin 브리지에서 추가하려면 ConfigMap에 karaf.pid 라는 레이블이 지정되어야 합니다. karaf.pid 값은 구성 요소의 pid에 해당합니다. 예를 들면 다음과 같습니다.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: myconfig
      labels:
        karaf.pid: com.mycompany.bundle
    data:
      example.property.1: my property one
      example.property.2: my property two
    Copy to Clipboard
  2. 구성을 정의하려면 단일 속성 이름을 사용할 수 있습니다. 개별 속성은 대부분의 경우 작동합니다. karaf/etc 의 pid 파일과 동일합니다. 예를 들면 다음과 같습니다.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: myconfig
      labels:
        karaf.pid: com.mycompany.bundle
    data:
      com.mycompany.bundle.cfg: |
        example.property.1: my property one
        example.property.2: my property two
    Copy to Clipboard

10.5.3. 구성 플러그인

fabric8-karaf-cm 는 구성 속성 자리 표시자를 확인하는 ConfigurationPlugin 을 제공합니다.

fabric8-karaf-cm 플러그인으로 속성 대체를 활성화하려면 Java 속성 fabric8.config.plugin.enabledtrue 로 설정해야 합니다. 예를 들어 Karaf 이미지의 JAVA_OPTIONS 환경 변수를 사용하여 이 속성을 설정할 수 있습니다.

JAVA_OPTIONS=-Dfabric8.config.plugin.enabled=true
Copy to Clipboard

10.5.4. 구성 속성 위치 소유자

구성 속성 자리 표시자의 예는 다음과 같습니다.

my.service.cfg

    amq.usr = $[k8s:secret:$[env:ACTIVEMQ_SERVICE_NAME]/username]
    amq.pwd = $[k8s:secret:$[env:ACTIVEMQ_SERVICE_NAME]/password]
    amq.url = tcp://$[env+service:ACTIVEMQ_SERVICE_NAME]
Copy to Clipboard

my-service.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
               xsi:schemaLocation="
                 http://www.osgi.org/xmlns/blueprint/v1.0.0
                 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
                 http://camel.apache.org/schema/blueprint
                 http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

      <cm:property-placeholder persistent-id="my.service" id="my.service" update-strategy="reload"/>

      <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
         <property name="userName"  value="${amq.usr}"/>
         <property name="password"  value="${amq.pwd}"/>
         <property name="brokerURL" value="${amq.url}"/>
      </bean>
    </blueprint>
Copy to Clipboard

10.5.5. Fabric8 Karaf Config 관리자 옵션

Fabric8 Karaf Config Admin은 다음 옵션을 지원합니다.

이름기본설명

fabric8.config.plugin.enabled

false

ConfigurationPlugin 활성화

fabric8.cm.bridge.enabled

true

ConfigAdmin 브리지 활성화

fabric8.config.watch

true

ConfigMap 변경 감시 활성화

fabric8.config.merge

false

ConfigAdmin에서 병합 ConfigMap 값 활성화

fabric8.config.meta

true

ConfigAdmin 브리지에서 ConfigMap 메타 삽입 활성화

fabric8.pid.label

karaf.pid

ConfigAdmin 브리지가 찾는 레이블을 정의합니다(즉, 선택해야 하는 ConfigMap에는 해당 레이블이 있어야 합니다. 해당 레이블의 값은 연결된 PID를 결정합니다.)

fabric8.pid.filters

ConfigMap을 선택하려면 ConfigAdmin 브릿지에 대한 추가 조건을 정의합니다. 지원되는 구문은 다음과 같습니다.

  • 서로 다른 라벨의 조건은 ""로 구분되며 서로 AND로 구분됩니다.
  • 레이블 내에서 ";"로 구분된 레이블에는 또는에서 서로 고려되는 라벨 값에 대한 조건이 있을 수 있습니다.

예를 들어 -Dfabric8.pid.filters=appNames=appNames=A;B,database.name=my.oracle.datasource 와 같은 필터가 "give me all ConfigMaps that have a label appName with values A 또는 B and a label database.name equals to my.oracle.datasource"로 변환됩니다.

중요

ConfigurationPlugin 에는 Aries 블루프린트 CM 1.0.9 이상이 필요합니다.

10.6. Fabric8 Karaf 블루프린트 지원 추가

fabric8-karaf-blueprintAries PropertyEvaluatorfabric8-karaf-core 의 속성 자리 표시자를 사용하여 블루프린트 XML 파일의 자리 표시자를 해결합니다.

프로세스

  • 사용자 정의 Karaf 배포에 블루프린트 지원 기능을 포함하려면 프로젝트 pom.xmlstartupFeatures 섹션에 fabric8-karaf-blueprint 를 추가합니다.

    <startupFeatures>
      ...
      <feature>fabric8-karaf-blueprint</feature>
      ...
    </startupFeatures>
    Copy to Clipboard

fabric8 평가기는 ${env+service:MY_ENV_VAR} 과 같은 체인 평가기를 지원합니다. 환경 변수에 대해 MY_ENV_VAR 변수를 확인해야 합니다. 그런 다음 service function을 사용하여 결과를 해결합니다. 예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"
           xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0
             https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint
             http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
             http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.3.0
             http://aries.apache.org/schemas/blueprint-ext/blueprint-ext-1.3.xsd">

  <ext:property-placeholder evaluator="fabric8" placeholder-prefix="$[" placeholder-suffix="]"/>

  <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
     <property name="userName"  value="$[k8s:secret:$[env:ACTIVEMQ_SERVICE_NAME]/username]"/>
     <property name="password"  value="$[k8s:secret:$[env:ACTIVEMQ_SERVICE_NAME]/password]"/>
     <property name="brokerURL" value="tcp://$[env+service:ACTIVEMQ_SERVICE_NAME]"/>
  </bean>
</blueprint>
Copy to Clipboard
중요

중첩된 속성 자리 표시자 대체에는 Aries Blueprint Core 1.7.0 이상이 필요합니다.

10.7. Fabric8 Karaf 상태 점검 활성화

fabric8-karaf-check 를 시작 기능으로 설치하는 것이 좋습니다. 활성화되면 Karaf 서버에서 준비 및 활성 프로브에 Kubernetes에서 사용할 수 있는 http://0.0.0.0:8181/readiness-checkhttp://0.0.0.0:8181/health-check URL을 노출할 수 있습니다.

참고

이러한 URL은 다음 사항이 사실인 경우에만 HTTP 200 상태 코드를 사용하여 응답합니다.

  • OSGi Framework가 시작되었습니다.
  • 모든 OSGi 번들이 시작됩니다.
  • 모든 부팅 기능이 설치됩니다.
  • 배포된 모든 Blue Cryostat 번들은 생성된 상태에 있습니다.
  • 배포된 모든 SCR 번들은 활성, 등록 또는 팩토리 상태에 있습니다.
  • 모든 웹 번들은 웹 서버에 배포됩니다.
  • 생성된 모든 Camel 컨텍스트는 started 상태에 있습니다.

프로세스

  1. 프로젝트의 pom.xml 을 열고 startupFeatures 섹션에 fabric8-karaf-checks 기능을 추가합니다.

    pom.xml

    <startupFeatures>
      ...
      <feature>fabric8-karaf-checks</feature>
      ...
    </startupFeatures>
    Copy to Clipboard

    fabric8-maven-plugin:resources 목표는 fabric8-karaf-checks 기능을 사용하는지 여부를 감지하고 컨테이너 구성에 준비 및 활성 프로브를 자동으로 추가합니다.

10.8. 사용자 정의 상태 점검 추가

추가 사용자 지정 heath 검사를 제공하여 Karaf 서버가 요청을 처리할 준비가 되기 전에 사용자 트래픽을 수신하지 못하도록 할 수 있습니다. 사용자 정의 상태 점검을 활성화하려면 io.fabric8.karaf.checks.HealthChecker 또는 io.fabric8.karaf.checks.ReadinessChecker 인터페이스를 구현하고 해당 오브젝트를 OSGi 레지스트리에 등록해야 합니다.

프로세스

  • 다음 mvn 종속성을 프로젝트 pom.xml 파일에 추가합니다.

    pom.xml

    <dependency>
      <groupId>io.fabric8</groupId>
      <artifactId>fabric8-karaf-checks</artifactId>
    </dependency>
    Copy to Clipboard

    참고

    OSGi 레지스트리에서 오브젝트를 생성하고 등록하는 가장 간단한 방법은 SCR을 사용하는 것입니다.

다음과 같이 상태 점검을 수행하여 사용 가능한 디스크 공간이 있는지 확인하는 예는 다음과 같습니다.

import io.fabric8.karaf.checks.*;
import org.apache.felix.scr.annotations.*;
import org.apache.commons.io.FileSystemUtils;
import java.util.Collections;
import java.util.List;

@Component(
    name = "example.DiskChecker",
    immediate = true,
    enabled = true,
    policy = ConfigurationPolicy.IGNORE,
    createPid = false
)
@Service({HealthChecker.class, ReadinessChecker.class})
public class DiskChecker implements HealthChecker, ReadinessChecker {

    public List<Check> getFailingReadinessChecks() {
        // lets just use the same checks for both readiness and health
        return getFailingHeathChecks();
    }

    public List<Check> getFailingHealthChecks() {
        long free = FileSystemUtils.freeSpaceKb("/");
        if (free < 1024 * 500) {
            return Collections.singletonList(new Check("disk-space-low", "Only " + free + "kb of disk space left."));
        }
        return Collections.emptyList();
    }
}
Copy to Clipboard

11장. JBoss EAP 이미지용 애플리케이션 개발

JBoss EAP에서 Fuse 애플리케이션을 개발하기 위해 대체 방법은 S2I 소스 워크플로우를 사용하여 EAP와 함께 Red Hat Camel CDI용 OpenShift 프로젝트를 생성하는 것입니다.

사전 요구 사항

  • OpenShift가 올바르게 실행 중이고 Fuse 이미지 스트림이 이미 OpenShift에 설치되어 있는지 확인합니다. 관리자용 시작하기를 참조하십시오.
  • Maven 리포지토리가 fuse용으로 구성되었는지 확인합니다. Maven 리포지토리 구성을 참조하십시오.

11.1. S2I 소스 워크플로우를 사용하여 JBoss EAP 프로젝트 생성

JBoss EAP에서 Fuse 애플리케이션을 개발하기 위해 대체 방법은 S2I 소스 워크플로우를 사용하여 EAP와 함께 Red Hat Camel CDI용 OpenShift 프로젝트를 생성하는 것입니다.

프로세스

  1. 기본 서비스 계정에 view 역할을 추가하여 클러스터링을 활성화합니다. 그러면 사용자에게 기본 서비스 계정에 대한 보기 액세스 권한이 부여됩니다. 빌드, 배포 및 기타 Pod를 실행하려면 각 프로젝트에 서비스 계정이 필요합니다. 쉘 프롬프트에서 다음 oc 클라이언트 명령을 입력합니다.

    oc login -u developer -p developer
    oc policy add-role-to-user view -z default
    Copy to Clipboard
  2. 브라우저에서 OpenShift 콘솔(https://OPENSHIFT_IP_ADDR:8443, OPENSHIFT_IP_ADDR 을 CDK의 경우 표시되는 IP 주소로 교체)하고 인증 정보(예: 사용자 이름 developer 및 암호, developer)로 콘솔에 로그인합니다.
  3. 카탈로그 검색 필드에 EAP를 사용하여 Red Hat Fuse 7.4 Camel CDI를 검색 문자열로 입력하고 EAP 템플릿으로 Red Hat Fuse 7.4 Camel CDI 를 선택합니다.

    EAP 이미지 s2i 소스 01
  4. 템플릿 마법사의 정보 단계가 열립니다. 다음을 클릭합니다.
  5. 템플릿 마법사의 구성 단계가 열립니다. Add to Project (프로젝트에 추가) 드롭다운에서 My Project 를 선택합니다.

    참고

    또는 이 예제에 대한 새 프로젝트를 생성하려면 Add to Project (프로젝트에 추가) 드롭다운에서 Create Project 를 선택합니다. 그러면 새 프로젝트의 이름을 채울 프로젝트 이름 필드가 표시됩니다.

  6. 구성 단계에서 나머지 설정에 기본값을 허용할 수 있습니다. 생성을 클릭합니다.

    참고

    애플리케이션 코드를 수정하려면(현재 빠른 시작만 실행하는 대신) 원래 빠른 시작 Git 리포지토리를 분기하고 Git 리포지토리 URL 및 Git 참조 필드에 적절한 값을 작성해야 합니다.

  7. 템플릿 마법사의 결과 단계가 열립니다. 닫기를 클릭합니다.
  8. 오른쪽 내 프로젝트 창에서 내 프로젝트 를 클릭합니다. My Project 프로젝트의 개요 탭이 열리고 s2i-fuse74-eap-camel-cdi 애플리케이션이 표시됩니다.
  9. 다음과 같이 s2i-fuse74-eap-camel-cdi 배포 왼쪽에 있는 화살표를 클릭하여 이 배포의 세부 정보를 확장하고 확인합니다.

    eap image s2i source 02

  10. 이 보기에서 빌드 로그를 볼 수 있습니다. 어떤 이유로든 빌드가 실패하면 빌드 로그가 문제를 진단하는 데 도움이 될 수 있습니다.

    eap image s2i source 03

    참고

    원격 Maven 리포지토리에서 많은 종속 항목을 다운로드해야 하므로 빌드를 완료하는 데 몇 분이 걸릴 수 있습니다. 빌드 시간을 단축하려면 로컬 네트워크에 Nexus 서버를 배포하는 것이 좋습니다.

  11. 빌드가 완료되면 Pod 아이콘이 1 개의 Pod가 실행되는 파란색 원으로 표시됩니다.

    Link to the running application

  12. 애플리케이션을 열려면 http://s2i-fuse74-eap-camel-cdi-myproject.IP_ADDRESS.nip.io/ 양식이 있는 애플리케이션 세부 정보 위에 표시된 링크를 클릭합니다. 브라우저에 다음과 같은 메시지가 표시됩니다.

    Hello world from 172.17.0.3
    Copy to Clipboard

    URL에서 name 매개변수를 사용하여 이름을 지정할 수도 있습니다. 예를 들어 브라우저에 URL http://s2i-fuse74-eap-camel-cdi-myproject.IP_ADDRESS.nip.io/?name=jdoe 을 입력하면 응답이 표시됩니다.

    Hello jdoe from 172.17.0.3
    Copy to Clipboard
  13. 왼쪽 탐색 모음에서 개요 를 클릭하여 내 프로젝트 네임스페이스에 있는 애플리케이션의 개요로 돌아갑니다. 실행 중인 Pod를 종료하려면 Pod 아이콘 옆에 있는 아래쪽 화살표 get started s2i binary 05 를 클릭합니다. 스케일 다운 배포 s2i-fuse74-eap-camel-cdi-1? 라는 질문을하는 대화 상자에서 스케일 다운 을 클릭합니다.
  14. (선택 사항) CDK를 사용하는 경우 쉘 프롬프트로 돌아가서 다음 명령을 입력하여 가상 OpenShift 서버를 완전히 종료할 수 있습니다.

    minishift stop
    Copy to Clipboard

11.2. JBoss EAP 애플리케이션 구조

다음 위치에서 EAP 예제를 사용하여 Red Hat Fuse 7.4 Camel CDI의 소스 코드를 찾을 수 있습니다.

https://github.com/wildfly-extras/wildfly-camel-examples/tree/wildfly-camel-examples-5.2.0.fuse-720021/camel-cdi
Copy to Clipboard

EAP 애플리케이션에서 Camel의 디렉터리 구조는 다음과 같습니다.

  ├── pom.xml
  ├── README.md
  ├── configuration
  │   └── settings.xml
  └── src
      └── main
          ├── java
          │   └── org
          │       └── wildfly
          │           └── camel
          │               └── examples
          │                   └── cdi
          │                       └── camel
          │                           ├── MyRouteBuilder.java
          │                           ├── SimpleServlet.java
          │                           └── SomeBean.java
          └── webapp
              └── WEB-INF
                  └── beans.xml
Copy to Clipboard

다음 파일이 JBoss EAP 애플리케이션을 개발하는 데 중요한 위치:

pom.xml
추가 종속 항목을 포함합니다.

11.3. JBoss EAP 빠른 시작 템플릿

다음 S2I 템플릿은 JBoss EAP의 Fuse에 제공됩니다.

표 11.1. JBoss EAP S2I 템플릿
이름설명

JBoss Fuse 7.4 Camel A-MQ 및 EAP( Cryostat-camel-amq-template)

카l-activemq 구성 요소를 사용하여 OpenShift에서 실행되는 AMQ 메시지 브로커에 연결하는 방법을 보여줍니다. 브로커가 이미 배포되어 있다고 가정합니다.

Red Hat Fuse 7.4 Camel CDI with EAP ( Cryostat-camel-cdi-template)

camel-cdi 구성 요소를 사용하여 CDI 빈을 Camel 경로와 통합하는 방법을 보여줍니다.

Red Hat Fuse 7.4 CXF Cryostat-RS with EAP (#159-camel-cxf-jaxrs-template)

camel-cxf 구성 요소를 사용하여 Cryostat-RS REST 서비스를 생성하고 사용하는 방법을 보여줍니다.

Red Hat Fuse 7.4 CXF Cryostat-WS with EAP (camel-camel-cxf-jaxws-template)

camel-cxf 구성 요소를 사용하여 Cryostat-WS 웹 서비스를 생성하고 사용하는 방법을 보여줍니다.

Red Hat Fuse 7.4 Camel JPA + MySQL(Ephemeral)(EAP -camel-jpa-template포함)

Red Hat Fuse on EAP를 사용하여 Camel 애플리케이션을 MySQL 데이터베이스에 연결하고 REST API를 노출하는 방법을 보여줍니다. 이 예제에서는 두 개의 컨테이너, 즉 하나의 컨테이너를 MySQL 서버로 실행하는 컨테이너를 생성하고 다른 컨테이너는 데이터베이스의 클라이언트 역할을 하는 Camel 애플리케이션을 실행합니다.

12장. OpenShift에서 Fuse에서 영구 스토리지 사용

OpenShift 애플리케이션의 Fuse는 영구 파일 시스템이 없는 OpenShift 컨테이너를 기반으로 합니다. 애플리케이션을 시작할 때마다 변경 불가능한 Docker 형식의 이미지가 있는 새 컨테이너에서 시작됩니다. 따라서 컨테이너가 중지되면 파일 시스템의 저장된 데이터가 손실됩니다. 그러나 애플리케이션은 일부 상태를 영구 저장소에 데이터로 저장해야 하며, 애플리케이션이 공통 데이터 저장소에 대한 액세스를 공유하는 경우도 있습니다. OpenShift 플랫폼은 외부 저장소 프로비저닝을 영구 스토리지로 지원합니다.

12.1. 볼륨 및 볼륨 유형 정보

OpenShift를 사용하면 Pod 및 컨테이너가 여러 호스트 로컬 또는 네트워크 연결 스토리지 끝점에서 지원하는 파일 시스템으로 볼륨 을 마운트할 수 있습니다.

볼륨 유형은 다음과 같습니다.

  • emptyDir(빈 디렉터리): 기본 볼륨 유형입니다. 로컬 호스트에서 Pod가 생성될 때 할당되는 디렉터리입니다. 서버에서 복사되지 않으며 Pod를 삭제하면 디렉터리가 제거됩니다.
  • ConfigMap: 이름이 지정된 configmap의 키-값 쌍으로 채워진 콘텐츠가 있는 디렉터리입니다.
  • hostPath(호스트 디렉터리): 모든 호스트에 특정 경로가 있는 디렉터리이며 승격된 권한이 필요합니다.
  • 시크릿(마운트된 시크릿): 시크릿 볼륨은 이름이 지정된 시크릿을 제공된 디렉터리에 마운트합니다.
  • PersistentVolumeClaim 또는 pvc(영구 볼륨 클레임): 컨테이너의 볼륨 디렉터리를 이름으로 할당한 영구 볼륨 클레임에 연결합니다. 영구 볼륨 클레임은 스토리지 할당 요청입니다. 클레임이 바인딩되지 않으면 Pod가 시작되지 않습니다.

볼륨은 Pod 수준에서 구성되며 hostPath 를 사용하여 외부 스토리지에 직접 액세스할 수 있습니다. 따라서 여러 Pod의 공유 리소스에 대한 액세스를 hostPath 볼륨으로 관리하기가 더 어렵습니다.

12.2. PersistentVolumes 정보

persistentVolumes 를 사용하면 클러스터 관리자가 NFS, Ceph RBD, AWS EBS(Elastic Block Store) 등과 같은 다양한 유형의 네트워크 스토리지에서 지원하는 클러스터 전체 스토리지를 프로비저닝할 수 있습니다. persistentVolumes는 용량, 액세스 모드 및 재활용 정책도 지정합니다. 이를 통해 여러 프로젝트의 Pod가 기본 리소스의 특성을 고려하지 않고 영구 스토리지에 액세스할 수 있습니다.

다양한 유형의 PersistentVolume을 생성하려면 영구 스토리지 구성 을 참조하십시오.

12.3. 영구 볼륨 구성

구성 파일을 생성하여 영구 볼륨을 프로비저닝할 수 있습니다. 그러면 이 스토리지에 PersistentVolume 클레임을 생성하여 액세스할 수 있습니다.

프로세스

  1. 아래 샘플 구성을 사용하여 pv.yaml 이라는 구성 파일을 생성합니다. 그러면 호스트 시스템의 경로가 pv001이라는 PersistentVolume으로 프로비저닝됩니다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv0001
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 2Mi
      hostPath:
        path: /data/pv0001/
    Copy to Clipboard

    여기서 호스트 경로는 /data/pv0001 이며 스토리지 용량은 2MB로 제한됩니다. 예를 들어 OpenShift CDK를 사용하는 경우 OpenShift 클러스터를 호스팅하는 가상 시스템에서 /data/pv0001 디렉터리를 프로비저닝합니다.

  2. PersistentVolume 을 만듭니다.

    oc create -f pv.yaml
    Copy to Clipboard
  3. PersistentVolume 생성을 확인합니다. OpenShift 클러스터에 구성된 모든 PersistentVolume 이 나열됩니다.

    oc get pv
    Copy to Clipboard

12.4. PersistentVolumeClaims 생성

PersistentVolume 은 스토리지 끝점을 OpenShift 클러스터에서 이름이 지정된 엔터티로 노출합니다. 프로젝트에서 이 스토리지에 액세스하려면 PersistentVolume 에 액세스할 수 있는 PersistentVolumeClaims 를 생성해야 합니다. PersistentVolumeClaims 는 특정 액세스 모드가 있는 특정 용량의 스토리지에 대한 사용자 지정 클레임을 사용하여 각 프로젝트에 대해 생성됩니다.

프로세스

  • 아래 샘플 구성에서는 pv0001이라는 PersistentVolume 에 대해 읽기-write-once 액세스 권한이 있는 1MB의 스토리지에 대해 pvc0001이라는 클레임을 생성합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc0001
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Mi
    Copy to Clipboard

12.5. Pod에서 영구 볼륨 사용

Pod는 볼륨 마운트를 사용하여 파일 시스템 마운트 위치와 볼륨을 정의하여 참조 PersistentVolumeClaims 를 정의합니다.

프로세스

  1. 파일 시스템의 /usr/share/dataPersistentVolumeClaim pvc0001을 마운트하는 대로 샘플 컨테이너 구성을 생성합니다.

    spec:
      template:
        spec:
          containers:
            - volumeMounts:
              - name: vol0001
                mountPath: /usr/share/data
          volumes:
            - name: vol0001
              persistentVolumeClaim:
                claimName: pvc0001
    Copy to Clipboard

    애플리케이션에서 /usr/share/data 디렉터리에 작성한 모든 데이터는 이제 컨테이너를 다시 시작할 때마다 유지됩니다.

  2. OpenShift 애플리케이션의 Fuse의 src/main/main/fabric8/deployment.yml 파일에 이 구성을 추가하고 명령을 사용하여 OpenShift 리소스를 생성합니다.

    mvn fabric8:resource-apply
    Copy to Clipboard
  3. 생성된 DeploymentConfiguration 에 볼륨 마운트와 볼륨이 있는지 확인합니다.

    oc describe deploymentconfig <application-dc-name>
    Copy to Clipboard

    OpenShift 빠른 시작의 Fuse의 경우 < application-dc-name >을 Maven 프로젝트 이름(예: spring-boot-camel )으로 바꿉니다.

13장. OpenShift에서 Fuse 패치

Fuse on OpenShift 제품을 최신 패치 수준으로 가져오려면 다음 작업 중 하나 이상을 수행해야 할 수 있습니다.

OpenShift 이미지에서 Fuse 패치
OpenShift 서버의 OpenShift 이미지에서 Fuse를 업데이트하여 새 애플리케이션 빌드가 Fuse 기본 이미지의 패치된 버전을 기반으로 합니다.
BOM을 사용하여 애플리케이션 종속 패치
애플리케이션에서 Maven 아티팩트의 패치된 버전을 사용하도록 프로젝트 POM 파일의 종속 항목을 업데이트합니다.
OpenShift 템플릿에서 Fuse 패치
OpenShift 서버에서 Fuse를 사용하여 생성된 새 프로젝트에서 Maven 아티팩트의 패치된 버전을 사용하도록 OpenShift 서버의 OpenShift 템플릿에서 Fuse를 업데이트합니다.

13.1. BOMs 및 Maven 종속성에 대한 중요 참고 사항

OpenShift의 Fuse와 관련하여 애플리케이션은 Red Hat Maven 리포지토리에서 다운로드한 Maven 아티팩트를 사용하여 완전히 빌드됩니다. 따라서 애플리케이션 코드를 패치하려면 프로젝트의 POM 파일을 편집하여 OpenShift 패치 버전에서 적절한 Fuse를 사용하도록 Maven 종속 항목을 변경하는 것입니다.

프로젝트에서 동일한 패치 버전의 모든 종속성을 사용하도록 OpenShift에서 Fuse의 모든 Maven 종속 항목을 함께 업그레이드하는 것이 중요합니다. OpenShift 프로젝트의 Fuse는 함께 빌드 및 테스트된 신중하게 Maven 아티팩트 세트로 구성됩니다. OpenShift 패치 수준에서 다른 Fuse의 Maven 아티팩트를 혼합하여 일치시키려면 Red Hat에서 테스트 및 지원되지 않는 구성이 제공될 수 있습니다. 이 시나리오를 방지하는 가장 쉬운 방법은 Maven에서 OpenShift에서 지원하는 모든 Maven 아티팩트의 버전을 정의하는 Maven(Bay of materials) 파일을 사용하는 것입니다. BOM 파일의 버전을 업데이트하면 프로젝트의 POM에 있는 OpenShift Maven 아티팩트에서 모든 Fuse의 버전을 자동으로 업데이트합니다.

OpenShift Maven archetype 또는 OpenShift 템플릿의 Fuse에 의해 생성된 POM 파일에는 BOM 파일을 사용하고 특정 필수 플러그인의 버전을 정의하는 표준 레이아웃이 있습니다. 애플리케이션 종속성을 훨씬 쉽게 패치하고 업그레이드할 수 있으므로 자체 애플리케이션에서 이 표준 레이아웃을 유지하는 것이 좋습니다.

13.2. OpenShift 이미지에서 Fuse 패치 적용

OpenShift의 Fuse 이미지는 기본 Fuse 제품과 독립적으로 업데이트됩니다. OpenShift 이미지의 Fuse에 패치가 필요한 경우 업데이트된 이미지는 OpenShift 이미지 스트림의 표준 Fuse에서 사용할 수 있으며 업데이트된 이미지는 Red Hat 이미지 레지스트리 registry.redhat.io 에서 다운로드할 수 있습니다. OpenShift의 Fuse는 다음 이미지 스트림을 제공합니다(OpenShift 이미지 스트림 이름으로식별).

  • fuse7-java-openshift
  • fuse7-karaf-openshift
  • fuse7-eap-openshift
  • fuse7-console
  • apicurito-ui
  • fuse-apicurito-generator

프로세스

  1. OpenShift 이미지 스트림의 Fuse는 일반적으로 OpenShift 서버의 openshift 프로젝트에 설치됩니다. OpenShift에서 OpenShift 이미지의 Fuse의 상태를 확인하려면 관리자로 OpenShift에 로그인하고 다음 명령을 입력합니다.

    $ oc get is -n openshift
    NAME                             DOCKER REPO                                              TAGS                           UPDATED
    fuse7-console                    172.30.1.1:5000/openshift/fuse7-console                  1.0,1.1,1.2,1.3,1.4            About an hour ago
    fuse7-eap-openshift              172.30.1.1:5000/openshift/fuse7-eap-openshift            1.0,1.1,1.2,,1.3,1.4           About an hour ago
    fuse7-java-openshift             172.30.1.1:5000/openshift/fuse7-java-openshift           1.0,1.1,1.2,1.3,1.4            About an hour ago
    fuse7-karaf-openshift            172.30.1.1:5000/openshift/fuse7-karaf-openshift          1.0,1.1,1.2,1.3,1.4            About an hour ago...
    fuse-apicurito-generator         172.30.1.1:5000/openshift/fuse-apicurito-generator       1.2,1.3,1.4                    About an hour ago...
    apicurito-ui                     172.30.1.1:5000/openshift/apicurito-ui                   1.2,1.3,1.4                    About an hour ago...
    Copy to Clipboard
  2. 이제 각 이미지 스트림을 한 번에 하나씩 업데이트할 수 있습니다.

    oc import-image -n openshift fuse7-java-openshift:1.4
    oc import-image -n openshift fuse7-karaf-openshift:1.4
    oc import-image -n openshift fuse7-eap-openshift:1.4
    oc import-image -n openshift fuse7-console:1.4
    oc import-image -n openshift apicurito-ui:1.4
    oc import-image -n openshift fuse-apicurito-generator:1.4
    Copy to Clipboard
참고

이미지 스트림의 버전 태그는 1.4-<BUILDNUMBER> 형식으로 되어 있습니다. 태그를 1.4 로 지정하면 1.4 스트림에서 최신 빌드를 가져옵니다.

참고

OpenShift 이미지의 새 Fuse를 사용할 수 있게 될 때마다 다시 빌드가 자동으로 트리거되도록 Fuse 애플리케이션을 구성할 수도 있습니다. 자세한 내용은 OpenShift Container Platform 3.11 개발자 가이드_의 배포 트리거 설정 섹션을 참조하십시오.

13.3. OpenShift 템플릿에서 Fuse 패치 적용

새 템플릿 기반 프로젝트가 올바른 패치 종속성을 사용하여 빌드되도록 OpenShift 템플릿의 Fuse를 최신 패치 수준으로 업데이트해야 합니다.

프로세스

  1. OpenShift 템플릿에서 Fuse를 업데이트하려면 관리자 권한이 필요합니다. 다음과 같이 OpenShift 서버에 관리자로 로그인합니다.

    oc login URL -u ADMIN_USER -p ADMIN_PASS
    Copy to Clipboard

    여기서 URL 은 OpenShift 서버의 URL이고 ADMIN_USER,ADMIN_PASS 는 OpenShift 서버의 관리자 계정의 자격 증명입니다.

  2. OpenShift 템플릿에 패치된 Fuse를 설치합니다. 명령 프롬프트에서 다음 명령을 입력합니다.

    BASEURL=https://raw.githubusercontent.com/jboss-fuse/application-templates/application-templates-2.1.fuse-740025-redhat-00003
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/eap-camel-amq-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/eap-camel-cdi-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/eap-camel-cxf-jaxrs-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/eap-camel-cxf-jaxws-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/eap-camel-jpa-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/karaf-camel-amq-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/karaf-camel-log-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/karaf-camel-rest-sql-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/karaf-cxf-rest-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-amq-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-config-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-drools-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-infinispan-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-camel-xml-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-cxf-jaxrs-template.json
    oc replace --force -n openshift -f ${BASEURL}/quickstarts/spring-boot-cxf-jaxws-template.json
    Copy to Clipboard
    참고

    BASEURL 은 빠른 시작 템플릿을 저장하는 Git 리포지토리의 GA 분기를 가리키며 항상 HEAD 에 최신 템플릿이 있습니다. 따라서 이전 명령을 실행할 때마다 최신 버전의 템플릿을 가져옵니다.

13.4. BOM을 사용하여 애플리케이션 종속 패치

애플리케이션 pom.xml 파일이 새 스타일 BOM을 사용하도록 구성된 경우 이 섹션의 지침에 따라 Maven 종속성을 업그레이드합니다.

13.4.1. Spring Boot 애플리케이션에서 종속성 업데이트

다음 코드 조각은 OpenShift의 Fuse에서 Spring Boot 애플리케이션에 대한 POM 파일의 표준 레이아웃을 보여주고 몇 가지 중요한 속성 설정을 강조 표시합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <fuse.version>7.4.0.fuse-740036-redhat-00002</fuse.version>
    ...
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-springboot-bom</artifactId>
        <version>${fuse.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
  <build>
    ...
    <plugins>
      <!-- Core plugins -->
      ...
      <plugin>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        ...
        <version>${fuse.version}</version>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>openshift</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.jboss.redhat-fuse</groupId>
            <artifactId>fabric8-maven-plugin</artifactId>
            ...
            <version>${fuse.version}</version>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
Copy to Clipboard

애플리케이션의 패치 적용 또는 업그레이드와 관련하여 다음 버전 설정이 중요합니다.

Fuse.version
새 스타일 fuse-springboot-bom BOM의 버전과 fabric8-maven-plugin 플러그인 버전과 spring-boot-maven-plugin 플러그인을 정의합니다.

13.4.2. Karaf 애플리케이션의 종속성 업데이트

다음 코드 조각은 OpenShift의 Fuse에서 Karaf 애플리케이션에 대한 POM 파일의 표준 레이아웃을 보여주고 몇 가지 중요한 속성 설정을 강조 표시합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <fuse.version>7.4.0.fuse-740036-redhat-00002</fuse.version>
    ...
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-karaf-bom</artifactId>
        <version>${fuse.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${fuse.version}</version>
        ...
      </plugin>
      ...
      <plugin>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fabric8-maven-plugin</artifactId>
        <version>${fuse.version}</version>
        ...
      </plugin>
    </plugins>
  </build>

</project>
Copy to Clipboard

애플리케이션의 패치 적용 또는 업그레이드와 관련하여 다음 버전 설정이 중요합니다.

Fuse.version
새 스타일 fuse-karaf-bom BOM의 버전과 fabric8-maven-plugin 플러그인 버전과 karaf-maven-plugin 플러그인을 정의합니다.

13.4.3. JBoss EAP 애플리케이션의 종속성 업데이트

다음 코드 조각은 OpenShift의 JBoss EAP 애플리케이션에 대한 POM 파일의 표준 레이아웃을 보여주고 몇 가지 중요한 속성 설정을 강조 표시합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project ...>
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <fuse.version>7.4.0.fuse-740036-redhat-00002</fuse.version>
    ...
  </properties>

  <!-- Dependency Management -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-eap-bom</artifactId>
        <version>${fuse.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
</project>
Copy to Clipboard

애플리케이션의 패치 적용 또는 업그레이드와 관련하여 다음 버전 설정이 중요합니다.

Fuse.version
fuse-eap-bom BOM 파일의 버전을 정의합니다(이전 스타일 wildfly-camel-bom BOM 파일을 대체합니다). BOM 버전을 특정 패치 버전으로 업데이트하면 JBoss EAP Maven 종속 항목의 모든 Fuse도 효과적으로 업데이트할 수 있습니다.

13.5. 사용 가능한 BOM 버전

다음 표는 Red Hat Fuse의 다른 패치 릴리스에 해당하는 새로운 스타일 BOM 버전을 보여줍니다.

표 13.1. Red Hat Fuse 릴리스 및 Corresponding New-Style BOM 버전
Red Hat Fuse 릴리스org.jboss.redhat-fuse BOM 버전

Red Hat Fuse 7.0.0 GA

7.4.0.fuse-740036-redhat-00002

Red Hat Fuse 7.0.1 패치

7.0.1.fuse-000008-redhat-4

애플리케이션 POM을 특정 Red Hat Fuse 패치 릴리스로 업그레이드하려면 fuse.version 속성을 해당 BOM 버전으로 설정합니다.

부록 A. Spring Boot Maven 플러그인

A.1. Spring Boot Maven 플러그인 개요

이 부록은 Spring Boot Maven 플러그인을 설명합니다. Maven에서 Spring Boot 지원을 제공하며 실행 가능한 root 또는 war 아카이브를 패키징하고 애플리케이션을 인플레이스( in-place ) 실행할 수 있습니다.

A.2. 목표

Spring Boot 플러그인의 목표는 다음과 같습니다.

  1. Spring-boot:run 은 Spring Boot 애플리케이션을 실행합니다.
  2. spring-boot:repackage.jar.war 파일을 실행할 수 있도록 다시 패키징합니다.
  3. spring-boot:startspring-boot:stop 둘 다 Spring Boot 애플리케이션의 라이프사이클을 관리하는 데 사용됩니다.
  4. spring-boot:build-info 는 액추에이터가 사용할 수 있는 빌드 정보를 생성합니다.

A.3. 사용법

Spring Boot 플러그인을 사용하는 방법에 대한 일반적인 지침은 http://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html 에서 확인할 수 있습니다. 다음 예제에서는 Spring Boot에 spring-boot-maven-plugin 을 사용하는 방법을 보여줍니다.

참고

Spring Boot Maven 플러그인에 대한 자세한 내용은 http://docs.spring.io/spring-boot/docs/current/maven-plugin 링크를 참조하십시오.

A.3.1. Spring Boot 2용 Spring Boot Maven 플러그인

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.redhat.fuse</groupId>
  <artifactId>spring-boot-camel</artifactId>
  <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- configure the Fuse version you want to use here -->
        <fuse.bom.version>7.4.0.fuse-sb2-740019-redhat-00005</fuse.bom.version>

        <!-- maven plugin versions -->
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
    </properties>


    <build>
        <defaultGoal>spring-boot:run</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.jboss.redhat-fuse</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${fuse.bom.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>redhat-ga-repository</id>
            <url>https://maven.repository.redhat.com/ga</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>redhat-ea-repository</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>redhat-ga-repository</id>
            <url>https://maven.repository.redhat.com/ga</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>redhat-ea-repository</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
Copy to Clipboard

A.3.2. Spring Boot 1용 Spring Boot Maven 플러그인

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.redhat.fuse</groupId>
  <artifactId>spring-boot-camel</artifactId>
  <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- configure the Fuse version you want to use here -->
        <fuse.bom.version>7.4.0.fuse-740036-redhat-00002</fuse.bom.version>

        <!-- maven plugin versions -->
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
    </properties>


    <build>
        <defaultGoal>spring-boot:run</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.jboss.redhat-fuse</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${fuse.bom.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>redhat-ga-repository</id>
            <url>https://maven.repository.redhat.com/ga</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>redhat-ea-repository</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>redhat-ga-repository</id>
            <url>https://maven.repository.redhat.com/ga</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>redhat-ea-repository</id>
            <url>https://maven.repository.redhat.com/earlyaccess/all</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
Copy to Clipboard

부록 B. Karaf Maven 플러그인 사용

karaf-maven-plugin 을 사용하면 Karaf 컨테이너의 마이크로 서비스 스타일 패키지인 Karaf 서버 어셈블리를 만들 수 있습니다. 완료된 어셈블리에는 Karaf 설치의 필수 구성 요소( etc/, data/, lib 및 system 디렉터리 포함)의 모든 필수 구성 요소가 포함되어 있지만 애플리케이션을 실행하는 데 필요한 베어 메탈 구성 요소로 줄였습니다.

B.1. Maven 종속 항목

karaf-assembly 프로젝트의 Maven 종속 항목은 기능 리포지토리(classifier 기능) 또는 kar 아카이브입니다.

  • 기능 리포지토리는 maven structured system/internal 리포지토리에 설치됩니다.
  • Kar 아카이브는 서버 상단에 콘텐츠가 압축 해제되어 있으며 포함된 기능 리포지토리가 설치되어 있습니다.

B.1.1. Maven 종속성 범위

종속성의 Maven 범위는 기능 리포지토리가 기능 서비스 구성 파일 etc/org.apache.karaf.features.cfg ( featuresRepositories 속성 아래)에 나열되어 있는지 여부를 결정합니다. 이러한 범위는 다음과 같습니다.

  • compile(기본값): 리포지토리의 모든 기능(또는 kar 리포지토리의 경우)이 startup.properties 에 설치됩니다. 기능 리포지토리는 기능 서비스 구성 파일에 나열되지 않습니다.
  • runtime: karaf-maven-plugin 의 부팅 단계입니다.
  • 제공됨: karaf-maven-plugin 의 설치 단계로 제공됩니다.

B.2. Karaf Maven 플러그인 구성

karaf-maven-plugin 은 Maven 범위와 관련된 세 단계를 정의합니다. 플러그인 구성은 설치된 기능 리포지토리의 기능을 참조하여 이러한 요소를 사용하여 설치되는 기능을 제어합니다.

  • 시작 단계: etc/startup.properties

    이 단계에서는 시작 기능, 시작 프로필 및 시작 번들이 etc/startup.properties 에 포함될 번들 목록을 준비하는 데 사용됩니다. 그러면 기능 번들이 적절한 시작 수준에서 etc/startup.properties 에 나열되고 번들이 시스템 내부 리포지토리로 복사됩니다. feature_name 또는 feature_name/feature_version 형식을 사용할 수 있습니다(예: < startupFeature>foo</startupFeature > ).

  • 부팅 단계: etc/org.apache.karaf.features.cfg

    이 단계에서는 featuresRepositories 속성의 featuresBoot 속성 및 리포지토리에서 사용할 수 있는 기능을 관리합니다. 그러면 기능 이름이 기능 서비스 구성 파일 및 시스템 내부 리포지토리에 복사된 기능의 모든 번들에 추가됩니다. feature_name 또는 feature_name/feature_version 형식을 사용할 수 있습니다(예: < bootFeature>bar</bootFeature > ).

  • 설치 단계:

    이 단계에서는 ${karaf.home}/${karaf.default.repository} 에 아티팩트를 설치합니다. 그러면 기능의 모든 번들이 시스템 내부 리포지토리에 설치됩니다. 따라서 런타임에 외부 리포지토리에 액세스하지 않고 기능을 설치할 수 있습니다. feature_name 또는 feature_name/feature_version 형식을 사용할 수 있습니다(예: < installedFeature>baz</installedFeature > ).

  • 라이브러리

    플러그인은 라이브러리 URL을 지정하는 라이브러리 하위 요소가 하나 이상 있을 수 있는 libraries 요소를 허용합니다.

    <libraries>
        <library>mvn:org.postgresql/postgresql/9.3-1102-jdbc41;type:=endorsed</library>
    </libraries>
    Copy to Clipboard

B.3. 사용자 정의 Karaf 어셈블리

Karaf 서버 어셈블리를 만드는 권장 방법은 karaf-maven-plugin 에서 제공하는 karaf:assembly 목표를 사용하는 것입니다. 이렇게 하면 프로젝트의 pom.xml 파일의 Maven 종속성에서 서버를 어셈블합니다. karaf-maven-plugin 구성에 지정된 번들(또는 기능)과 pom.xml 의 < dependencies > 섹션에 지정된 종속성은 사용자 지정된 karaf 어셈블리로 들어갈 수 있습니다.

  • kar의 경우

    kar 유형의 종속 항목은 시작(scope=compile), 부팅(scope=runtime) 또는 karaf-maven-plugin에 설치된 (scope=provided) kars로 추가됩니다. kars는 작업 디렉터리(target/assembly)에 압축되지 않으며 기능 XML은 추가 기능 리포지토리(지정된 kar 단계와 동일)로 검색하고 사용됩니다.

  • features.xml의 경우

    기능 분류자가 있는 종속 항목은 karaf-maven-plugin에 시작(scope=compile), 부팅(scope=runtime) 또는 설치(scope=provided) 리포지토리로 사용됩니다. kar에 있는 기능 리포지토리를 명시적으로 추가할 필요가 없습니다.

  • scap 및 bundle의 경우

    bundle 또는 piece 유형의 종속 항목은 시작(scope=compile), 부팅(scope=runtime) 또는 karaf-maven-plugin에 설치된 (scope=provided) 번들로 사용됩니다.

B.3.1. Karaf:assembly 목표

karaf-maven-plugin 에서 제공하는 karaf:assembly 목표를 사용하여 Karaf 서버 어셈블리를 만들 수 있습니다. 이 목표는 프로젝트 POM의 Maven 종속성에서 마이크로 서비스 스타일 서버 어셈블리를 어셈블합니다. OpenShift 프로젝트의 Fuse에서는 karaf:assembly 목표를 Maven 설치 단계에 바인딩하는 것이 좋습니다. 프로젝트는 번들 패키징을 사용하며 프로젝트 자체는 bootBundles 요소 내에 나열하여 Karaf 컨테이너에 설치됩니다.

참고

etc/startup.properties 로 들어갈 예정이므로 karaf 프레임워크 기능과 같은 필수 요소만 포함하면 이 단계에서 karaf 기능 서비스가 완전히 시작되지 않습니다. 부팅 단계를 수행하기 위해 다른 요소를 지연시킵니다.

다음 예제는 빠른 시작에 일반적인 Maven 구성을 표시합니다.

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>karaf-maven-plugin</artifactId>
  <version>${fuse.version}</version>
  <extensions>true</extensions>
  <executions>
    <execution>
      <id>karaf-assembly</id>
      <goals>
        <goal>assembly</goal>
      </goals>
      <phase>install</phase>
    </execution>
  </executions>
  <configuration>

    <karafVersion>{karafMavenPluginVersion}</karafVersion>
    <useReferenceUrls>true</useReferenceUrls>
    <archiveTarGz>false</archiveTarGz>
    <includeBuildOutputDirectory>false</includeBuildOutputDirectory>
    <startupFeatures>
      <feature>karaf-framework</feature>
            </startupFeatures>
            <bootFeatures>
      <feature>shell</feature>
      <feature>jaas</feature>
      <feature>aries-blueprint</feature>
      <feature>camel-blueprint</feature>
      <feature>fabric8-karaf-blueprint</feature>
      <feature>fabric8-karaf-checks</feature>
    </bootFeatures>
    <bootBundles>
      <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
    </bootBundles>
  </configuration>
</plugin>
Copy to Clipboard

부록 C. Fabric8 Maven 플러그인

C.1. 개요

fabric8-maven-plugin 의 도움을 받아 Java 애플리케이션을 OpenShift에 배포할 수 있습니다. Maven과의 긴밀한 통합을 제공하며 이미 제공된 빌드 구성의 이점을 제공합니다. 이 플러그인은 다음 작업에 중점을 둡니다.

  • Docker 형식의 이미지 빌드 및
  • OpenShift 리소스 설명자 생성

매우 유연하게 구성할 수 있으며 여러 구성 모델을 지원하여 다음을 생성할 수 있습니다.

  • 몇 가지 의견이 있는 기본값을 빠르게 조정할 수 있는 Zero-Config 설정입니다. 또는 고급 요구 사항의 경우,
  • pom.xml 파일에 추가할 수 있는 추가 구성 옵션을 제공하는 XML 구성입니다.

C.1.1. 이미지 빌드

fabric8:build 목표는 애플리케이션이 포함된 Docker 형식의 이미지를 생성하는 것입니다. 이러한 이미지에 빌드 아티팩트 및 해당 종속 항목을 쉽게 포함할 수 있습니다. 이 플러그인은 maven-assembly-plugin 의 어셈블리 설명자 형식을 사용하여 이미지에 추가할 콘텐츠를 지정합니다.

중요

OpenShift의 Fuse는 Docker 빌드 전략이 아닌 OpenShift s2i 빌드 전략 만 지원합니다.

C.1.2. Kubernetes 및 OpenShift 리소스

Kubernetes 및 OpenShift 리소스 설명자는 fabric8:resource 를 사용하여 생성할 수 있습니다. 이러한 파일은 Maven 아티팩트 내에 패키지화되며 fabric8:apply 를 사용하여 실행 중인 오케스트레이션 플랫폼에 배포할 수 있습니다.

C.1.3. 설정

구성 수준은 다음 네 가지입니다.

  • Zero-Config 모드는 pom.xml 파일에 있는 것, 사용할 기본 이미지 또는 노출할 포트를 기반으로 매우 유용한 결정을 내리는 데 도움이 됩니다. 작업을 시작하고 빠른 시작 애플리케이션을 작고 원활히 유지하는 데 사용됩니다.
  • XML 플러그인 구성 모드는 docker-maven-plugin이 제공하는 것과 유사합니다. IDE 지원을 통한 유형 안전 구성을 허용하지만 가능한 리소스 설명자 기능의 하위 집합만 제공됩니다.
  • Kubernetes 및 OpenShift 리소스 조각은 사용자가 제공하는 YAML 파일로, 플러그인에서 보강할 수 있습니다. 이를 통해 전문 사용자는 모든 기능과 함께 일반 구성 파일을 사용할 수 있지만 프로젝트별 빌드 정보를 추가하고 상용구 코드를 방지할 수 있습니다. *Docker Compose는 OpenShift 클러스터에서 docker 구성 파일을 가져오는 데 사용됩니다. 최소 OpenShift 배포 프로세스에 대한 지식이 필요하지 않습니다. 구성에 대한 자세한 내용은 https://maven.fabric8.io/#configuration 을 참조하십시오.

C.2. 플러그인 설치

Fabric8 Maven 플러그인은 Maven 중앙 리포지토리에서 사용할 수 있으며 아래에 표시된 대로 사전 및 사후 통합 단계에 연결할 수 있습니다.

<plugin>
  <groupId>org.jboss.redhat-fuse</groupId>
  <artifactId>fabric8-maven-plugin</artifactId>
  <version>${fuse.version}</version>

  <configuration>
     ....
     <images>
        <!-- A single's image configuration -->
        <image>
          ...
          <build>
           ....
          </build>
        </image>
        ....
     </images>
  </configuration>

  <!-- Connect fabric8:resource and fabric8:build to lifecycle phases -->
  <executions>
    <execution>
       <id>fabric8</id>
       <goals>
         <goal>resource</goal>
         <goal>build</goal>
       </goals>
    </execution>
  </executions>
</plugin>
Copy to Clipboard

C.3. 목표 이해

Fabric8 Maven 플러그인은 원활한 Java 개발자 환경을 제공하기 위한 다양한 목표를 지원합니다. 이러한 목표를 다음과 같이 분류할 수 있습니다.

  • 빌드 목표는 Docker 형식의 이미지 또는 S2I 빌드와 같은 Kubernetes 및 OpenShift 빌드 아티팩트를 생성하고 관리하는 데 사용됩니다.
  • 개발 목표는 리소스 설명자를 개발 클러스터에 배포하는 데 사용됩니다. 또한 개발 클러스터의 라이프사이클을 관리하는 데 도움이 됩니다.

C.3.1. 빌드 및 개발 목표 이해:

다음은 Red Hat Fabric Integration Services 제품의 Fabric8 Maven 플러그인에서 지원하는 목표입니다.

표 C.1. 목표 빌드
목표설명

fabric8:build

이미지 빌드. OpenShift의 Fuse는 Docker 빌드 전략이 아닌 OpenShift s2i 빌드 전략만 지원합니다.

fabric8:resource

Kubernetes 또는 OpenShift 리소스 설명자 생성

fabric8:apply

실행 중인 클러스터에 리소스 적용

fabric8:resource-apply

fabric8:resourcefabric8:apply실행

표 C.2. 개발 목표
목표설명

fabric8:run

전경에서 전체 개발 워크플로우 사이클 fabric8:resourcefabric8:buildfabric8:apply 를 실행합니다.

fabric8:deploy

리소스를 생성한 후 클러스터에 리소스 설명자를 배포하고 앱을 빌드합니다. 백그라운드에서 실행되는 경우를 제외하고 fabric8:run 과 동일합니다.

fabric8:undeploy

클러스터에서 리소스 설명자 배포를 취소하고 제거합니다.

fabric8:start

이전에 배포한 애플리케이션을 시작합니다.

fabric8:stop

이전에 배포한 애플리케이션을 중지합니다.

fabric8:log

실행 중인 애플리케이션의 로그를 표시

fabric8:debug

원격 디버깅 활성화

fabric8:watch

프로젝트 작업 영역에서 변경 사항을 모니터링하고 애플리케이션 재배포를 자동으로 트리거합니다.

C.3.2.

예를 들면 다음과 같습니다.

<configuration>
  <resources>
    <env>
        <JAVA_OPTIONS>-Dmy.custom=option</JAVA_OPTIONS>
        <MY_VAR>value</MY_VAR>
    </env>
  </resources>
</configuration>
Copy to Clipboard

C.3.3.

표 C.3.
설정설명기본

fabric8.skipResourceValidation

false

fabric8.failOnValidationError

false

fabric8.build.switchToDeployment

false

fabric8.openshift.trimImageInContainerSpec

false

C.4.

참고

C.4.1.

C.4.2.

<namespace>/<image-stream-name>:<tag>
Copy to Clipboard

docker

[<registry-location-url>/]<image-namespace>/<image-name>:<tag>
Copy to Clipboard

참고

C.4.2.1.

fuse7/fuse-eap-openshift:1.3
fuse7/fuse-java-openshift:1.3
fuse7/fuse-karaf-openshift:1.3
Copy to Clipboard
참고

C.4.2.2.

fuse7/fuse-eap-openshift:1.3
fuse7/fuse-java-openshift:1.3
fuse7/fuse-karaf-openshift:1.3
Copy to Clipboard
C.4.2.3.

<configuration>
  <generator>
    <config>
      <spring-boot>
        <fromMode>{istag|docker}</fromMode>
        <from>{image locations}</from>
      </spring-boot>
    </config>
  </generator>
</configuration>
Copy to Clipboard
C.4.2.4.

<configuration>
  <generator>
    <config>
      <karaf>
        <fromMode>{istag|docker}</fromMode>
        <from>{image locations}</from>
      </karaf>
    </config>
  </generator>
</configuration>
Copy to Clipboard
C.4.2.5.

//build from Docker-formatted image directly, registry location, image name or tag are subject to change if desirable
-Dfabric8.generator.fromMode=docker
-Dfabric8.generator.from=<custom-registry-location-url>/<image-namespace>/<image-name>:<tag>

//to use ImageStream from different namespace
-Dfabric8.generator.fromMode=istag //istag is default
-Dfabric8.generator.from=<namespace>/<image-stream-name>:<tag>
Copy to Clipboard

C.4.3.

표 C.4.
 설명기본

 

targetDir

jolokiaPort

8778

mainClass

 

webPort

8080

color

 

C.4.4.

표 C.5.
 설명기본

baseDir

jolokiaPort

8778

mainClass

 

user

webPort

8080

부록 D.

D.1.

D.2.

<plugin>
  <groupId>io.fabric8.forge</groupId>
  <artifactId>fabric8-camel-maven-plugin</artifactId>
  <version>2.3.90</version>
</plugin>
Copy to Clipboard

mvn fabric8-camel:validate
Copy to Clipboard

<plugin>
  <groupId>io.fabric8.forge</groupId>
  <artifactId>fabric8-camel-maven-plugin</artifactId>
  <version>2.3.80</version>
  <executions>
    <execution>
      <phase>process-classes</phase>
    <goals>
      <goal>validate</goal>
    </goals>
    </execution>
  </executions>
</plugin>
Copy to Clipboard

<plugin>
  <groupId>io.fabric8.forge</groupId>
  <artifactId>fabric8-camel-maven-plugin</artifactId>
  <version>2.3.80</version>
  <executions>
    <execution>
      <configuration>
        <includeTest>true</includeTest>
      </configuration>
      <phase>process-test-classes</phase>
      <goals>
        <goal>validate</goal>
      </goals>
    </execution>
  </executions>
</plugin>
Copy to Clipboard

D.3.

    $cd camel-example-cdi
    $mvn io.fabric8.forge:fabric8-camel-maven-plugin:2.3.80:validate
Copy to Clipboard

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 2.16.2
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- fabric8-camel-maven-plugin:2.3.80:validate (default-cli) @ camel-example-cdi ---
[INFO] Endpoint validation success: (4 = passed, 0 = invalid, 0 = incapable, 0 = unknown components)
[INFO] Simple validation success: (0 = passed, 0 = invalid)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Copy to Clipboard

  @Uri("timer:foo?period=5000")
Copy to Clipboard

  @Uri("timer:foo?perid=5000")
Copy to Clipboard

[INFO] ------------------------------------------------------------------------
[INFO] Building Camel :: Example :: CDI 2.16.2
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- fabric8-camel-maven-plugin:2.3.80:validate (default-cli) @ camel-example-cdi ---
[WARNING] Endpoint validation error at: org.apache.camel.example.cdi.MyRoutes(MyRoutes.java:32)

	timer:foo?perid=5000

	                   perid    Unknown option. Did you mean: [period]


[WARNING] Endpoint validation error: (3 = passed, 1 = invalid, 0 = incapable, 0 = unknown components)
[INFO] Simple validation success: (0 = passed, 0 = invalid)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Copy to Clipboard

D.4. 옵션

D.4.1.

매개변수기본값설명

downloadVersion

true

failOnError

false

logUnparseable

false

includeJava

true

includeXML

true

includeTest

false

includes

-

excludes

-

ignoreUnknownComponent

true

ignoreIncapable

true

ignoreLenientProperties

true

false

D.5.

    $cd myproject
    $mvn io.fabric8.forge:fabric8-camel-maven-plugin:2.3.80:validate -DincludeTest=true
Copy to Clipboard

부록 E.

E.1.

E.2.

s2i build <git repo url> registry.redhat.io/fuse7/fuse-karaf-openshift:1.3 <target image name>
docker run <target image name>
Copy to Clipboard

E.2.1.

E.2.2.

E.3.

E.3.1.

E.3.2.

E.3.3.

부록 F.

F.1. 개요

F.2.

F.3.

F.4.

  • JAVA_OPTIONS
  • JAVA_MAX_MEM_RATIO

예를 들면 다음과 같습니다.

spec:
  template:
    spec:
      containers:
        -
          resources:
            requests:
              cpu: "0.2"
               memory: 256Mi
            limits:
              cpu: "1.0"
               memory: 256Mi
          env:
          - name: JAVA_MAX_MEM_RATIO
            value: 60
Copy to Clipboard

F.5.

CONTAINER_CORE_LIMIT
CONTAINER_MAX_MEMORY

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat