OpenShift Container Platform에서 JBoss EAP 사용
OpenShift용 Red Hat JBoss Enterprise Application Platform 개발 가이드
초록
JBoss EAP 문서에 대한 피드백 제공
오류를 보고하거나 문서를 개선하기 위해 Red Hat Jira 계정에 로그인하여 문제를 제출하십시오. Red Hat Jira 계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.
프로세스
- 티켓을 생성하려면 다음 링크를 클릭하십시오.
- 요약 에 문제에 대한 간략한 설명을 입력합니다.
- 설명에서 문제 또는 개선 사항에 대한 자세한 설명을 제공합니다. 문서에서 문제가 발생한 위치에 URL을 포함합니다.
- Submit 을 클릭하고 문제를 적절한 문서 팀으로 라우팅합니다.
보다 포괄적 수용을 위한 오픈 소스 용어 교체
Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.
1장. Red Hat JBoss Enterprise Application Platform
Red Hat JBoss EAP(JBoss Enterprise Application Platform 8.0)는 오픈 표준을 기반으로 구축된 미들웨어 플랫폼으로, Jakarta EE 10 사양을 준수합니다. 고가용성 클러스터링, 메시징 및 분산 캐싱과 같은 기능에 대해 사전 구성된 옵션을 제공합니다. 여기에는 필요한 경우에만 서비스를 활성화할 수 있는 모듈식 구조가 포함되어 시작 속도가 향상됩니다.
웹 기반 관리 콘솔 및 관리 CLI(명령줄 인터페이스)를 사용하면 작업을 스크립팅 및 자동화하고 XML 구성 파일을 편집하지 않아도 됩니다. 또한 JBoss EAP에는 안전하고 확장 가능한 Jakarta EE 애플리케이션을 개발, 배포 및 실행하는 데 사용할 수 있는 API 및 개발 프레임워크가 포함되어 있습니다. JBoss EAP 8.0은 Web Profile, Core Profile 및 Full Platform 사양에 대해 Jakarta EE 10 호환 구현입니다.
1.1. JBoss EAP는 OpenShift에서 어떻게 작동합니까?
Red Hat은 OpenShift에서 JBoss EAP로 애플리케이션 이미지를 빌드하고 실행하는 컨테이너 이미지를 제공합니다.
Red Hat은 더 이상 JBoss EAP가 포함된 이미지를 제공하지 않습니다.
1.2. 비교: OpenShift용 JBoss EAP 및 JBoss EAP
JBoss EAP 제품을 OpenShift용 JBoss EAP 이미지와 비교할 때 몇 가지 중요한 차이점이 있습니다. 다음 표에서는 OpenShift용 JBoss EAP의 현재 버전에서 포함되거나 지원되는 기능을 설명합니다.
표 1.1. OpenShift용 JBoss EAP와 JBoss EAP의 차이점
JBoss EAP 기능 | OpenShift용 JBoss EAP의 상태 | 설명 |
---|---|---|
JBoss EAP 관리 콘솔 | 포함되지 않음 | JBoss EAP 관리 콘솔은 OpenShift용 JBoss EAP 릴리스에 포함되어 있지 않습니다. |
JBoss EAP 관리 CLI | 권장되지 않음 | JBoss EAP 관리 CLI는 컨테이너화된 환경에서 실행되는 JBoss EAP와 함께 사용하지 않는 것이 좋습니다. 컨테이너를 다시 시작하면 실행 중인 컨테이너에서 관리 CLI를 사용하여 변경한 구성은 손실됩니다. 관리 CLI는 문제 해결을 위해 Pod 내에서 액세스할 수 있습니다. |
관리형 도메인 | 지원되지 않음 | JBoss EAP 관리형 도메인은 지원되지 않지만 애플리케이션의 생성 및 배포는 OpenShift의 컨테이너에서 관리됩니다. |
기본 루트 페이지 | 비활성화됨 |
기본 루트 페이지는 비활성화되어 있지만 자체 애플리케이션을 |
원격 메시징 | 지원됨 | Pod 간 및 원격 메시징을 위한 Red Hat AMQ가 지원됩니다. ActiveMQ Artemis는 JBoss EAP 인스턴스가 있는 단일 Pod 내에서의 메시징에만 지원되며 Red Hat AMQ가 없는 경우에만 활성화됩니다. |
트랜잭션 복구 | 지원됨 | EAP Operator는 OpenShift 4에서 테스트 및 지원되는 유일한 트랜잭션 복구 옵션입니다. EAP Operator를 사용하여 트랜잭션 복구에 대한 자세한 내용은 안전하지 않은 트랜잭션 복구를 위한 EAP Operator를 참조하십시오. |
1.3. 버전 호환성 및 지원
OpenShift용 JBoss EAP는 OpenJDK 17에 대한 이미지를 제공합니다.
S2I 빌더 이미지와 런타임 이미지 두 가지 변형을 사용할 수 있습니다. S2I 빌더 이미지에는 S2I 빌드 중에 전체 JBoss EAP 서버를 프로비저닝할 수 있는 모든 필수 툴이 포함되어 있습니다. 런타임 이미지에는 JBoss EAP를 실행하는 데 필요한 종속성이 포함되어 있지만 서버는 포함되어 있지 않습니다. 이 서버는 체인된 빌드 중에 런타임 이미지에 설치됩니다.
OpenShift용 JBoss EAP 8.0의 이미지에 다음 수정 사항이 적용되었습니다.
- S2I 빌더 이미지에는 설치된 JBoss EAP 서버가 포함되어 있지 않으며 S2I 빌드 중에 JBoss EAP 8.0 서버를 설치합니다.
-
S2I 빌드 중 애플리케이션
pom
파일에서 Cryostat-maven-plugin을 구성합니다. -
S2I 빌드 중에
GALLEON_PROVISION_FEATURE_PACKS
,GALLEON_PROVISION_LAYERS
, GALLEON_PROVISION_CHANNION_CHANNELS
환경 변수를 설정하여 기존 JBoss EAP 7.4 애플리케이션을 사용하십시오. S2I 빌드 중에 JBoss EAP 프로비저닝 서버에는 OpenShift용으로 사용자 지정된
standalone.xml
서버 구성 파일이 포함되어 있습니다.중요sever에는 JBoss EAP 7.4와 함께 사용된
standalone-openshift.xml
구성 파일이 아닌standalone.xml
구성 파일이 포함되어 있습니다.-
이미지 내에서
JBOSS_HOME
값은/opt/server
입니다.JBOSS_HOME
의 값은 JBoss EAP 7.4의/opt/eap
입니다. -
Jolokia 에이전트
는 더 이상 이미지에 존재하지 않습니다. -
Prometheus 에이전트
가 설치되지 않았습니다. -
Python 프로브
가 더 이상 존재하지 않습니다. -
SSO
어댑터는 더 이상 이미지에 존재하지 않습니다. -
ActiveMQ.rar
는 더 이상 존재하지 않습니다.
다음 검색 메커니즘 프로토콜은 더 이상 사용되지 않으며 다른 프로토콜로 교체됩니다.
-
openshift.DNS_PING
프로토콜은 더 이상 사용되지 않으며dns.DNS_PING
프로토콜로 교체됩니다.사용자 지정 standalone.xml
파일에서openshift.DNS_PING
프로토콜을 참조하는 경우 이 프로토콜을dns.DNS_PING
프로토콜로 교체합니다. -
openshift.KUBE_PING
검색 메커니즘 프로토콜은 더 이상 사용되지 않으며kubernetes.KUBE_PING
프로토콜로 교체됩니다.
1.3.1. OpenShift 4.x 지원
OpenShift 4.1의 변경 사항은 Jolokia에 대한 액세스에 영향을 미치며 OpenShift 4.x 웹 콘솔에서는 Open Java 콘솔을 더 이상 사용할 수 없습니다.
이전 OpenShift 릴리스에서 특정 kube-apiserver 프록시 요청이 인증되어 클러스터로 전달되었습니다. 이 동작은 이제 안전하지 않은 것으로 간주되므로 이러한 방식으로 Jolokia에 액세스하는 것은 더 이상 지원되지 않습니다.
OpenShift 콘솔의 코드베이스가 변경되었기 때문에 Open Java Console에 대한 링크를 더 이상 사용할 수 없습니다.
1.3.2. IBM Z 지원
libartemis-native
의 s390x 변형은 이미지에 포함되어 있지 않습니다. 따라서 AIO와 관련된 모든 설정은 고려하지 않습니다.
-
journal-type
:journal-type
을ASYNCIO
로 설정해도 적용되지 않습니다. 이 속성의 기본값은 런타임 시NIO
입니다. -
journal-max-io
: 이 속성은 적용되지 않습니다. -
journal-store-enable-async-io
: 이 속성은 적용되지 않습니다.
1.3.2.1. OpenShift의 JBoss EAP 7.4에서 JBoss EAP 8.0으로 업그레이드
OpenShift에서 JBoss EAP 7.4와 함께 설치된 standalone.xml
파일은 JBoss EAP 8.0 이상과 호환되지 않습니다. JBoss EAP 8.0 이상 OpenShift 컨테이너를 시작하기 전에 파일을 수정하고 standalone.xml
로 이름을 변경해야합니다.
1.3.3. 배포 옵션
OpenShift 사용자를 대신하여 복잡한 상태 저장 애플리케이션의 인스턴스를 생성, 구성 및 관리하기 위해 OpenShift API를 확장하는 JBoss EAP별 컨트롤러인 EAP Operator를 사용하여 OpenShift에 JBoss EAP Java 애플리케이션을 배포할 수 있습니다.
추가 리소스
- EAP Operator에 대한 자세한 내용은 OpenShift에서 애플리케이션 배포를 자동화하기 위한 EAP Operator를 참조하십시오.
2장. JBoss EAP 8.0의 패키지 네임스페이스 변경
이 섹션에서는 JBoss EAP 8.0의 패키지 네임스페이스 변경 사항에 대한 추가 정보를 제공합니다. JBoss EAP 8.0은 자카르타 EE 10 및 자카르타 EE 10 API의 기타 여러 구현을 완벽하게 지원합니다. Jakarta EE 10 for JBoss EAP 8.0에서 지원하는 중요한 변경 사항은 패키지 네임스페이스 변경입니다.
2.1. javax에서 jakarta 네임스페이스로 변경
자카르타 EE 8과 EE 10의 주요 차이점은 EE API Java 패키지 이름을 javax.*
에서 jakarta
*로 바꾸는 것입니다. 이는 Java EE가 Eclipse Foundation으로 이동하고 자카르타 EE 설정을 따릅니다.
이 네임스페이스 변경에 맞게 애플리케이션을 JBoss EAP 7에서 JBoss EAP 8로 마이그레이션하는 가장 큰 작업입니다. 애플리케이션을 자카르타 EE 10으로 마이그레이션하려면 다음 단계를 완료해야 합니다.
-
import 구문 또는 기타 소스 코드에서
javax
패키지에서jakarta
패키지로 EE API 클래스를 사용하는 것을 업데이트합니다. -
jakarta
로 시작하도록 EE 지정 시스템 속성 또는javax
로 시작하는 기타 구성 속성의 이름을 업데이트합니다. -
EE 인터페이스의 애플리케이션 제공 구현 또는
java.util.ServiceLoader
메커니즘을 사용하여 부트스트랩된 추상 클래스의 경우 구현 클래스를 META-INF/services/javax에서 META-INF/services/jakarta로 식별하는 리소스의 이름을 변경합니다.[rest_of_name]
은META-INF/services/jakarta.[rest_of_name]
로 변경합니다.
Red Hat Migration Toolkit은 애플리케이션 소스 코드에서 네임스페이스를 업데이트하는 데 도움이 될 수 있습니다. 자세한 내용은 How to use Red Hat Migration Toolkit for Auto-Migration of an Application to the Jakarta EE 10 Namespace. 소스 코드 마이그레이션이 옵션이 아닌 경우 Open Source Eclipse Transformer 프로젝트는 기존 Java 아카이브를 javax
네임스페이스에서 jakarta
네임스페이스로 변환하는 바이트 코드 변환 도구를 제공합니다.
이 변경 사항은 Java SE의 일부인 javax
패키지에는 영향을 미치지 않습니다.
추가 리소스
- 자세한 내용은 javax to jakarta Package Namespace Change 를 참조하십시오.
3장. OpenShift Container Platform에서 JBoss EAP 애플리케이션 빌드 및 실행
S2I(Source-to-Image) 프로세스를 따라 JBoss EAP for OpenShift 이미지에서 Java 애플리케이션을 빌드하고 실행할 수 있습니다.
3.1. 사전 요구 사항
- OpenShift 인스턴스가 설치되어 작동 중입니다.
3.2. OpenShift에서 애플리케이션 배포를 위한 준비
JBoss EAP 애플리케이션 개발자는 OpenShift에 애플리케이션을 배포할 수 있습니다. 다음 예에서, Kit sink
quickstart는 Jakarta Server Cryostat, Jakarta Contexts and dependency Cryostat, Jakarta Enterprise Cryostats, Jakarta Persistence 및 Jakarta Cryostat를 사용하는 Jakarta EE 웹 지원 데이터베이스 애플리케이션을 보여줍니다. 자세한 내용은 JBoss EAP 8.0 Kitsink
quickstart를 참조하십시오. 아래 절차에 따라 애플리케이션을 배포합니다.
프로세스
-
oc login
명령을 사용하여 OpenShift 인스턴스에 로그인합니다. OpenShift에서 프로젝트를 생성합니다.
다음 명령을 사용하여 프로젝트를 생성합니다. 프로젝트를 사용하면 다른 그룹과 별도로 콘텐츠를 구성하고 관리할 수 있습니다.
$ oc new-project <project_name>
예를 들어 Kit
sink quickstart
의 경우 다음 명령을 사용하여 Cryostat-demo
라는 프로젝트를 생성합니다.$ oc new-project eap-demo
선택 사항: 키 저장소와 시크릿을 생성합니다.
참고OpenShift 프로젝트에서 HTTPS 사용 기능을 사용하는 경우 키 저장소와 시크릿을 생성해야 합니다.
Java
keytool
명령을 사용하여 키 저장소를 생성합니다.주의다음 명령은 자체 서명된 인증서를 생성하지만 프로덕션 환경의 경우 SSL 암호화 연결(HTTPS)에 대해 확인된 CA(인증 기관)에서 고유한 SSL 인증서를 사용합니다.
$ keytool -genkey -keyalg RSA -alias <alias_name> -keystore <keystore_filename.jks> -validity 360 -keysize 2048
예를 들어, Kit
sink
빠른 시작의 경우 다음 명령을 사용하여 키 저장소를 생성합니다.$ keytool -genkey -keyalg RSA -alias eapdemo-selfsigned -keystore keystore.jks -validity 360 -keysize 2048
다음 명령을 사용하여 새 키 저장소에서 보안을 생성합니다.
$ oc create secret generic <secret_name> --from-file=<keystore_filename.jks>
예를 들어 Kit
sink 빠른
시작의 경우 다음 명령을 사용하여 시크릿을 생성합니다.$ oc create secret generic eap-app-secret --from-file=keystore.jks
3.3. OpenShift에서 S2I(Source-to-Image)를 사용하여 애플리케이션 이미지 빌드
S2I(Source-to-Image) 워크플로우에 따라 JBoss EAP 애플리케이션에 대한 재현 가능한 컨테이너 이미지를 빌드합니다. 생성된 컨테이너 이미지에는 애플리케이션 배포 및 즉시 실행 가능한 JBoss EAP 서버가 포함됩니다.
S2I 워크플로는 Git 리포지토리에서 소스 코드를 가져와 사용하려는 언어 및 프레임워크를 기반으로 하는 컨테이너에 삽입합니다. S2I 워크플로가 완료되면 src
코드가 컴파일되고 애플리케이션이 패키지화되고 JBoss EAP 서버에 배포됩니다.
자세한 내용은 JBoss EAP S2I에 대한 레거시 서버 프로비저닝 을 참조하십시오.
JBoss EAP에서는 자카르타 EE 10을 사용하여 애플리케이션을 개발하는 경우에만 S2I 이미지를 사용할 수 있습니다.
사전 요구 사항
- 유효한 Red Hat 고객 계정이 있습니다.
- 레지스트리 서비스 계정이 있어야 합니다. Red Hat 고객 포털의 지침에 따라 레지스트리 서비스 계정을 사용하여 인증 토큰을 생성합니다.
- Red Hat Ecosystem Catalog에서 이미지를 가져오는 데 사용할 수 있는 OpenShift 시크릿 YAML 파일을 다운로드했습니다. 자세한 내용은 OpenShift 시크릿 을 참조하십시오.
-
oc login
명령을 사용하여 OpenShift에 로그인했습니다. - Helm이 설치되어 있어야 합니다. 자세한 내용은 Helm 설치를 참조하십시오.
관리 CLI에 이 명령을 입력하여 JBoss EAP Helm 차트 리포지토리를 설치했습니다.
$ helm repo add jboss-eap https://jbossas.github.io/eap-charts/
프로세스
다음 YAML 콘텐츠를 사용하여
helm.yaml
이라는 파일을 생성합니다.build: uri: https://github.com/jboss-developer/jboss-eap-quickstarts.git ref: EAP_8.0.0.GA contextDir: helloworld deploy: replicas: 1
다음 명령을 사용하여 OpenShift에 JBoss EAP 애플리케이션을 배포합니다.
$ helm install helloworld -f helm.yaml jboss-eap/eap8
검증
curl
을 사용하여 애플리케이션에 액세스합니다.$ curl https://$(oc get route helloworld --template='{{ .spec.host }}')/HelloWorld
Hello World!
출력이 표시됩니다. 애플리케이션이 배포되었는지 확인합니다.
3.4. OpenShift에 타사 애플리케이션 배포
컴파일된 WAR 파일 또는 EAR 아카이브를 사용하여 OpenShift 배포를 위한 애플리케이션 이미지를 생성할 수 있습니다. Dockerfile을 사용하여 운영 체제, Java 및 JBoss EAP 구성 요소가 포함된 업데이트되고 포괄적인 런타임 스택과 함께 JBoss EAP 서버에 이러한 아카이브를 배포합니다.
Red Hat은 사전 구축된 JBoss EAP 서버 이미지를 제공하지 않습니다.
3.4.1. 기본 구성을 사용하여 JBoss EAP 서버 프로비저닝
빌더 이미지를 사용하여 OpenShift에 기본 구성으로 JBoss EAP 서버를 설치하고 구성할 수 있습니다. 원활한 배포를 위해 절차를 수행하여 서버를 프로비저닝하고 애플리케이션 파일을 전송하고 필요한 사용자 지정을 수행합니다.
사전 요구 사항
지원되는 Red Hat JBoss Enterprise Application Platform 컨테이너 이미지에 액세스할 수 있습니다. 예를 들면 다음과 같습니다.
-
registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8
-
registry.redhat.io/jboss-eap-8/eap8-openjdk17-runtime-openshift-rhel8
-
- podman이 시스템에 설치되어 있어야 합니다. 지원되는 RHEL에서 사용 가능한 최신 podman 버전을 사용합니다. 자세한 내용은 Red Hat JBoss Enterprise Application Platform 8.0 지원 구성을 참조하십시오.
프로세스
제공된 대로 다음 Dockerfile 콘텐츠를 복사합니다.
# Use EAP 8 Builder image to create a JBoss EAP 8 server # with its default configuration FROM registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest AS builder # Set up environment variables for provisioning. 1 ENV GALLEON_PROVISION_FEATURE_PACKS org.jboss.eap:wildfly-ee-galleon-pack,org.jboss.eap.cloud:eap-cloud-galleon-pack ENV GALLEON_PROVISION_LAYERS cloud-default-config # Specify the JBoss EAP version 2 ENV GALLEON_PROVISION_CHANNELS org.jboss.eap.channels:eap-8.0 # Run the assemble script to provision the server. RUN /usr/local/s2i/assemble # Copy the JBoss EAP 8 server from the builder image to the runtime image. FROM registry.redhat.io/jboss-eap-8/eap8-openjdk17-runtime-openshift-rhel8:latest AS runtime # Set appropriate ownership and permissions. COPY --from=builder --chown=jboss:root $JBOSS_HOME $JBOSS_HOME # Steps to add: # (1) COPY the WAR/EAR to $JBOSS_HOME/standalone/deployments # with the jboss:root user. For example: # COPY --chown=jboss:root my-app.war $JBOSS_HOME/standalone/deployments 3 # (2) (optional) server modification. You can modify EAP server configuration: # # * invoke management operations. For example # # RUN $JBOSS_HOME/bin/jboss-cli.sh --commands="embed-server,/system-property=Foo:add(value=Bar)" # # First operation must always be embed-server. # # * copy a modified standalone.xml in $JBOSS_HOME/standalone/configuration/ # for example # # COPY --chown=jboss:root standalone.xml $JBOSS_HOME/standalone/configuration # Ensure appropriate permissions for the copied files. RUN chmod -R ug+rwX $JBOSS_HOME
- 1
- 이미지 내에서 JBoss EAP Maven 플러그인에서 사용하는
MAVEN_MIRROR_URL
환경 변수를 지정할 수 있습니다. 자세한 내용은 Artifact 저장소 미러를 참조하십시오. - 2
- 마이너 릴리스에 대해 이 Dockerfile을 업데이트할 필요가 없습니다. 특정 버전을 사용하려면
GALLEON_PROVISION_CHANNELS
환경 변수에 JBoss EAP 버전을 지정합니다. 자세한 내용은 환경 변수를 참조하십시오. - 3
- 컨테이너에 WAR 파일을 포함하도록 복사한 Dockerfile을 수정합니다. 예를 들면 다음과 같습니다.
COPY --chown=jboss:root <my-app.war> $JBOSS_HOME/standalone/deployments
<myapp.war>를 이미지에 추가하려는 웹 아카이브 경로로 바꿉니다.
podman을 사용하여 애플리케이션 이미지를 빌드합니다.
$ podman build -t my-app .
명령이 실행되면
my-app
컨테이너 이미지를 OpenShift에 배포할 수 있습니다.다음 옵션 중 하나에 컨테이너 이미지를 업로드합니다.
- OpenShift에서 액세스할 수 있는 내부 레지스트리입니다.
- 빌드된 시스템에서 이미지를 직접 푸시하여 OpenShift 레지스트리입니다. 자세한 내용은 컨테이너 이미지를 Cryostat 4의 이미지 레지스트리로 내보내는 방법을 참조하십시오.
- 레지스트리에서 이미지를 배포할 때 Helm 차트, Operator 또는 Deployment와 같은 배포 전략을 사용합니다. 선호하는 방법을 선택하고 요구 사항에 따라 전체 이미지 URL 또는 ImageStream을 사용합니다. 자세한 내용은 OpenShift에서 JBoss EAP 애플리케이션을 빌드 및 배포하기 위해 Helm 차트 사용을 참조하십시오.
3.5. OpenID Connect를 사용하여 OpenShift에서 JBoss EAP 애플리케이션 보안
외부 OpenID 공급자를 사용하여 인증을 위임하려면 JBoss EAP 기본 OpenID Connect(OIDC) 클라이언트를 사용합니다. OIDC는 JBoss EAP와 같은 클라이언트가 OpenID 공급자가 수행한 인증을 기반으로 사용자 ID를 확인할 수 있는 ID 계층입니다.
elytron-oidc-client
하위 시스템 및 elytron-oidc-client
Galleon 계층은 JBoss EAP에서 기본 OIDC 클라이언트를 제공하여 OpenID 공급자와 연결합니다. JBoss EAP는 OpenID 공급자 구성에 따라 애플리케이션의 가상 보안 도메인을 자동으로 생성합니다.
elytron-oidc-client
하위 시스템을 다음과 같은 세 가지 방법으로 구성할 수 있습니다.
-
배포에
oidc.json
추가 -
CLI 스크립트를 실행하여
elytron-oidc-client
하위 시스템을 구성합니다. -
OpenShift에서 JBoss EAP 서버 시작 시
elytron-oidc-client
하위 시스템을 구성하는 환경 변수를 정의합니다.
다음 절차에서는 OIDC로 애플리케이션을 보호하기 위해 환경 변수를 사용하여 elytron-oidc-client
하위 시스템을 구성하는 방법을 설명합니다.
3.5.1. JBoss EAP의 OpenID Connect 구성
OpenID 공급자를 사용하여 애플리케이션을 보호하면 보안 도메인 리소스를 로컬로 구성할 필요가 없습니다. elytron-oidc-client
하위 시스템은 JBoss EAP에서 기본 OpenID Connect(OIDC) 클라이언트를 제공하여 OpenID 공급자와 연결합니다. JBoss EAP는 OpenID 공급자 구성에 따라 애플리케이션의 가상 보안 도메인을 자동으로 생성합니다.
Red Hat build of Keycloak과 함께 OIDC 클라이언트를 사용합니다. JSON 웹 토큰(JWT)인 액세스 토큰을 사용하도록 구성할 수 있고 RS256, RS384, ES256, ES384 또는 ES512 서명 알고리즘을 사용하도록 구성할 수 있는 경우 다른 OpenID 공급자를 사용할 수 있습니다.
OIDC 사용을 활성화하려면 elytron-oidc-client
하위 시스템 또는 애플리케이션 자체를 구성할 수 있습니다. JBoss EAP는 다음과 같이 OIDC 인증을 활성화합니다.
-
애플리케이션을 JBoss EAP에 배포할 때
elytron-oidc-client
하위 시스템은 배포를 검사하여 OIDC 인증 메커니즘이 필요한지 감지합니다. -
하위 시스템에서
elytron-oidc-client
하위 시스템 또는 애플리케이션 배포 설명자 중 하나에서 배포에 대한 OIDC 구성을 감지하면 JBoss EAP는 애플리케이션에 대한 OIDC 인증 메커니즘을 활성화합니다. -
하위 시스템이 두 위치에서 OIDC 구성을 감지하면
elytron-oidc-client
하위 시스템secure-deployment
속성의 구성이 애플리케이션 배포 설명자의 구성보다 우선합니다.
3.5.2. OpenID Connect로 보안된 애플리케이션 생성
웹 애플리케이션을 생성하려면 필수 종속성 및 디렉터리 구조가 포함된 Maven 프로젝트를 생성합니다. 로그인한 사용자의 주체 및 특성에서 얻은 사용자 이름을 반환하는 서블릿이 포함된 웹 애플리케이션을 생성합니다. 로그인한 사용자가 없는 경우 서블릿은 "NO AUTHENTICATED USER" 텍스트를 반환합니다.
사전 요구 사항
- Maven이 설치되어 있어야 합니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
프로세스
mvn
명령을 사용하여 Maven 프로젝트를 설정합니다. 명령은 프로젝트에 대한 디렉터리 구조와pom.xml
구성 파일을 생성합니다.구문
$ mvn archetype:generate \ -DgroupId=${group-to-which-your-application-belongs} \ -DartifactId=${name-of-your-application} \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
예제
$ mvn archetype:generate \ -DgroupId=com.example.app \ -DartifactId=simple-webapp-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
애플리케이션 루트 디렉터리로 이동합니다.
구문
$ cd <name-of-your-application>
예제
$ cd simple-webapp-example
생성된
pom.xml
파일의 내용을 다음 텍스트로 바꿉니다.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.app</groupId> <artifactId>simple-webapp-example</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>simple-webapp-example Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.maven.war.plugin>3.3.2</version.maven.war.plugin> <version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin> <version.server>8.0.0.GA-redhat-00009</version.server> <version.bom.ee>${version.server}</version.bom.ee> </properties> <repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.bom</groupId> <artifactId>jboss-eap-ee-with-tools</artifactId> <version>${version.bom.ee}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.wildfly.security</groupId> <artifactId>wildfly-elytron-auth-server</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>${version.maven.war.plugin}</version> </plugin> <plugin> <groupId>org.jboss.eap.plugins</groupId> <artifactId>eap-maven-plugin</artifactId> <version>${version.eap.plugin}</version> <configuration> <channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> </feature-packs> <layers> <layer>cloud-server</layer> <layer>elytron-oidc-client</layer> </layers> <galleon-options> <jboss-fork-embedded>true</jboss-fork-embedded> </galleon-options> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
참고-
<
version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin
>은 JBoss EAP Maven 플러그인의 예제 버전입니다. JBoss EAP Maven 플러그인 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/eap/plugins/eap-maven-plugin/.
-
<
Java 파일을 저장할 디렉터리를 만듭니다.
구문
$ mkdir -p src/main/java/<path_based_on_artifactID>
예제
$ mkdir -p src/main/java/com/example/app
새 디렉터리로 이동합니다.
구문
$ cd src/main/java/<path_based_on_artifactID>
예제
$ cd src/main/java/com/example/app
다음 콘텐츠를 사용하여
SecuredServlet.java
파일을 생성합니다.package com.example.app; import java.io.IOException; import java.io.PrintWriter; import java.security.Principal; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.wildfly.security.auth.server.SecurityDomain; import org.wildfly.security.auth.server.SecurityIdentity; import org.wildfly.security.authz.Attributes; import org.wildfly.security.authz.Attributes.Entry; /** * A simple secured HTTP servlet. It returns the user name and * attributes obtained from the logged-in user's Principal. If * there is no logged-in user, it returns the text * "NO AUTHENTICATED USER". */ @WebServlet("/secured") public class SecuredServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try (PrintWriter writer = resp.getWriter()) { Principal user = req.getUserPrincipal(); SecurityIdentity identity = SecurityDomain.getCurrent().getCurrentSecurityIdentity(); Attributes identityAttributes = identity.getAttributes(); Set <String> keys = identityAttributes.keySet(); String attributes = "<ul>"; for (String attr : keys) { attributes += "<li> " + attr + " : " + identityAttributes.get(attr).toString() + "</li>"; } attributes+="</ul>"; writer.println("<html>"); writer.println(" <head><title>Secured Servlet</title></head>"); writer.println(" <body>"); writer.println(" <h1>Secured Servlet</h1>"); writer.println(" <p>"); writer.print(" Current Principal '"); writer.print(user != null ? user.getName() : "NO AUTHENTICATED USER"); writer.print("'"); writer.print(user != null ? "\n" + attributes : ""); writer.println(" </p>"); writer.println(" </body>"); writer.println("</html>"); } } }
애플리케이션 리소스를 보호하도록 애플리케이션의
web.xml
을 구성합니다.예제
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="false"> <security-constraint> <web-resource-collection> <web-resource-name>secured</web-resource-name> <url-pattern>/secured</url-pattern> </web-resource-collection> <auth-constraint> <role-name>Users</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>OIDC</auth-method> </login-config> <security-role> <role-name>*</role-name> </security-role> </web-app>
이 예에서는
사용자가
역할이 있는 사용자만 애플리케이션에 액세스할 수 있습니다.
3.5.3. OpenShift에 애플리케이션 배포
JBoss EAP 애플리케이션 개발자는 OpenID Connect 하위 시스템을 사용하는 OpenShift에 애플리케이션을 배포하고 Red Hat build of Keycloak 서버와 통합할 수 있습니다. 아래 절차에 따라 애플리케이션을 배포합니다.
사전 요구 사항
다음 구성을 사용하여 OpenShift에서 Red Hat build of Keycloak 서버를 구성했습니다. 자세한 내용은 Red Hat build of Keycloak Operator 를 참조하십시오.
- Cryostat라는 영역을 생성합니다.
- demo 라는 사용자를 만듭니다.
- demo 라는 사용자의 암호를 설정합니다. 임시 를 OFF 로 전환하고 암호 설정을 클릭합니다. 확인 프롬프트에서 암호 설정을 클릭합니다.
- Users 라는 역할을 생성합니다.
- 사용자 demo 에 사용자 역할을 할당합니다.
- 클라이언트 역할 필드에서 JBoss EAP에 대해 구성한 realm-management 를 선택합니다.
- create-client 역할을 클라이언트 realm-management 에 할당합니다.
프로세스
- 애플리케이션 코드를 Git 리포지토리에 배포합니다.
OIDC 구성이 포함된 보안을 생성합니다.
다음 콘텐츠를 사용하여
oidc-secret.yaml
이라는 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: oidc-secret type: Opaque stringData: OIDC_PROVIDER_NAME: rh-sso OIDC_USER_NAME: demo OIDC_USER_PASSWORD: demo OIDC_SECURE_DEPLOYMENT_SECRET: mysecret
다음 명령을 사용하여 보안을 생성합니다.
$ oc apply -f oidc-secret.yaml
다음 콘텐츠를 사용하여
helm.yaml
이라는 파일을 생성합니다.build: uri: [URL TO YOUR GIT REPOSITORY] deploy: envFrom: - secretRef: name: oidc-secret
JBoss EAP Helm 차트를 사용하여 예제 애플리케이션을 배포합니다.
$ helm install eap-oidc-test-app -f helm.yaml jboss-eap/eap8
oidc-secret.yaml
파일에 환경 변수를 추가하여 OIDC 공급자 URL 및 애플리케이션 호스트 이름을 구성합니다.yaml stringData: ... OIDC_HOSTNAME_HTTPS: <host of the application> OIDC_PROVIDER_URL: https://<host of the SSO provider>/realms/JBossEAP
OIDC_HOSTNAME_HTTPS
의 값은 다음 출력에 해당합니다.echo $(oc get route eap-oidc-test-app --template='{{ .spec.host }}')
OIDC_PROVIDER_URL
값은 다음 출력에 해당합니다.echo https://$(oc get route sso --template='{{ .spec.host }}')/realms/JBossEAP
OIDC_HOSTNAME_HTTP(S)
가 설정되지 않은 경우 경로 검색 시도가 수행됩니다. 경로 검색을 활성화하려면 OpenShift 사용자가경로
리소스를 나열할 수 있어야 합니다. 예를 들어routeview
역할을 생성하고view
사용자와 연결하려면 다음oc
명령을 사용합니다.$ oc create role <role-name> --verb=list --resource=route $ oc adm policy add-role-to-user <role-name> <user-name> --role-namespace=<your namespace>
-
oc apply -f oidc-secret.yaml
을 사용하여 시크릿을 업데이트합니다. 애플리케이션을 다시 배포하여 OpenShift에서 새 환경 변수를 사용하는지 확인합니다.
$ oc rollout restart deploy eap-oidc-test-app
검증
브라우저에서
https://<eap-oidc-test-app route>/ 로
이동합니다.Red Hat build of Keycloak 로그인 페이지로 리디렉션됩니다.
- 보안 서블릿에 액세스합니다.
다음 인증 정보로 로그인합니다.
username: demo password: demo
보안 주체 ID가 포함된 페이지가 나타납니다.
3.5.4. 환경 변수 기반 구성
이러한 환경 변수를 사용하여 OpenShift 이미지에서 JBoss EAP OIDC 지원을 구성합니다.
표 3.1. 환경 변수
환경 변수 | 레거시 SSO 환경 변수 | 설명 | 필수 항목 | 기본값 |
---|---|---|---|---|
OIDC_PROVIDER_NAME |
없음. |
OIDC_PROVIDER_NAME 변수를 사용할 때 | 제공됨 | |
OIDC_PROVIDER_URL |
| 공급자의 URL입니다. | 제공됨 | |
OIDC_USER_NAME | SSO_USERNAME | 동적 클라이언트 등록에는 토큰을 받으려면 사용자 이름이 필요합니다. | 제공됨 | |
OIDC_USER_PASSWORD | SSO_PASSWORD | 동적 클라이언트 등록에는 토큰을 받으려면 사용자 암호가 필요합니다. | 제공됨 | |
OIDC_SECURE_DEPLOYMENT_SECRET | SSO_SECRET | secure-deployment 하위 시스템과 인증 서버 클라이언트 모두 알려져 있습니다. | 없음 | |
OIDC_SECURE_DEPLOYMENT_PRINCIPAL_ATTRIBUTE | SSO_PRINCIPAL_ATTRIBUTE | 보안 주체 이름 값을 구성합니다. | 없음 |
일반적인 값: preferred_username. |
OIDC_SECURE_DEPLOYMENT_ENABLE_CORS | SSO_ENABLE_CORS | Single Sign-On 애플리케이션에 대해 CORS를 활성화합니다. | 없음 |
기본값은 |
OIDC_SECURE_DEPLOYMENT_BEARER_ONLY | SSO_BEARER_ONLY | 전달자 토큰만 허용하고 로깅을 지원하지 않는 배포입니다. | 없음 |
기본값은 |
OIDC_PROVIDER_SSL_REQUIRED | NONE | 기본값은 private 및 local 주소와 같은 external이지만 https는 지원하지 않습니다. | 없음 | 외부 |
OIDC_PROVIDER_TRUSTSTORE | SSO_TRUSTSTORE |
realm | 없음 | |
OIDC_PROVIDER_TRUSTSTORE_DIR | SSO_TRUSTSTORE_DIR |
영역 | 없음 | |
OIDC_PROVIDER_TRUSTSTORE_PASSWORD | SSO_TRUSTSTORE_PASSWORD |
realm | 없음 | |
OIDC_PROVIDER_TRUSTSTORE_CERTIFICATE_ALIAS | SSO_TRUSTSTORE_CERTIFICATE_ALIAS |
realm | 없음 | |
OIDC_DISABLE_SSL_CERTIFICATE_VALIDATION | SSO_DISABLE_SSL_CERTIFICATE_VALIDATION | 클라이언트를 등록하기 위해 인증 서버와 상호 작용할 때 인증서 검증을 비활성화합니다. | 없음 | |
OIDC_HOSTNAME_HTTP | HOSTNAME_HTTP | 비보안 경로에 사용되는 호스트 이름입니다. | 없음 | 경로가 검색됩니다. |
OIDC_HOSTNAME_HTTPS | HOSTNAME_HTTPS | 보안 경로에 사용되는 호스트 이름입니다. | 없음 | 보안 경로가 검색됩니다. |
NONE | SSO_PUBLIC_KEY | Single Sign-On 영역의 공개 키입니다. 이 옵션은 사용되지 않으며 공개 키는 OIDC 하위 시스템에서 자동으로 검색됩니다. | 없음 | 설정되어 있으면 이 옵션이 무시되고 있다는 경고가 표시됩니다. |
3.6. SAML을 사용하여 애플리케이션 보안
SAML(Security Assertion Markup Language)은 두 당사자 간에 인증 및 권한 부여 정보를 교환할 수 있는 데이터 형식 및 프로토콜 역할을 합니다. 이러한 두 당사자는 일반적으로 ID 공급자와 서비스 공급자가 포함됩니다. 이 정보는 어설션이 포함된 SAML 토큰의 형태를 취합니다. ID 공급자는 이러한 SAML 토큰을 주체에 발행하여 이러한 주체가 서비스 공급자로 인증할 수 있도록 합니다. 주체는 SAML v2에서 브라우저 기반 Single Sign-On을 활성화하는 여러 서비스 공급자와 SAML 토큰을 재사용할 수 있습니다.
Keycloak SAML 어댑터 기능 팩에서 제공하는 Galleon 계층을 사용하여 웹 애플리케이션을 보호할 수 있습니다.
Keycloak SAML 어댑터 기능 팩에 대한 자세한 내용은 SAML을 사용하여 애플리케이션 보안을 위한 Keycloak SAML 어댑터 기능 팩을 참조하십시오.
3.6.1. SAML을 사용하여 애플리케이션 보안을 위한 Keycloak SAML 어댑터 기능 팩
Keycloak SAML 어댑터 Galleon 팩은 keycloak-saml
계층을 포함하는 Galleon 기능 팩입니다. 기능 팩에 keycloak-saml
계층을 사용하여 JBoss EAP에 필요한 모듈 및 구성을 설치합니다. SAML을 사용할 때 Red Hat build of Keycloak을 SSO(Single Sign-On) ID 공급자로 사용하려면 이러한 모듈과 구성이 필요합니다. S2I(Source-to-Image)에 keycloak-saml
SAML 어댑터 Galleon 계층을 사용하는 경우 Keycloak의 Red Hat 빌드와 같은 IDP(Identity Service Provider)로 자동 등록할 수 있는 SAML 클라이언트 기능을 선택적으로 사용할 수 있습니다.
3.6.2. OpenShift의 SAML 공급자로 Red Hat build of Keycloak 구성
Red Hat build of Keycloak은 SSO(Single Sign-On)로 웹 애플리케이션을 보호하기 위한 ID 및 액세스 관리 공급자입니다. OAuth 2.0 및 SAML에 대한 확장인 OpenID Connect를 지원합니다.
다음 절차에서는 SAML을 사용하여 애플리케이션을 보호하는 데 필요한 필수 단계를 간략하게 설명합니다. 자세한 내용은 Red Hat build of Keycloak 문서를 참조하십시오.
사전 요구 사항
- Red Hat build of Keycloak에 대한 관리자 액세스 권한이 있습니다.
- Red Hat build of Keycloak이 실행 중입니다. 자세한 내용은 Red Hat build of Keycloak Operator 를 참조하십시오.
-
oc
login 명령을 사용하여 OpenShift에 로그인했습니다.
프로세스
- Single Sign-On 영역, 사용자 및 역할을 생성합니다.
Java
keytool
명령을 사용하여 키 및 인증서를 생성합니다.keytool -genkeypair -alias saml-app -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -storepass password -dname "CN=saml-basic-auth,OU=EAP SAML Client,O=Red Hat EAP QE,L=MB,S=Milan,C=IT" -ext ku:c=dig,keyEncipherment -validity 365
키 저장소를 JKS(Java KeyStore) 형식으로 가져옵니다.
keytool -importkeystore -deststorepass password -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype PKCS12 -srcstorepass password
OpenShift에서 키 저장소에 대한 시크릿을 생성합니다.
$ oc create secret generic saml-app-secret --from-file=keystore.jks=./keystore.jks --type=opaque
이러한 단계는 자동 SAML 클라이언트 등록 기능을 사용하는 경우에만 필요합니다. JBoss EAP에서 새 SAML 클라이언트를 client-admin
사용자로 Red Hat 빌드에 등록할 때 JBoss EAP는 새 SAML 클라이언트의 인증서를 Red Hat build of Keycloak 클라이언트 구성에 저장해야 합니다. 이를 통해 JBoss EAP는 Red Hat build of Keycloak에 공개 인증서를 저장하는 동안 개인 키를 유지할 수 있으며, 이를 통해 Red Hat build of Keycloak과의 통신에 대해 인증된 클라이언트를 설정할 수 있습니다.
3.6.3. SAML으로 보안된 애플리케이션 생성
SAML(Security Assertion Markup Language)을 사용하여 웹 애플리케이션 보안을 강화할 수 있습니다. SAML은 효과적인 사용자 인증 및 권한 부여 기능을 제공하며 SSO(Single Sign-On) 기능과 함께 웹 애플리케이션 강화를 위한 신뢰할 수 있는 선택이 가능합니다.
사전 요구 사항
- Maven이 설치되어 있어야 합니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
프로세스
mvn
명령을 사용하여 Maven 프로젝트를 설정합니다. 이 명령은 프로젝트에 대한 디렉터리 구조와pom.xml
구성 파일을 둘 다 생성합니다.구문
$ mvn archetype:generate \ -DgroupId=${group-to-which-your-application-belongs} \ -DartifactId=${name-of-your-application} \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
예제
$ mvn archetype:generate \ -DgroupId=com.example.app \ -DartifactId=simple-webapp-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
애플리케이션 루트 디렉터리로 이동합니다.
구문
$ cd <name-of-your-application>
예제
$ cd simple-webapp-example
생성된
pom.xml
파일의 내용을 다음 텍스트로 바꿉니다.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.app</groupId> <artifactId>simple-webapp-example</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>simple-webapp-example Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.maven.war.plugin>3.3.2</version.maven.war.plugin> <version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin> <version.server>8.0.0.GA-redhat-00009</version.server> <version.bom.ee>${version.server}</version.bom.ee> </properties> <repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.bom</groupId> <artifactId>jboss-eap-ee-with-tools</artifactId> <version>${version.bom.ee}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.wildfly.security</groupId> <artifactId>wildfly-elytron-auth-server</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>${version.maven.war.plugin}</version> </plugin> <plugin> <groupId>org.jboss.eap.plugins</groupId> <artifactId>eap-maven-plugin</artifactId> <version>${version.eap.plugin}</version> <configuration> <channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> <feature-pack> <location>org.keycloak:keycloak-saml-adapter-galleon-pack</location> </feature-pack> </feature-packs> <layers> <layer>cloud-server</layer> <layer>keycloak-saml</layer> </layers> <galleon-options> <jboss-fork-embedded>true</jboss-fork-embedded> </galleon-options> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
참고-
<
version.eap.plugin>1.0.0.Final-redhat-00014</version.eap.plugin
>은 JBoss EAP Maven 플러그인의 예제 버전입니다. JBoss EAP Maven 플러그인 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/eap/plugins/eap-maven-plugin/.
-
<
Java 파일을 저장할 디렉터리를 만듭니다.
구문
$ mkdir -p src/main/java/<path_based_on_artifactID>
예제
$ mkdir -p src/main/java/com/example/app
새 디렉터리로 이동합니다.
구문
$ cd src/main/java/<path_based_on_artifactID>
예제
$ cd src/main/java/com/example/app
다음 설정이 포함된
SecuredServlet.java
파일을 생성합니다.package com.example.app; import java.io.IOException; import java.io.PrintWriter; import java.security.Principal; import java.util.Set; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.wildfly.security.auth.server.SecurityDomain; import org.wildfly.security.auth.server.SecurityIdentity; import org.wildfly.security.authz.Attributes; /** * A simple secured HTTP servlet. It returns the user name and * attributes obtained from the logged-in user's Principal. If * there is no logged-in user, it returns the text * "NO AUTHENTICATED USER". */ @WebServlet("/secured") public class SecuredServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try (PrintWriter writer = resp.getWriter()) { Principal user = req.getUserPrincipal(); SecurityIdentity identity = SecurityDomain.getCurrent().getCurrentSecurityIdentity(); Attributes identityAttributes = identity.getAttributes(); Set <String> keys = identityAttributes.keySet(); String attributes = "<ul>"; for (String attr : keys) { attributes += "<li> " + attr + " : " + identityAttributes.get(attr).toString() + "</li>"; } attributes+="</ul>"; writer.println("<html>"); writer.println(" <head><title>Secured Servlet</title></head>"); writer.println(" <body>"); writer.println(" <h1>Secured Servlet</h1>"); writer.println(" <p>"); writer.print(" Current Principal '"); writer.print(user != null ? user.getName() : "NO AUTHENTICATED USER"); writer.print("'"); writer.print(user != null ? "\n" + attributes : ""); writer.println(" </p>"); writer.println(" </body>"); writer.println("</html>"); } } }
web.xml
파일의 디렉터리 구조를 생성합니다.mkdir -p src/main/webapp/WEB-INF cd src/main/webapp/WEB-INF
애플리케이션 리소스를 보호하도록 애플리케이션의
web.xml
파일을 구성합니다.예제
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="false"> <security-constraint> <web-resource-collection> <web-resource-name>secured</web-resource-name> <url-pattern>/secured</url-pattern> </web-resource-collection> <auth-constraint> <role-name>user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>KEYCLOAK-SAML</auth-method> </login-config> <security-role> <role-name>user</role-name> </security-role> </web-app>
이 예에서는
사용자
역할이 있는 사용자만 애플리케이션에 액세스할 수 있습니다.
검증
애플리케이션을 생성한 후 원격 Git 리포지토리에 커밋합니다.
-
https://github.com/your-username/simple-webapp-example
과 같은 Git 리포지토리를 생성합니다. 원격 리포지토리 및 Git에 대한 자세한 내용은 Git 시작하기 - 원격 리포지토리 정보를 참조하십시오. 애플리케이션의 루트 폴더에서 다음 Git 명령을 실행합니다.
git init -b main git add pom.xml src git commit -m "First commit" git remote add origin git@github.com:your-username/simple-webapp-example.git git remote -v git push -u origin main
이러한 단계는 애플리케이션을 원격 리포지토리에 커밋하여 온라인으로 액세스할 수 있도록 합니다.
3.6.4. OpenShift에서 SAML 보안 애플리케이션 빌드 및 배포
JBoss EAP 및 SSO(Single Sign-On) Galleon 계층을 사용하여 OpenShift에서 SAML으로 보안된 애플리케이션을 빌드하고 배포할 수 있습니다.
사전 요구 사항
- Helm이 설치되어 있어야 합니다. 자세한 내용은 Helm 설치를 참조하십시오.
- SAML 애플리케이션 프로젝트를 생성하고 Git 리포지토리에서 액세스할 수 있도록 했습니다.
관리 CLI에 이 명령을 입력하여 JBoss EAP Helm 차트 리포지토리를 설치했습니다.
$ helm repo add jboss-eap https://jbossas.github.io/eap-charts/
프로세스
- 애플리케이션 코드를 Git 리포지토리에 배포합니다.
필요한 환경 변수가 포함된 OpenShift 시크릿을 생성합니다.
apiVersion: v1 kind: Secret metadata: name: saml-secret type: Opaque stringData: SSO_REALM: "saml-basic-auth" SSO_USERNAME: "client-admin" SSO_PASSWORD: "client-admin" SSO_SAML_CERTIFICATE_NAME: "saml-app" SSO_SAML_KEYSTORE: "keystore.jks" SSO_SAML_KEYSTORE_PASSWORD: "password" SSO_SAML_KEYSTORE_DIR: "/etc/sso-saml-secret-volume" SSO_SAML_LOGOUT_PAGE: "/simple-webapp-example" SSO_DISABLE_SSL_CERTIFICATE_VALIDATION: "true"
-
제공된 YAML 콘텐츠를
saml-secret.yaml
과 같은 파일에 저장합니다. 다음 명령을 사용하여 저장된 YAML 파일을 적용합니다.
oc apply -f saml-secret.yaml
다음 설정이 포함된
helm.yaml
파일을 생성합니다.build: uri: [WEB ADDRESS TO YOUR GIT REPOSITORY] deploy: volumes: - name: saml-keystore-volume secret: secretName: saml-app-secret volumeMounts: - name: saml-keystore-volume mountPath: /etc/sso-saml-secret-volume readOnly: true envFrom: - secretRef: name: saml-secret
참고http://www.redhat.com
과 같은 HTTP 형식으로 웹 주소를 지정합니다. maven 미러를 사용하는 경우 다음과 같이 웹 주소를 지정합니다.build: uri: [WEB ADDRESS TO YOUR GIT REPOSITORY] env: - name: "MAVEN_MIRROR_URL" value: "http://..."
JBoss EAP Helm 차트를 사용하여 예제 애플리케이션을 배포합니다.
$ helm install saml-app -f helm.yaml jboss-eap/eap8
saml-secret.yaml
파일에 환경 변수를 추가하여 Keycloak 서버 URL 및 애플리케이션 경로를 구성합니다.stringData: ... HOSTNAME_HTTPS: <saml-app application route> SSO_URL: https://<host of the Keycloak server>
<
;saml-app 애플리케이션 route
> 및 <host of the Keycloak server
>를 적절한 값으로 바꿉니다.HOSTNAME_HTTPS
의 값은 다음 출력에 해당합니다.echo $(oc get route saml-app --template='{{ .spec.host }}')
SSO_URL
의 값은 다음 출력에 해당합니다.echo https://$(oc get route sso --template='{{ .spec.host }}')
참고이 명령을 사용할 수 없는 경우
oc get routes
를 사용하여 사용 가능한 경로를 나열하고 Keycloak 인스턴스의 Red Hat 빌드 경로를 선택합니다.-
oc apply -f saml-secret.yaml
을 사용하여 시크릿을 업데이트합니다.
검증
애플리케이션을 다시 배포하여 OpenShift에서 새 환경 변수를 사용하는지 확인합니다.
$ oc rollout restart deploy saml-app
브라우저에서 애플리케이션 URL로 이동합니다. 예를 들어
https://<saml-app route>/simple-webapp-example
.Keycloak 로그인 페이지의 Red Hat 빌드로 리디렉션됩니다.
웹 주소를 가져오려면 다음 명령을 사용하여 보안 서블릿에 액세스합니다.
echo https://$(oc get route saml-app --template='{{ .spec.host }}')/simple-webapp-example/secured
다음 인증 정보로 로그인합니다.
username: demo password: demo
보안 주체 ID가 포함된 페이지가 표시됩니다.
이제 SAML을 사용하여 애플리케이션이 보호됩니다.
3.6.5. SSO 영역, 사용자 및 역할 생성
Red Hat build of Keycloak 환경에서 SSO(Single Sign-On) 영역을 구성하고, 사용자 역할을 정의하고, 액세스 제어를 관리할 수 있습니다. 이러한 작업을 통해 보안을 강화하고 사용자 액세스 관리를 단순화하여 인증 환경을 간소화할 수 있습니다. 이는 SSO 설정을 최적화하고 사용자 인증 프로세스를 개선하는 데 중요합니다.
사전 요구 사항
- Red Hat build of Keycloak에 대한 관리자 액세스 권한이 있습니다.
- Red Hat build of Keycloak이 실행 중입니다.
프로세스
-
URL을 사용하여 Keycloak 관리 콘솔의 Red Hat 빌드에 로그인합니다.
https://<SSO route>/
. Red Hat build of Keycloak에 영역을 만듭니다(예:
saml-basic-auth
). 나중에 이 영역을 사용하여 필요한 사용자, 역할 및 클라이언트를 생성할 수 있습니다.자세한 내용은 영역 생성을 참조하십시오.
saml-basic-auth
영역에 역할을 생성합니다. 예를 들어사용자
.자세한 내용은 영역 역할 생성을 참조하십시오.
사용자를 생성합니다. 예를 들면
데모
입니다.자세한 내용은 사용자 생성 을 참조하십시오.
사용자의 암호를 만듭니다. 예를 들면
데모
입니다.암호가 임시가 아닌지 확인합니다. 자세한 내용은 사용자의 암호 설정을 참조하십시오.
로그인 액세스를 위해
사용자
역할을데모
사용자에게 할당합니다.자세한 내용은 역할 매핑 할당을 참조하십시오.
사용자를 생성합니다. 예를 들어
client-admin
은 다음과 같습니다.JBoss EAP 서버가 시작될 때 Keycloak 서버에서 SAML 클라이언트를 생성하려면 추가 권한이 필요한
client-admin
사용자를 사용할 수 있습니다. 자세한 내용은 사용자 생성 을 참조하십시오.사용자의 암호를 만듭니다. 예를 들어
client-admin
은 다음과 같습니다.암호가 임시가 아닌지 확인합니다. 자세한 내용은 사용자의 암호 설정을 참조하십시오.
-
클라이언트 역할
드롭다운 목록에서realm-management
를 선택합니다. create-client
,manage-clients
,manage-realm
역할을client-admin
사용자에게 할당합니다.자세한 내용은 역할 매핑 할당을 참조하십시오.
3.6.6. SAML 하위 시스템 구성을 위한 환경 변수
다음 변수를 이해하고 사용하여 환경 내에서 Keycloak 서버 통합을 최적화할 수 있습니다. 이렇게 하면 애플리케이션에 대한 원활하고 안전한 Keycloak 설정을 수행할 수 있습니다.
표 3.2. 환경 변수
환경 변수 | 설명 | 필수 항목 |
---|---|---|
| 배포 이름에서 파생된 클라이언트 이름에 접두사로 사용됩니다. | 선택 사항 |
|
HTTP OpenShift 경로에 대한 사용자 정의 | 선택 사항 |
|
HTTPS OpenShift 경로에 대한 사용자 정의 | 선택 사항 |
|
Keycloak 서버 인증서의 검증을 활성화하거나 비활성화하려면 | 선택 사항 |
|
Keycloak 영역과 상호 작용하고 클라이언트를 생성하고 등록할 수 있는 권한이 있는 사용자의 암호입니다. 예를 들어 | True |
|
애플리케이션 클라이언트를 연결하는 SSO 영역입니다. 예를 들면 | 선택 사항 |
|
SAML 클라이언트 키 저장소의 개인 키 및 인증서의 별칭입니다. 예를 들면 | True |
|
키 저장소 파일의 이름입니다. 예를 들어 | True |
|
클라이언트 키 저장소가 포함된 디렉터리입니다. 예를 들면 | True |
|
키 저장소 암호입니다. 예: | True |
|
로그 아웃 페이지. 예를 들면 | True |
|
서명의 유효성을 검사하려면 | 선택 사항 |
|
undertow 및 Cryostat 하위 시스템을 보호하는 데 사용되는 보안 도메인의 이름입니다. | 선택 사항 |
| 서버 인증서가 포함된 truststore 파일 이름입니다. | 선택 사항 |
| 신뢰 저장소 내의 인증서 별칭입니다. | 선택 사항 |
| truststore가 포함된 디렉터리입니다. | 선택 사항 |
|
truststore 및 인증서의 암호입니다. 예를 들면 | 선택 사항 |
|
SSO 서버의 URL입니다. 예를 들어 < | True |
|
Keycloak 영역과 상호 작용하고 클라이언트를 생성하고 등록할 수 있는 권한이 있는 사용자의 사용자 이름입니다. 예를 들어 | True |
3.6.7. JBoss EAP 서버의 경로 검색
JBoss EAP 서버의 경로 검색 기능을 사용하여 서버의 성능을 최적화하고 지정된 네임스페이스에서 경로 구성을 간소화할 수 있습니다. 이 기능은 특히 HOSTNAME_HTTPS
변수가 지정되지 않은 경우 보다 원활한 운영 환경을 제공하기 위해 서버 효율성을 개선하는 데 중요합니다.
HOSTNAME_HTTPS
변수가 설정되지 않은 경우 JBoss EAP 서버는 경로 검색을 자동으로 시도합니다. 경로 검색을 활성화하려면 필요한 권한을 생성해야 합니다.
oc create role routeview --verb=list --resource=route -n YOUR_NAME_SPACE oc policy add-role-to-user routeview system:serviceaccount:YOUR_NAME_SPACE:default --role-namespace=YOUR_NAME_SPACE -n YOUR_NAME_SPACE
3.6.8. 추가 리소스
3.7. 추가 리소스
4장. Helm 차트를 사용하여 OpenShift에 JBoss EAP 애플리케이션을 빌드 및 배포
Helm은 OpenShift에서 JBoss EAP 애플리케이션을 빌드, 배포 및 유지 관리할 수 있는 오픈 소스 패키지 관리자입니다. JBoss EAP 8.0에서 Helm 차트는 OpenShift 템플릿을 대체합니다.
4.1. Helm 차트 사용 사례
JBoss EAP 8.0과 함께 Helm 차트를 사용하여 다음을 수행할 수 있습니다.
- OpenShift S2I(Source-to-Image)를 사용하여 Git 리포지토리에서 호스팅되는 Maven 프로젝트에서 애플리케이션을 빌드합니다.
- OpenShift 클러스터(TLS 구성, 공용 경로)를 사용하여 OpenShift에 애플리케이션 이미지를 배포하여 애플리케이션을 노출합니다.
- Helm 차트로 애플리케이션 이미지를 빌드하고 JBoss EAP Operator를 사용하여 이미지를 배포합니다.
- 다른 방법을 사용하여 JBoss EAP의 애플리케이션 이미지를 빌드하고 Helm 차트를 사용하여 애플리케이션 이미지를 배포합니다.
4.2. OpenShift에서 JBoss EAP에 대한 Helm 차트 사용자 정의
애플리케이션의 특정 설정이 포함된 YAML
파일을 수정하여 JBoss EAP 애플리케이션의 Helm 차트를 사용자 지정할 수 있습니다.
YAML
파일에는 다음 두 가지 주요 섹션이 있습니다.
-
빌드
구성입니다. -
배포
구성입니다.
YAML 보기를
통해 구성을 선택하면 OpenShift Development Console에서 직접 값 파일 파일을
편집하여 업데이트된 구성으로 Helm 릴리스를 업그레이드할 수 있습니다.
추가 리소스
4.3. S2I를 사용하여 JBoss EAP 프로비저닝
애플리케이션 pom.xml
에서 Cryostat-maven-plugin
을 사용하여 JBoss EAP 서버를 프로비저닝합니다.
build.s2i.featurePacks
,build.s2i.galleonLayers
및 build.s2i.channels
필드가 더 이상 사용되지 않습니다.
4.4. Helm 차트를 사용하여 JBoss EAP 애플리케이션 빌드 및 배포
빌드 및 배포
값을 구성하여 Helms 차트를 사용하여 JBoss EAP 애플리케이션을 빌드
할 수 있습니다. 빌드
구성에서 애플리케이션 코드를 호스팅하는 Git 리포지토리에 URL을 제공해야 합니다. 출력은 빌드된 애플리케이션 이미지가 포함된 ImageStreamTag
리소스입니다.
애플리케이션을 배포하려면 빌드된 애플리케이션 이미지가 포함된 ImageStreamTag
리소스를 제공해야 합니다. 출력은 OpenShift 내부 및 외부에서 애플리케이션에 액세스하는 데 사용할 수 있는 배포된 애플리케이션 및 기타 관련 리소스입니다.
사전 요구 사항
- OpenShift 개발 콘솔에 로그인했습니다.
- Git 리포지토리에서 호스팅되는 JBoss EAP 애플리케이션이 있습니다.
- 애플리케이션은 Maven 프로젝트입니다.
-
org.jboss.eap.plugins:eap-maven-plugin
을 사용하여 JBoss EAP 8.0 서버를 프로비저닝하도록 애플리케이션을 구성했습니다.
프로세스
소스 리포지토리에서 애플리케이션 이미지를 빌드합니다.
build: uri: <git repository URL of your application>
선택 사항:
빌드
섹션에 보안을 입력합니다.build: sourceSecret: <name of secret login to your Git repository>
검증
- 애플리케이션이 성공적으로 배포된 경우 OpenShift 개발 콘솔의 Helm 릴리스 옆에 배포된 배지가 표시되어야 합니다.
4.5. OpenShift 개발 콘솔을 사용하여 애플리케이션 이미지 빌드
OpenShift Development Console에서 빌드 섹션을 구성하여 Helm 차트를 사용하여 JBoss EAP 애플리케이션 이미지를 빌드
할 수 있습니다.
다른 메커니즘에 의해 애플리케이션 이미지를 빌드한 경우 build.enabled
필드를 false
로 설정하여 Helm 차트의 빌드 부분을 건너뛸 수 있습니다.
Git 리포지토리를 참조하는 Git URL을 사용하여 build.url
필드를 지정해야 합니다.
추가 리소스
4.6. 애플리케이션 이미지 배포
OpenShift 개발 콘솔에서 배포 설정을 구성하여 Helm 차트를 사용하여 JBoss EAP 애플리케이션을 배포할
수 있습니다.
다른 메커니즘을 사용하여 애플리케이션 이미지를 빌드한 경우 build.deploy
필드를 false
로 설정하여 Helm 차트의 배포 구성을 건너뛸 수 있습니다.
추가 리소스
4.6.1. Helm 차트의 영구 데이터 스토리지를 위한 OpenShift 볼륨
OpenShift 볼륨을 사용하면 컨테이너가 클라우드 스토리지, NFS(네트워크 파일 시스템) 또는 호스트 시스템을 비롯한 다양한 소스의 데이터를 저장하고 공유할 수 있습니다. OpenShift 패키지 관리자인 Helm 차트를 사용하여 일관되고 재현 가능한 방식으로 애플리케이션을 배포할 수 있습니다. Helm 차트에 볼륨 마운트를 추가하면 애플리케이션이 배포 간에 데이터를 유지할 수 있습니다.
4.6.2. Helm 차트를 사용하여 볼륨 마운트
다음 절차에서는 JBoss EAP 8.0에서 Helm 차트를 사용하여 시크릿
을 볼륨으로 마운트하는 방법을 설명합니다. 또한 이를 사용하여 ConfigMap
을 마운트할 수도 있습니다. 이 작업을 통해 애플리케이션은 데이터에 안전하게 액세스하고 사용할 수 있으므로 무단 액세스 또는 변조로부터 보호할 수 있습니다.
예를 들어 보안
을 볼륨으로 마운트하면 시크릿에 저장한 민감한 데이터는 보안이 마운트된 배포를 실행하는 POD에 파일로 표시됩니다.
사전 요구 사항
-
시크릿
을 생성했습니다. 예를 들어keystore.jks
와 같은 파일을 참조하는 Cryostat-app-secret
이라는 시크릿을 생성했습니다. -
컨테이너의 파일 시스템에서 시크릿을 마운트할 위치를 확인했습니다. 예를 들어
/etc/jgroups-encrypt-secre-secret-volume
디렉터리는keystore.jks
와 같은 시크릿 파일이 마운트된 위치입니다.
프로세스
deploy.volumes
필드에 볼륨을 지정하고 사용할 시크릿을 구성합니다.볼륨
이름과
시크릿의secretName
을 제공해야 합니다.volumes: - name: eap-jgroups-keystore-volume secret: secretName: eap-app-secret
배포 구성에서
deploy.volumeMounts
를 사용하여 파일 시스템에 볼륨을 마운트합니다.volumeMounts: - name: eap-jgroups-keystore-volume mountPath: /etc/jgroups-encrypt-secret-volume readOnly: true
Pod가 시작되면 컨테이너는 /etc/jgroups-encrypt-secret-volume/
파일을 마운트합니다.
keystore.jks
위치에 keystore.jks
추가 리소스
5장. 환경 변수 및 모델 표현식 확인
5.1. 사전 요구 사항
- 운영 체제에서 환경 변수를 구성하는 방법에 대한 몇 가지 기본 지식이 있습니다.
OpenShift Container Platform에서 환경 변수를 구성하려면 다음 사전 요구 사항을 충족해야 합니다.
- 이미 OpenShift를 설치하고 OpenShift CLI("oc")를 설정했습니다. oc에 대한 자세한 내용은 OpenShift CLI 시작하기를 참조하십시오.
- Helm 차트를 사용하여 OpenShift에 애플리케이션을 배포했습니다. Helm 차트에 대한 자세한 내용은 JBoss EAP의 Helm 차트를 참조하십시오.
5.2. 관리 모델 표현식을 해결하기 위한 환경 변수
관리 모델 표현식을 해결하고 OpenShift Container Platform에서 JBoss EAP 8.0 서버를 시작하려면 관리 CLI(명령줄 인터페이스)에 환경 변수를 추가하거나 Java 시스템 속성을 설정할 수 있습니다. 둘 다 사용하는 경우 JBoss EAP는 환경 변수가 아닌 Java 시스템 속성을 관찰하고 사용하여 관리 모델 표현식을 확인합니다.
시스템 속성 환경 변수 매핑
이 관리 표현식 ${my.example-expr}
이 있다고 가정합니다. JBoss EAP 서버가 문제를 해결하려고 하면 my.example-expr
라는 시스템 속성을 확인합니다.
- 서버가 이 속성을 찾으면 해당 값을 사용하여 표현식을 확인합니다.
- 이 속성을 찾을 수 없으면 서버가 계속 검색합니다.
다음으로 서버가 시스템 속성 my.example-expr
를 찾을 수 없다고 가정하면 my.example-expr
가 모든 대문자로 자동 변경되고 영숫자가 아닌 모든 문자(_): MY_EXAMPLE_EXPR
. 그런 다음 JBoss EAP는 해당 이름의 환경 변수를 확인합니다.
- 서버가 이 변수를 발견하면 해당 값을 사용하여 표현식을 확인합니다.
- 이 변수를 찾을 수 없으면 서버가 계속 검색합니다.
원래 표현식이 접두사 env.
로 시작하는 경우 JBoss EAP는 접두사를 제거하여 환경 변수를 확인한 다음 환경 변수 이름만 찾습니다. 예를 들어 env.example
표현식의 경우 JBoss EAP는 예제
환경 변수를 찾습니다.
이러한 검사 중 어느 것도 원래 표현식을 확인하기 위해 속성 또는 변수를 찾지 못하면 JBoss EAP는 표현식에 기본값이 있는지 여부를 찾습니다. 이 경우 이 기본값은 표현식을 확인합니다. 그렇지 않은 경우 JBoss EAP에서 표현식을 확인할 수 없습니다.
두 개의 서버 예
한 서버에서 JBoss EAP는 이 관리 리소스를 정의한다고 가정합니다. < socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"
> . 구성 파일을 편집하는 대신 다른 포트 오프셋으로 두 번째 서버를 실행하려면 다음 중 하나를 수행합니다.
-
두 번째 서버에서 .
/standalone.sh -D
Java 시스템 속성을 설정합니다.jboss.socket.binding.port-offset
=100 의 값을 확인하도록 jboss.socket.binding.port-offset -
두 번째 서버의 값을 확인하도록 JBOSS_SOCKET_PORT_OFFSET 환경 변수를 설정합니다.
JBOSS_SOCKET_BINDING_PORT_OFFSET
=100 ./standalone.sh
5.3. OpenShift Container Platform에서 환경 변수 구성
JBoss EAP 8.0을 사용하면 관리 모델 표현식을 해결하기 위해 환경 변수를 구성할 수 있습니다. 환경 변수를 사용하여 OpenShift에서 실행 중인 JBoss EAP 서버의 구성을 조정할 수도 있습니다.
Pod 템플릿을 사용하는 리소스에 환경 변수 및 옵션을 설정합니다.
$ oc set env <object-selection> KEY_1=VAL_1 ... KEY_N=VAL_N [<set-env-options>] [<common-options>]
옵션 | 설명 |
---|---|
| 환경 변수에 지정된 키-값 쌍을 설정합니다. |
| 기존 환경 변수 업데이트를 확인합니다. |
Pod 템플릿을 사용하는 Kubernetes 워크로드 리소스는 다음과 같습니다.
-
Deployment
-
ReplicaSet
-
StatefulSet
-
DaemonSet
-
작업
-
CronJob
환경 변수를 구성한 후 JBoss EAP 관리 콘솔은 관련 포드에 대한 세부 정보에 해당 변수를 표시해야 합니다.
5.4. 환경 변수를 사용하여 관리 속성 덮어쓰기
Java 시스템 속성 또는 환경 변수를 사용하여 표현식에 정의된 관리 특성을 확인할 수 있지만 표현식을 사용하지 않는 경우에도 다른 속성을 수정할 수도 있습니다.
JBoss EAP 서버 구성을 서버 환경에 보다 쉽게 조정하려면 환경 변수를 사용하여 구성 파일을 편집하지 않고도 관리 속성의 값을 재정의할 수 있습니다. JBoss EAP 버전 8.0부터 사용할 수 있는 이 기능은 다음과 같은 이유로 유용합니다.
- JBoss EAP는 가장 일반적인 관리 특성에 대해서만 표현식을 제공합니다. 이제 정의된 표현식이 없는 속성 값을 변경할 수 있습니다.
- 일부 관리 속성은 JBoss EAP 서버를 미리 알 수 없는 데이터베이스 또는 구성에 저장할 수 없는 값(예: 데이터베이스 자격 증명)과 같은 다른 서비스와 연결합니다. 환경 변수를 사용하면 JBoss EAP 서버가 실행되는 동안 이러한 속성의 구성을 지연할 수 있습니다.
이 기능은 JBoss EAP 버전 8.0 OpenShift 런타임 이미지부터 기본적으로 활성화됩니다. 다른 플랫폼에서 활성화하려면 WILDFLY_OVERRIDING_ENV_VARS
환경 변수를 임의의 값으로 설정해야 합니다(예: WILDFLY_OVERRIDING_ENV_VARS=1
).
유형이
LIST
,OBJECT
또는 PROPERTY
인 관리 속성을 재정의할 수 없습니다.
사전 요구 사항
- 이제 재정의할 관리 속성이 정의되어 있어야 합니다.
프로세스
환경 변수로 관리 특성을 재정의하려면 다음 단계를 완료합니다.
-
변경할 리소스 및 속성의 경로를 식별합니다. 예를 들어
/subsystem=undertow/server=default-server/http-listener=default
에 대해proxy-address-forwarding
속성의 값을true
로 설정합니다. 다음과 같이 리소스 주소와 관리 특성을 매핑하여 이 속성을 재정의하는 환경 변수의 이름을 생성합니다.
-
리소스 주소에서 첫 번째 슬래시(
)를/
subsystem=undertow/server=default-server/http-listener=default하위 시스템=undertow/server=default-server/http-listener=default
로 제거합니다. -
두 개의 밑줄(__)과 속성 이름을 추가합니다(예:
subsystem=undertow/server=default-listener=default__proxy-address-forwarding
). -
영숫자가 아닌 모든 문자를 밑줄(_)로 바꾸고
SUBSYSTEM_UNDERTOW_SERVER_DEFAULT_SERVER_HTTP_LISTENER_DEFAULT__PROXY_ADDRESS_FORWARDING
의 전체 코드 행을 삽입합니다.
-
리소스 주소에서 첫 번째 슬래시(
-
환경 값
SUBSYSTEM_UNDERTOW_SERVER_SERVER_HTTP_LISTENER_DEFAULT__PROXY_ADDRESS_FORWARDING=true
를 설정합니다.
이러한 값은 실제 구성 값으로 교체해야 하는 예입니다.
6장. Maven 플러그인을 사용하여 JBoss EAP 서버 프로비저닝
JBoss EAP Maven 플러그인을 사용하면 필요한 기능을 서버에 제공하는 Galleon 계층만 포함하여 요구 사항에 따라 서버를 구성할 수 있습니다.
6.1. JBoss EAP Maven 플러그인
JBoss EAP Maven 플러그인은 Galleon 트리밍 기능을 사용하여 서버의 크기와 메모리 공간을 줄입니다. JBoss EAP Maven 플러그인은 JBoss EAP CLI 스크립트 파일의 실행을 지원하여 서버 구성을 사용자 지정할 수 있습니다. CLI 스크립트에는 서버 구성을 위한 CLI 명령 목록이 포함되어 있습니다.
Index of /ga/org/jboss/eap/plugins/eap-maven-plugin 에서 사용할 수 있는 Maven 리포지토리에서 최신 Maven 플러그인 버전을 검색할 수 있습니다. Maven 프로젝트에서 pom.xml
파일에는 JBoss EAP Maven 플러그인의 구성이 포함되어 있습니다.
JBoss EAP Maven 플러그인은 서버를 프로비저닝하고 WAR와 같은 패키지 애플리케이션을 Maven 실행 중에 프로비저닝된 서버에 배포합니다. 애플리케이션이 배포되는 프로비저닝된 서버는 대상/서버
디렉터리에 있습니다. JBoss EAP Maven 플러그인에서는 다음과 같은 기능도 제공합니다.
대상/서버의 서버는
지원되지 않으며 디버깅 또는 개발 목적으로만 사용할 수 있습니다.
-
org.jboss.eap:wildfly-ee-galleon-pack
및org.jboss.eap.cloud:eap-cloud-galleon-pack
기능 팩
과 일부 계층을 사용하여 서버 구성 파일을 사용자 정의할 수 있습니다. - CLI 스크립트 명령을 서버에 적용합니다.
-
키 저장소
파일과 같은 서버 설치에 추가 파일을 추가할 수 있습니다.
6.2. Maven을 사용하여 자카르타 EE 10 애플리케이션 생성
액세스할 때 "Hello World!"를 출력하는 애플리케이션을 생성합니다.
사전 요구 사항
- JDK 17을 설치했습니다.
- Maven 3.6 이상을 설치했습니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
프로세스
Maven 프로젝트를 설정합니다.
$ mvn archetype:generate \ -DgroupId=GROUP_ID \ -DartifactId=ARTIFACT_ID \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false
여기서 GROUP_ID 는 프로젝트의
groupId
이고 ARTIFACT_ID 는 프로젝트의artifactId
입니다.jboss-eap-ee
BOM에서 Jakarta EE 아티팩트의 버전을 자동으로 관리하도록 Maven을 구성하려면pom.xml
파일의 <dependencyManagement
> 섹션에 BOM을 추가합니다. 예를 들면 다음과 같습니다.<dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.bom</groupId> <artifactId>jboss-eap-ee</artifactId> <version>8.0.0.GA-redhat-00009</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
참고-
<
version>A.B.C-redhat-XXXXX</version
> 여기서A.B.C
는 릴리스 번호이고XXXXX
는 JBoss EAP 인스턴스의 빌드 번호입니다. JBoss EAP 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. 모든 JBoss EAP 릴리스에서 릴리스 및 빌드 번호를 사용할 수 있습니다. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/bom/jboss-eap-ee/.
-
<
다음 예와 같이 BOM에서 관리하는 서블릿 API 아티팩트를 프로젝트
pom.xml
파일의 <dependencies
> 섹션에 추가합니다.<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> </dependency>
다음 내용으로 Java 파일
TestServlet.java
를 만들고 파일을APPLICATION_ROOT/src/main/java/com/example/simple/
디렉터리에 저장합니다.package com.example.simple; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(urlPatterns = "/hello") public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PrintWriter writer = resp.getWriter(); writer.println("Hello World!"); writer.close(); } }
이제 이 애플리케이션을 JBoss EAP에 배포하거나 이 애플리케이션을 업데이트하여 Maven 플러그인을 사용하여 사용자 지정 프로비저닝된 JBoss EAP 서버에 배포할 수 있습니다.
6.3. Maven 플러그인을 사용하여 JBoss EAP 서버 프로비저닝
애플리케이션의 pom.xml
을 업데이트하여 Maven 플러그인과 함께 패키지하고 사용자 지정 프로비저닝된 JBoss EAP 서버에 배포합니다. 그런 다음 OpenShift의 사용자 지정 프로비저닝 JBoss EAP 서버에서 실행되는 애플리케이션을 배포할 수 있습니다.
사전 요구 사항
- JBoss EAP Maven 플러그인 및 JBoss EAP Maven 아티팩트가 로컬 또는 원격 Maven 리포지토리에서 액세스할 수 있는지 확인합니다.
- JDK 17을 설치했습니다.
Maven이 설치되어 있어야 합니다. 자세한 내용은 Apache Maven 다운로드를 참조하십시오.
참고JDK 17 및 Maven 3.8.5 또는 이전 Maven 버전을 사용하는 경우 최신 Maven WAR 플러그인을 사용합니다.
- Jakarta EE 10 애플리케이션을 위한 Maven 프로젝트를 생성했습니다. 자세한 내용은 Maven을 사용하여 자카르타 EE 10 애플리케이션 생성을 참조하십시오.
프로세스
pom.xml
파일에 다음 콘텐츠를 추가하여 원격 리포지토리에서 JBoss EAP BOM 및 JBoss EAP Maven 플러그인을 검색하도록 Maven을 구성합니다.<repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories>
pom.xml
파일의 <build
> 요소에 다음 내용을 추가합니다. JBoss EAP Maven 플러그인의 최신 버전을 지정해야 합니다. 예를 들면 다음과 같습니다.<plugins> <plugin> <groupId>org.jboss.eap.plugins</groupId> <artifactId>eap-maven-plugin</artifactId> <version>1.0.0.Final-redhat-00014</version> 1 <configuration> <channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> 2 <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> 3 </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> 4 </feature-pack> </feature-packs> <layers> <layer>cloud-server</layer> 5 </layers> <runtime-name>ROOT.war</runtime-name> 6 </configuration> <executions> <execution> <goals> <goal>package</goal> 7 </goals> </execution> </executions> </plugin> </plugins>
- 1
<version>1.0.0.Final-redhat-00014</version
>은 JBoss EAP Maven 플러그인의 예제 버전입니다. JBoss EAP Maven 플러그인 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/eap/plugins/eap-maven-plugin/.- 2
- 이는 JBoss EAP 서버 아티팩트가 정의된 JBoss EAP 8.0 채널을 지정합니다.
- 3
- JBoss EAP 채널에서 이 기능 팩의 버전을 검색할 수 있습니다. Galleon
기능 팩에
는 트리밍 JBoss EAP서버 프로비저닝을 위한 클라우드
서버와 같은 Galleon 계층이 포함되어 있습니다. - 4
- 이 기능 팩은 클라우드의 서버 Galleon 계층을 조정합니다. 이 기능 팩을 사용하여 OpenShift용 애플리케이션을 빌드해야 합니다.
- 5
- 이 Galleon 계층은 클라우드에서 JBoss EAP 애플리케이션을 실행할 때 필요한 기능을 서버에 프로비저닝합니다.
- 6
- 이 구성 옵션을 사용하면 HTTP 루트 컨텍스트에 배포를 등록할 수 있습니다.
- 7
- 이 플러그인 목표를 사용하면 서버를 프로비저닝하고, 애플리케이션을 배포하며, 사용자 지정 구성된 CLI 스크립트를 적용하고, 사용자 지정 콘텐츠를 서버 설치에 복사할 수 있습니다.
애플리케이션을 패키징합니다.
$ mvn package
디렉터리
target/server
에는 디버깅 또는 개발 목적에 사용할 준비가 된 서버 및 애플리케이션이 포함되어 있습니다. JBoss EAP S2I 빌드 컨텍스트에서 JBoss EAP maven-plugin에서 프로비저닝한 서버는/opt/server
위치의 JBoss EAP 이미지에 설치됩니다. 자세한 내용은 OpenShift에서 S2I(Source-to-Image)를 사용하여 애플리케이션 이미지 빌드 를 참조하십시오.
디버깅이 활성화된 (-X
옵션)와 함께 mvn package
명령을 사용하는 경우 -Dorg.slf4j.simpleLogger.log.com.networknt.schema=off
를 포함하여 스키마 검증 중에 과도한 디버그 로깅을 방지합니다.
검증
-
프로비저닝된 하위 시스템 및 애플리케이션 배포가 포함된 생성된 서버 구성 파일
target/server/standalone/configuration/standalone.xml
을 확인할 수 있습니다.
배포가 포함된 JBoss EAP 서버가 프로비저닝되었습니다.
6.4. Galleon 프로비저닝 파일
프로비저닝 파일은 galleon
하위 디렉터리에 저장할 수 있는 이름이 provisioning.xml
인 XML 파일입니다. 이를 사용하는 것은 JBoss EAP Maven 플러그인에서 기능 팩 및 계층을 구성하는 대안입니다. provisioning.xml
파일을 구성하여 프로비저닝 프로세스를 미세 조정할 수 있습니다.
다음 코드는 cloud-server
계층을 기반으로 JBoss EAP 서버를 프로비저닝하는 데 사용할 수 있는 프로비저닝 파일 콘텐츠를 보여줍니다.
JBoss EAP 기능 팩에는 버전이 없으며 Maven 플러그인의 구성된 채널에서 버전이 검색됩니다.
<?xml version="1.0" ?> <installation xmlns="urn:jboss:galleon:provisioning:3.0"> <feature-pack location="org.jboss.eap:wildfly-ee-galleon-pack:">1 <default-configs inherit="false"/>2 <packages inherit="false"/>3 </feature-pack> <feature-pack location="org.jboss.eap.cloud:eap-cloud-galleon-pack: ">4 <default-configs inherit="false"/> <packages inherit="false"/> </feature-pack> <config model="standalone" name="standalone.xml">5 <layers> <include name="cloud-server"/> </layers> </config> <options>6 <option name="optional-packages" value="passive+"/> </options> </installation>
- 1
- 이 요소는 JBoss EAP 채널에서 검색된 JBoss EAP 기능 팩을 프로비저닝하도록 프로비저닝 프로세스에 지시합니다.
- 2
- 이 요소는 기본 구성을 제외하도록 프로비저닝 프로세스에 지시합니다. JBoss EAP 서버 설치에서
standalone.xml
및standalone-ha.xml
과 같은 기본 구성을 검색할 수 있습니다. JBoss EAP Maven 플러그인에서 JBoss EAP 서버를 프로비저닝하는 경우 구성된 Galleon 사용자를 기반으로 단일 서버 구성을 생성합니다. 옵션을false
로 설정하면 추가 서버 구성이 생성되지 않습니다.inherit=true
설정은default-configs
및패키지
둘 다에서 지원되지 않습니다. - 3
- 이 요소는 기본 패키지를 제외하도록 프로비저닝 프로세스에 지시합니다.
- 4
- 이 요소는 JBoss EAP 클라우드 기능 팩을 프로비저닝하도록 프로비저닝 프로세스에 지시합니다. 하위 요소는 프로세스에서 기본 구성 및 기본 패키지를 제외하도록 지시합니다.
- 5
- 이 요소는 사용자 정의 독립 실행형 구성을 생성하도록 프로비저닝 프로세스에 지시합니다. 이 구성에는 JBoss EAP 기능 팩에 정의된
클라우드 서버
기본 계층과 JBoss EAP 클라우드 기능 팩에 의해 OpenShift에 맞게 조정된 클라우드 서버 기본 계층이 포함됩니다. - 6
- 이 요소는 JBoss EAP 모듈 프로비저닝을 최적화하도록 프로비저닝 프로세스에 지시합니다.
6.5. Maven 플러그인 구성 속성
다음 구성 매개변수 목록을 설정하여 Cryostat -maven-plugin Maven 플러그인
을 구성할 수 있습니다.
표 6.1. Maven 플러그인 구성 속성
이름 | 유형 | 설명 |
---|---|---|
채널 | list | 채널 YAML 파일 참조 목록입니다. 채널 파일에는 JBoss EAP 서버 아티팩트의 버전이 포함되어 있습니다. 채널 YAML 파일을 식별하는 방법은 다음 두 가지가 있습니다.
<channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels>
<channels> <channel> <manifest> <url>file:///foo/my-manifest.yaml</url> </manifest> </channel> </channels> |
| list |
제외할 Galleon 계층 목록입니다. |
| list | 콘텐츠가 프로비저닝된 서버에 복사되는 디렉터리 목록입니다. 디렉터리의 절대 경로 또는 상대 경로를 사용할 수 있습니다. 상대 경로는 프로젝트 기본 디렉터리를 기준으로 해야 합니다. |
| list |
계층과 결합할 수 있는 설치 기능 팩 구성 목록입니다. |
| 문자열 |
배포할 애플리케이션의 파일 이름입니다. 기본값은 |
| map |
서버를 프로비저닝할 때 특정 Galleon 옵션을 설정할 수 있습니다. 동일한 Maven 세션에서 다수의 서버를 빌드하는 경우 <galleon-options> <jboss-fork-embedded>true</jboss-fork-embedded> </galleon-options> |
| list |
프로비저닝할 Galleon 계층 목록입니다. |
| 문자열 |
계층에서 생성된 구성 파일의 이름입니다. 기본값은 |
| boolean |
프로비저닝이 끝날 때 프로비저닝 시간을 기록할지 여부를 지정합니다. 기본값은 |
| 문자열 | 배포에 사용되는 이름입니다. |
| boolean |
플러그인이 아티팩트를 확인할 때 오프라인 모드를 사용할지 여부를 지정합니다. 오프라인 모드에서 플러그인은 아티팩트 확인을 위해 로컬 Maven 리포지토리를 사용합니다. 기본값은 |
| boolean |
|
| list | 실행할 CLI 스크립트 및 명령 목록입니다. 스크립트 파일이 절대적이지 않은 경우 프로젝트 기본 디렉터리를 기준으로 해야 합니다. 다음과 같은 방법으로 CLI 실행을 구성합니다. <packaging-scripts> <packaging-script> <scripts> <script>../scripts/script1.cli</script> </scripts> <commands> <command>/system-property=foo:add(value=bar)</command> </commands> <properties-files> <property-file>my-properties.properties</property-file> </properties-files> <java-opts> <java-opt>-Xmx256m</java-opt> </java-opts> <!-- Expressions resolved during server execution --> <resolve-expressions>false</resolve-expressions> </packaging-script> </packaging-scripts> |
| 문자열 |
서버를 프로비저닝할 디렉터리의 경로입니다. 이는 절대 경로이거나 |
| 파일 |
사용할 |
| boolean |
프로비저닝 상태를 |
| 문자열 |
배포의 runtime-name입니다. 기본값은 배포 파일 이름(예: |
| 문자열 |
배포 중에 사용할 서버 구성의 이름입니다. |
| boolean |
목표를 건너뛰려면 |
| 문자열 |
생성된 CLI 프로세스에 대해
|
6.6. JBoss EAP 8.0에서 Cryo stat-datasources-galleon-pack
에 대한 지원을 활성화하는 방법
Cryo stat-data-sources-galleon-pack
Galleon 기능 팩을 사용하면 데이터베이스에 연결할 수 있는 JBoss EAP 8.0 서버를 프로비저닝할 수 있습니다.
일부 데이터베이스는 지원되지 않습니다.
또한 이 기능 팩은 JBoss EAP 8.0 Galleon 기능 팩과 함께 프로비저닝할 수 있는 다양한 데이터베이스에 대한 JDBC 드라이버 및 데이터 소스를 제공합니다. 이 기능 팩에 정의된 Galleon 계층은 데코레이터 계층입니다. 즉, JBoss EAP 기본 계층 외에도 프로비저닝해야 합니다.
datasources-web-server
기본 계층은 기능 팩이 정의된 Galleon 계층을 프로비저닝할 때 사용할 최소 기본 계층입니다.
추가 리소스
6.7. 지원되는 드라이버 및 데이터 소스
Galleon 기능 팩이 지원하는 각 데이터베이스에 대해 서로에 따라 빌드되는 Galleon 계층을 제공합니다.
-
postgresql-driver
-
postgresql-datasource
-
mssqlserver-datasource
-
mssqlserver-driver
-
oracle-datasource
-
oracle-driver
표 6.2. 지원되는 드라이버 및 데이터 소스
레이어 | 설명 |
---|---|
| 이렇게 하면 드라이버의 JBoss EAP 모듈이 설치되고 서버 구성의 데이터 소스 하위 시스템에 드라이버 리소스를 추가합니다. |
|
이는 데이터 소스를 추가하기 위해 |
기능 팩에 특정 드라이버 버전이 포함되어 있지 않습니다. 서버를 프로비저닝하기 전에 드라이버 버전을 지정해야 합니다.
예제
POSTGRESQL_DRIVER_VERSION="42.2.19"
- 드라이버별 환경 변수는 특정 드라이버 설명서 내에 정의됩니다.
6.8. JBoss EAP Maven 플러그인을 사용하여 JDBC 드라이버 및 데이터 소스와 함께 서버 프로비저닝
Galleon 기능 팩을 사용하여 OpenShift에서 JBoss EAP 서버를 프로비저닝할 수 있습니다.
이 절차에서는 JBoss EAP 8.0용 OpenShift에서 JBoss EAP 서버를 프로비저닝하는 방법만 보여줍니다.
사전 요구 사항
- 이미 OpenShift를 설치하고 OpenShift CLI("oc")를 설정했습니다. 자세한 내용은 OpenShift CLI 시작하기를 참조하십시오.
- JBoss EAP maven 플러그인 사용 방법에 대한 기본 지식이 있습니다. 자세한 내용은 JBoss EAP Maven 플러그인을 참조하십시오.
프로세스
데이터 소스 기능 팩의 Maven 좌표(GroupId 및 artifactId)를 JBoss EAP maven 플러그인 구성에 추가합니다.
<channels> <channel> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap:eap-datasources-galleon-pack</location> </feature-pack> </feature-packs> <layers> <!-- Base layer --> <layer>jaxrs-server</layer> <!-- The postgresql datasource layer --> <layer>postgresql-datasource</layer> </layers>
7장. JBoss EAP 서버 및 애플리케이션 구성
OpenShift 이미지용 JBoss EAP는 Java 애플리케이션과의 기본 사용을 위해 사전 구성되어 있습니다. 그러나 이미지 내부에 JBoss EAP 인스턴스를 구성할 수 있습니다. 권장되는 방법은 OpenShift S2I 프로세스를 사용하고 Helm 차트에서 환경 변수를 설정하여 JVM을 조정하는 것입니다.
컨테이너를 다시 시작하거나 종료할 때 실행 중인 컨테이너에 대한 구성 변경 사항이 손실됩니다.
여기에는 기존 JBoss EAP 설치에 포함된 스크립트를 사용하여 수행된 구성 변경(예: add-user.sh
또는 관리 CLI)이 포함됩니다.
OpenShift S2I 프로세스를 환경 변수와 함께 사용하여 OpenShift EAP 내부의 JBoss EAP 인스턴스 구성을 변경하는 것이 좋습니다.
7.1. JVM 기본 메모리 설정
다음 환경 변수를 사용하여 자동으로 계산된 JVM 설정을 수정할 수 있습니다. 이러한 변수는 유효한 컨테이너 메모리 제한을 정의할 때 기본 메모리 크기가 자동으로 계산될 때만 사용됩니다.
환경 변수 | 설명 |
---|---|
|
이 환경 변수는 더 이상 사용되지 않습니다. JVM 인수 참고
자동 계산을 비활성화하려면 |
|
|
|
JVM에 추가 옵션을 제공하는 환경 변수(예: 참고
|
|
이 환경 변수는 더 이상 사용되지 않습니다. |
7.2. JVM 가비지 컬렉션 설정
OpenShift의 EAP 이미지에는 가비지 컬렉션 및 가비지 컬렉션 로깅 모두에 대한 설정이 포함되어 있습니다.
가비지 컬렉션 설정
-XX:+UseParallelGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:+ExitOnOutOfMemoryError
가비지 컬렉션 로깅 설정
-Xlog:gc*:file=/opt/server/standalone/log/gc.log:time,uptimemillis:filecount=5,filesize=3M
7.3. JVM 환경 변수
이러한 환경 변수를 사용하여 OpenShift 이미지의 EAP에서 JVM을 구성합니다.
표 7.1. JVM 환경 변수
변수 이름 | 예제 | 기본값 | JVM 설정 | 설명 |
---|---|---|---|---|
JAVA_OPTS | -verbose:class | 기본값이 없음 | multiple |
|
JAVA_OPTS_APPEND | -Dsome.property=value | 기본값이 없음 | multiple |
|
JAVA_MAX_MEM_RATIO | 50 | 80 | -Xmx |
|
JAVA_INITIAL_MEM_RATIO | 25 | -Xms | -Xms |
|
JAVA_MAX_INITIAL_MEM | 4096 | 4096 | -Xms |
|
JAVA_DIAGNOSTICS | true | false(비활성화됨) |
|
이벤트가 발생할 때 표준 출력에 진단 정보를 포함하려면 이 변수의 값을 |
DEBUG | true | false | -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n | 원격 디버깅을 활성화합니다. |
DEBUG_PORT | 8787 | 8787 | -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n | 디버깅에 사용되는 포트를 지정합니다. |
GC_MIN_HEAP_FREE_RATIO | 20 | 10 | -XX:MinHeapFreeRatio | 확장을 방지하기 위해 가비지 컬렉션 후 사용 가능한 최소 힙 백분율입니다. |
GC_MAX_HEAP_FREE_RATIO | 40 | 20 | -XX:MaxHeapFreeRatio | 축소를 방지하기 위해 가비지 컬렉션 후 사용 가능한 최대 힙 백분율입니다. |
GC_TIME_RATIO | 4 | 4 | -XX:GCTimeRatio | 가비지 컬렉션 외부에서 보낸 시간(예: 애플리케이션 실행 시 소요된 시간)을 가비지 수집에 소비한 시간으로 지정합니다. |
GC_ADAPTIVE_SIZE_POLICY_WEIGHT | 90 | 90 | -XX:AdaptiveSizePolicyWeight | 현재 가비지 컬렉션 시간과 이전 가비지 컬렉션 시간에 지정된 가중치입니다. |
GC_METASPACE_SIZE | 20 | 96 | -XX:MetaspaceSize | 초기 메타 공간 크기입니다. |
GC_MAX_METASPACE_SIZE | 100 | 기본값이 없음 | -XX:MaxMetaspaceSize | 최대 메타 공간 크기입니다. |
GC_CONTAINER_OPTIONS | -XX:+UserG1GC | -XX:-UseParallelGC | -XX:-UseParallelGC | 사용할 Java 가비지 컬렉션을 지정합니다. 변수 값은 JRE(Java Runtime Environment) 명령줄 옵션을 사용하여 지정됩니다. 지정된 JRE 명령이 기본값을 덮어씁니다. |
다음 환경 변수는 더 이상 사용되지 않습니다.
-
JAVA_OPTIONS
:JAVA_OPTS
를 사용합니다. -
INITIAL_HEAP_PERCENT
:JAVA_INITIAL_MEM_RATIO
를 사용합니다. -
CONTAINER_HEAP_PERCENT
:JAVA_MAX_MEM_RATIO
를 사용합니다.
7.4. 기본 데이터 소스
JBoss EAP 8.0에서는 데이터 소스 ExampleDS
를 사용할 수 없습니다.
일부 빠른 시작에는 이 데이터 소스가 필요합니다.
-
cmt
-
스레드 실행
고객이 개발한 애플리케이션에는 ExampleDS
데이터 소스도 필요할 수 있습니다.
기본 데이터 소스가 필요한 경우 JBoss EAP 서버를 프로비저닝할 때 이를 포함하도록 ENABLE_GENERATE_DEFAULT_DATASOURCE
환경 변수를 사용합니다.
ENABLE_GENERATE_DEFAULT_DATASOURCE=true
이 환경 변수는 cloud-default-config
galleon 계층을 사용하는 경우에만 작동합니다.
8장. OpenShift용 JBoss EAP의 기능 트리밍
서버를 트리밍하면 프로비저닝된 서버의 보안 노출을 줄이거나 메모리 풋프린트를 줄여 마이크로 서비스 컨테이너에 더 적합할 수 있습니다.
JBoss EAP가 포함된 이미지를 빌드할 때 이미지에 포함할 JBoss EAP 기능 및 하위 시스템을 제어할 수 있습니다. S2I(Source-to-Image) 빌드 프로세스 중에 새 애플리케이션을 생성할 때 JBoss EAP Maven 플러그인을 사용하여 이 작업을 수행할 수 있습니다. 자세한 내용은 Maven 플러그인을 사용하여 JBoss EAP 서버 프로비저닝을 참조하십시오.
S2I 빌드 프로세스 중에 JBoss EAP Maven 플러그인 대신 다음 환경 변수를 사용할 수 있습니다.
- GALLEON_PROVISION_FEATURE_PACKS
- GALLEON_PROVISION_LAYERS
- GALLEON_PROVISION_CHANNELS
8.1. 사용 가능한 JBoss EAP 계층
Red Hat은 OpenShift에서 JBoss EAP 서버 프로비저닝을 사용자 지정할 수 있는 기본 및 데코레이터 계층을 제공합니다. 기본 계층은 핵심 기능을 제공하며 데코레이터 계층은 기본 계층을 향상시킵니다.
다음 Jakarta EE 사양은 프로비저닝 계층에서 지원되지 않습니다.
- Jakarta ServerProgresss 2.3
- Jakarta Enterprise Cryostats 3.2
- Jakarta XML Web Services 2.3
8.1.1. 기본 계층
각 기본 계층에는 일반적인 서버 사용자 사례에 대한 핵심 기능이 포함되어 있습니다.
datasources-web-server
이 계층에는 서블릿 컨테이너와 데이터 소스를 구성하는 기능이 포함됩니다.
다음은 데이터 소스-web-server
에 기본적으로 포함된 JBoss EAP 하위 시스템입니다.
-
core-management
-
데이터 소스
-
deployment-scanner
-
ee
-
elytron
-
io
-
jca
-
jmx
-
logging
-
이름 지정
-
request-controller
-
security-manager
-
트랜잭션
-
Cryostat
다음 Jakarta EE 사양이 이 계층에서 지원됩니다.
- Jakarta JSON Processing 1.1
- Jakarta JSON Binding 1.0
- Jakarta Servlet 4.0
- Jakarta Expression Language 3.0
- Jakarta 서버 페이지 2.3
- Jakarta 표준 태그 라이브러리 1.2
- Jakarta Concurrency 1.1
- Jakarta Annotations 1.3
- Jakarta XML Binding 2.3
- 기타 언어 1.0에 대한 Jakarta 디버깅 지원
- Jakarta 트랜잭션 1.3
- Jakarta Connectors 1.7
jaxrs-server
이 계층은 다음 JBoss EAP 하위 시스템을 사용하여 datasources-web-server
계층을 향상시킵니다.
-
jaxrs
-
weld
-
jpa
이 계층은 또한 로컬 캐싱이 있는 Infinispan 기반 두 번째 수준 엔터티를 컨테이너에 추가합니다.
다음 Jakarta EE 사양은 데이터 소스-web-server
계층에서 지원되는 것 외에도 이 계층에서 지원됩니다.
- 자카르타 컨텍스트 및 종속성 2.0
- Jakarta Cryostat Validation 2.0
- Jakarta Interceptors 1.2
- Jakarta RESTful Web Services 2.1
- Jakarta Persistence 2.2
cloud-server
이 계층은 다음 JBoss EAP 하위 시스템을 사용하여 jaxrs-server
계층을 향상시킵니다.
-
resource-adapters
-
messaging-activemq
(원격 브로커 메시징, 임베디드 메시징이 아님)
이 계층은 또한 jaxrs-server
계층에 다음과 같은 관찰 기능도 추가합니다.
- 기본 상태
- 기본 지표
다음 Jakarta EE 사양은 jaxrs-server
계층에서 지원되는 것 외에도 이 계층에서 지원됩니다.
- Jakarta Security 1.0
cloud-default-config
이 계층은 standalone-ha.xml
을 기반으로 서버 구성으로 서버를 프로비저닝하고 하위 시스템 구성 messaging-activemq
를 포함합니다. 반대로 modcluster
및 core-management
하위 시스템 구성은 포함되지 않습니다. 이는 클라우드에서 사용하도록 구성되어 있습니다. 또한 모든 JBoss EAP 서버 JBoss 모듈이 설치됩니다.
ee-core-profile-server
ee-core-profile-server
계층은 Jakarta EE 10 Core Profile을 사용하여 서버를 프로비저닝합니다. Core Profile은 핵심 JBoss EAP 서버 기능과 자카르타 EE API를 모두 제공하는 사용자에게 경량화된 소규모 프로필을 제공합니다. ee-core-profile-server
계층은 클라우드 네이티브 애플리케이션 및 마이크로 서비스와 같은 소규모 런타임에 가장 적합합니다.
8.1.2. 데코레이터 계층
데코레이터 계층은 단독으로 사용되지 않습니다. 추가 기능을 제공하기 위해 기본 계층으로 하나 이상의 데코레이터 계층을 구성할 수 있습니다.
관찰 기능
이 데코레이터 계층은 프로비저닝된 서버에 다음과 같은 관찰 기능을 추가합니다.
- 기본 상태
- 기본 지표
이 계층은 cloud-server
계층에 빌드됩니다. 이 계층을 cloud-server
계층에 추가할 필요가 없습니다.
web-clustering
이 계층은 프로비저닝된 서버에 내장된 Infinispan 기반 웹 세션 클러스터링을 추가합니다.
8.2. JBoss EAP에서 사용자 개발 계층 프로비저닝
Red Hat에서 제공하는 프로비저닝 계층 외에도 개발하는 사용자 지정 계층을 프로비저닝할 수 있습니다.
프로세스
Galleon Maven 플러그인을 사용하여 사용자 지정 계층을 빌드합니다.
자세한 내용은 Maven 프로젝트 준비를 참조하십시오.
- 사용자 지정 계층을 액세스 가능한 Maven 리포지토리에 배포합니다.
사용자 정의 Galleon 기능 팩 환경 변수를 사용하여 S2I 이미지 빌드 프로세스 중에 Galleon 기능 팩 및 계층을 사용자 지정할 수 있습니다.
Galleon 기능 팩 및 계층을 사용자 지정하는 방법에 대한 자세한 내용은 S2I 빌드 중 사용자 지정 Galleon 기능 팩 사용 을 참조하십시오.
선택 사항: 사용자 정의 프로비저닝 파일을 생성하여 사용자 정의 계층을 참조하고 지원되는 JBoss EAP 계층을 생성하여 애플리케이션 디렉터리에 저장합니다.
사용자 지정 프로비저닝 파일을 만드는 방법에 대한 자세한 내용은 Galleon 프로비저닝 파일을 참조하십시오.
S2I 프로세스를 실행하여 OpenShift에서 JBoss EAP 서버를 프로비저닝합니다.
자세한 내용은 S2I 빌드 중 사용자 지정 Galleon 기능 팩 사용을 참조하십시오.
8.2.1. JBoss EAP용 사용자 지정 Galleon 계층 빌드 및 사용
사용자 지정 Galleon 계층은 JBoss EAP 8.0에서 실행되도록 설계된 Galleon 기능 팩 내에 패키지됩니다.
Openshift에서는 계층(예: JBoss EAP 8.0 서버의 MariaDB 드라이버 및 데이터 소스)이 포함된 Galleon 기능 팩을 빌드하고 사용할 수 있습니다. 계층에는 서버에 설치된 콘텐츠가 포함되어 있습니다. 계층은 서버 XML 구성 파일을 업데이트하고 서버 설치에 콘텐츠를 추가할 수 있습니다.
이 섹션에서는 OpenShift에서 JBoss EAP 8.0 서버의 MariaDB 드라이버 및 데이터 소스를 프로비저닝하기 위해 계층이 포함된 Galleon 기능 팩을 빌드하고 사용하는 방법을 설명합니다.
8.2.1.1. Maven 프로젝트 준비
Galleon 기능 패키지는 Maven을 사용하여 생성됩니다. 이 절차에서는 새 Maven 프로젝트를 생성하는 단계를 설명합니다.
프로세스
다음 명령을 실행하여 새 Maven 프로젝트를 생성합니다.
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root -DgroupId=org.jboss.eap.demo -DartifactId=mariadb-galleon-pack -DinteractiveMode=false
mariadb-galleon-pack
디렉터리로 이동하여pom.xml
파일을 업데이트하여 Red Hat Maven 리포지토리를 포함합니다.<repositories> <repository> <id>redhat-ga</id> <name>Redhat GA</name> <url>https://maven.repository.redhat.com/ga/</url> </repository> </repositories>
pom.xml
파일을 업데이트하여 JBoss EAP Galleon 기능 팩 및 MariaDB 드라이버에 대한 종속성을 추가합니다.<dependencies> <dependency> <groupId>org.jboss.eap</groupId> <artifactId>wildfly-ee-galleon-pack</artifactId> <version>8.0.0.GA-redhat-00010</version> <type>zip</type> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.7.2</version> </dependency> </dependencies>
참고-
<
version>A.B.C-redhat-XXXXX</version
> 여기서A.B.C
는 릴리스 번호이고XXXXX
는 JBoss EAP 인스턴스의 빌드 번호입니다. JBoss EAP 릴리스에 대한 자세한 내용은 Red Hat Maven 리포지토리를 참조하십시오. 모든 JBoss EAP 릴리스에서 릴리스 및 빌드 번호를 사용할 수 있습니다. https://maven.repository.redhat.com/earlyaccess/all/org/jboss/eap/wildfly-ee-galleon-pack/.
-
<
Galleon 기능 팩을 빌드하는 데 사용되는 Maven 플러그인을 포함하도록
pom.xml
파일을 업데이트합니다.<build> <plugins> <plugin> <groupId>org.wildfly.galleon-plugins</groupId> <artifactId>wildfly-galleon-maven-plugin</artifactId> <version>6.4.8.Final-redhat-00001</version> <executions> <execution> <id>mariadb-galleon-pack-build</id> <goals> <goal>build-user-feature-pack</goal> </goals> <phase>compile</phase> </execution> </executions> </plugin> </plugins> </build>
8.2.1.2. feature-pack 콘텐츠 추가
이 절차에서는 사용자 지정 Galleon 기능 팩에 레이어를 추가하는 데 도움이 됩니다(예: MariaDB 드라이버 및 데이터 소스 계층을 포함한 기능 팩).
사전 요구 사항
- Maven 프로젝트를 생성했습니다. 자세한 내용은 Maven 프로젝트 준비를 참조하십시오.
프로세스
-
사용자 지정 feature-pack Maven 프로젝트 내에서
src/main/resources
디렉터리를 생성합니다. 예를 들면 Maven 프로젝트 준비를 참조하십시오. 이 디렉터리는 feature-pack 콘텐츠를 포함하는 루트 디렉터리입니다. -
src/main/resources/modules/org/mariadb/jdbc/main
디렉터리를 만듭니다. 기본
디렉터리에서 다음 콘텐츠를 사용하여module.xml
이라는 파일을 생성합니다.<?xml version="1.0" encoding="UTF-8"?> <module name="org.mariadb.jdbc" xmlns="urn:jboss:module:1.8"> <resources> <artifact name="${org.mariadb.jdbc:mariadb-java-client}"/> 1 </resources> <dependencies> 2 <module name="java.se"/> <module name="jakarta.transaction.api"/> <module name="jdk.net"/> </dependencies> </module>
-
src/main/resources/layers/standalone/
디렉터리를 생성합니다. 이는 Galleon 기능 팩이 정의하는 모든 계층의 루트 디렉터리입니다. -
src/main/resources/layers/standalone/mariadb-driver
디렉터리를 생성합니다. mariadb-driver
디렉터리에서 다음 콘텐츠를 사용하여layer-spec.xml
파일을 생성합니다.<?xml version="1.0" ?> <layer-spec xmlns="urn:jboss:galleon:layer-spec:1.0" name="mariadb-driver"> <feature spec="subsystem.datasources"> 1 <feature spec="subsystem.datasources.jdbc-driver"> <param name="driver-name" value="mariadb"/> <param name="jdbc-driver" value="mariadb"/> <param name="driver-xa-datasource-class-name" value="org.mariadb.jdbc.MariaDbDataSource"/> <param name="driver-module-name" value="org.mariadb.jdbc"/> </feature> </feature> <packages> 2 <package name="org.mariadb.jdbc"/> </packages> </layer-spec>
mariadb-driver
계층은JBoss Modules
모듈에서 구현하는 JDBC 드라이버의 구성으로데이터
소스 하위 시스템을 업데이트합니다.-
src/main/resources/layers/standalone/mariadb-datasource
디렉터리를 생성합니다. mariadb-datasource
디렉터리에서 다음 콘텐츠를 사용하여layer-spec.xml
파일을 생성합니다.<?xml version="1.0" ?> <layer-spec xmlns="urn:jboss:galleon:layer-spec:1.0" name="mariadb-datasource"> <dependencies> <layer name="mariadb-driver"/> 1 </dependencies> <feature spec="subsystem.datasources.data-source"> 2 <param name="data-source" value="MariaDBDS"/> <param name="jndi-name" value="java:jboss/datasources/${env.MARIADB_DATASOURCE:MariaDBDS}"/> <param name="connection-url" value="jdbc:mariadb://${env.MARIADB_HOST:localhost}:${env.MARIADB_PORT:3306}/${env.MARIADB_DATABASE}"/> 3 <param name="driver-name" value="mariadb"/> <param name="user-name" value="${env.MARIADB_USER}"/> 4 <param name="password" value="${env.MARIADB_PASSWORD}"/> </feature> </layer-spec>
- 1
- 이 종속성은 데이터 소스가 프로비저닝될 때 MariaDB 드라이버의 프로비저닝을 적용합니다. 계층이 종속된 모든 계층은 해당 계층을 프로비저닝할 때 자동으로 프로비저닝됩니다.
- 2
- MariaDBDS 라는
데이터
소스로 데이터 소스 하위 시스템 구성을 업데이트합니다. - 3
- 데이터 소스의 이름, 호스트, 포트 및 데이터베이스 값은 서버가 시작될 때 설정된
MARIADB_
HOSTMARIADB_PORT
,MARIADB_DATABASE
. 환경 변수에서 확인됩니다. - 4
- 사용자 이름 및 암호 값은 환경 변수
MARIADB_USER
및MARIADB_PASSWORD
에서 확인됩니다.
다음 명령을 실행하여 Galleon 기능 팩을 빌드합니다.
mvn clean install
target/mariadb-galleon-pack-1.0-SNAPSHOT.zip
파일이 생성됩니다.
8.2.1.3. S2I 빌드 중 사용자 정의 Galleon 기능 팩 사용
OpenShift S2I 빌드 중에 발생하는 Maven 빌드에서 사용자 지정 기능 팩을 사용할 수 있어야 합니다. 일반적으로 사용자 지정 기능 팩을 아티팩트(예: org.jboss.eap.demo:mariadb-galleon-pack:1.0-SNAPSHOT
)로 배포할 수 있습니다.
사용자 지정 Galleon 기능 팩 사용에 대한 JBoss EAP S2I 이미지 구성에 대한 자세한 내용은 고급 환경 변수를 사용하여 Galleon 구성 을 참조하십시오.
사전 요구 사항
-
oc
명령줄이 설치되어 있어야 합니다. - OpenShift 클러스터에 로그인되어 있습니다.
-
Red Hat Container
레지스트리에 대한 액세스 권한이 구성되어 있습니다. 자세한 내용은 Red Hat Container Registry 를 참조하십시오. - 사용자 정의 Galleon 기능 팩을 생성했습니다. 자세한 내용은 Maven 프로젝트 준비를 참조하십시오.
프로세스
다음 명령을 실행하여
MariaDB
데이터베이스를 시작합니다. 이 예에서는MariaDB
이미지 mariadb-105-rhel7
을 사용합니다. 지원되는 최신 버전의MariaDB
이미지를 사용해야 합니다.MariaDB 이미지에
대한 자세한 내용은 Red Hat Ecosystem Catalog 에서 참조하십시오.oc new-app -e MYSQL_USER=admin -e MYSQL_PASSWORD=admin -e MYSQL_DATABASE=mariadb registry.redhat.io/rhscl/mariadb-105-rhel7
OpenShift 서비스
mariadb-101-rhel7
이 생성되고 시작됩니다.Maven 프로젝트 디렉터리
mariadb-galleon-pack
:에서 다음 명령을 실행하여 사용자 지정 feature-pack Maven 빌드에서 생성된 feature-pack 아카이브에서 시크릿을 생성합니다.oc create secret generic mariadb-galleon-pack --from-file=target/mariadb-galleon-pack-1.0-SNAPSHOT.zip
비밀
mariadb-galleon-pack
이 생성됩니다. S2I 빌드를 시작할 때 이 시크릿은 Pod에 feature-pack .zip 파일을 마운트하여 서버 프로비저닝 단계에서 파일을 사용할 수 있도록 합니다.
8.2.1.4. JBoss EAP 8 이미지 스트림 가져오기
아래 절차에 따라 JBoss EAP 8.0 이미지 스트림을 가져올 수 있습니다.
프로세스
JBoss EAP 8.0 이미지 스트림을 가져옵니다.
oc import-image jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --from=registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --confirm
8.2.1.4.1. JBoss EAP maven 플러그인을 사용하여 S2I 빌드 생성
Cryostat -maven-plugin
은 JBoss EAP galleon 기능 팩, JBoss EAP
대한 참조로 구성되어 있습니다. 클라우드 galleon 기능 팩
과 mariadb galleon 기능
팩에pom.xml
의 추출물을 참조하십시오:
<feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.demo:mariadb-galleon-pack:1.0-SNAPSHOT</location>1 </feature-pack> </feature-packs> <layers> <layer>jaxrs-server</layer> <layer>mariadb-datasource</layer>2 </layers>
프로세스
다음 명령을 실행하여 S2I 빌드를 생성합니다.
oc new-build eap8-openjdk17-builder-openshift-rhel8:latest~https://github.com/jboss-container-images/jboss-eap-8-openshift-image#EAP_8.0.0 \ --context-dir=examples/eap/custom-layers/application \ --build-secret=mariadb-galleon-pack:/tmp/demo-maven-repository/org/jboss/eap/demo/mariadb-galleon-pack/1.0-SNAPSHOT \ 1 --name=mariadb-app-build
- 1
mariadb-galleon-pack
시크릿은/tmp/demo-maven-repository/org/jboss/eap/demo/mariadb-galleon-pack/1.0-SNAPSHOT
디렉터리에 마운트됩니다.
추가 리소스
자세한 내용은 JBoss EAP 8.0 데모 예제 를 참조하십시오.
8.2.1.4.2. 레거시 S2I 프로비저닝 기능을 사용하여 S2I 빌드 생성
서버를 프로비저닝할 수 있도록 openshift-legacy
프로필을 사용하여 S2I 빌드를 구성할 수 있습니다.
프로세스
다음 명령을 실행하여 새 OpenShift 빌드를 생성합니다.
oc new-build eap8-openjdk17-builder-openshift-rhel8:latest~https://github.com/jboss-container-images/jboss-eap-8-openshift-image#EAP_8.0.0 \ --context-dir=examples/eap/custom-layers/application \ --env=GALLEON_PROVISION_CHANNELS="org.jboss.eap.channels:eap-8.0" \ 1 --env=GALLEON_PROVISION_FEATURE_PACKS="org.jboss.eap:wildfly-ee-galleon-pack,org.jboss.eap.cloud:eap-cloud-galleon-pack,org.jboss.eap.demo:mariadb-galleon-pack:1.0-SNAPSHOT" \ 2 --env=GALLEON_PROVISION_LAYERS="jaxrs-server,mariadb-datasource" \ 3 --env=GALLEON_CUSTOM_FEATURE_PACKS_MAVEN_REPO="/tmp/demo-maven-repository" \ 4 --env=MAVEN_ARGS="-Popenshift-legacy" \ 5 --build-secret=mariadb-galleon-pack:/tmp/demo-maven-repository/org/jboss/eap/demo/mariadb-galleon-pack/1.0-SNAPSHOT \ 6 --name=mariadb-app-build
- 1
- 이 환경 변수는 프로비저닝 중에 JBoss EAP 8.0 채널을 사용합니다.
- 2
- 이 환경 변수는 JBoss EAP 8.0
기능 팩
,클라우드 기능 팩
및mariadb 기능-팩
을 참조합니다. - 3
- 이 환경 변수는 서버를 프로비저닝하는 데 사용할 Galleon 계층 세트를 참조합니다.
jaxrs-server
는 기본 서버 계층이며mariadb-datasource
는mariadb
드라이버 및 새 데이터 소스를 서버 설치에 가져오는 사용자 지정 계층입니다. - 4
- 이는
mariadb 기능 팩이
포함된 로컬 maven 리포지토리의 위치를 가리킵니다. - 5
- 이 환경 변수는
MAVEN_ARGS
를 사용하여openshift-legacy
프로필을 활성화합니다. - 6
mariadb-galleon-pack
시크릿은/tmp/demo-maven-repository/org/jboss/eap/demo/mariadb-galleon-pack/1.0-SNAPSHOT
디렉터리에 마운트됩니다.
이 디렉터리 경로는 Maven 리포지토리 아티팩트 좌표를 경로 매핑으로 준수합니다.
8.2.1.4.3. 빌드 시작
새 빌드를 생성하여 mariadb-app-build
이미지를 생성할 수 있습니다.
프로세스
이전에 생성한 동일한 OpenShift 빌드에서 새 빌드를 시작하고 다음 명령을 실행합니다.
oc start-build mariadb-app-build
성공적으로 명령을 실행하면
mariadb-app-build
이미지가 생성됩니다.
8.2.1.4.4. 새 배포 생성
실행 중인 MariaDB
데이터베이스에 데이터 소스를 바인딩하는 데 필요한 환경 변수를 제공하여 새 배포를 생성할 수 있습니다.
프로세스
다음 명령을 실행하여 새 배포를 생성합니다.
oc new-app --name=mariadb-app mariadb-app-build \ --env=MARIADB_PORT=3306 \ --env=MARIADB_USER=admin \ --env=MARIADB_PASSWORD=admin \ --env=MARIADB_HOST=mariadb-105-rhel7 \ --env=MARIADB_DATABASE=mariadb \ --env=MARIADB_DATASOURCE=Demo 1
- 1
- 데모에서는 데이터 소스의 이름이
데모
가 될 것으로 예상합니다.
참고사용자 지정 Galleon 기능 팩 환경 변수에 대한 자세한 내용은 사용자 정의 Galleon 기능 팩 환경 변수를 참조하십시오.
mariadb-app
애플리케이션을 노출하고 다음 명령을 실행합니다.oc expose svc/mariadb-app
새 작업을 생성하려면 다음 명령을 실행합니다.
curl -X POST http://$(oc get route mariadb-app --template='{{ .spec.host }}')/tasks/title/foo
작업 목록에 액세스하려면 다음 명령을 실행합니다.
curl http://$(oc get route mariadb-app --template='{{ .spec.host }}')
추가된 작업이 브라우저에 표시됩니다.
8.2.2. 고급 환경 변수를 사용하여 Galleon 구성
고급 사용자 지정 Galleon 기능 팩 환경 변수를 사용하여 S2I 이미지 빌드 프로세스 중에 사용자 지정 Galleon 기능 팩 및 계층을 저장하는 위치를 사용자 지정할 수 있습니다. 이러한 고급 사용자 지정 Galleon 기능 팩 환경 변수는 다음과 같습니다.
-
GALLEON_DIR=<path
> 기본 <project_root_dir>/galleon
디렉터리 경로를 <project_root_dir>/<GALLEON_DIR
> 로 재정의합니다. -
GALLEON_CUSTOM_FEATURE_PACKS_MAVEN_REPO=<path
> . . 에서는 <project root dir>/galleon/repository
디렉터리 경로를 Maven 로컬 리포지토리 캐시 디렉터리에 대한 절대 경로로 재정의합니다. 이 리포지토리에는 사용자 지정 Galleon 기능 팩이 포함되어 있습니다.
Maven local-cache 파일 시스템 구성을 준수하는 하위 디렉터리 내에서 Galleon 기능 팩 아카이브 파일을 찾아야 합니다. 예를 들어 path-to-repository/org/examples/my-feature-pack/1.0.0.Final/my-feature-pack-1.0.0.Final.zip
경로 내에서 org.examples:my-feature-pack:1.0.0.Final
기능 팩:1.0.0.Final 기능 팩을 찾습니다.
<project _root>/<GALLEON_DIR> 디렉터리에
설정을 구성할 수 있습니다. settings.xml
파일을 생성하여 Maven 프로젝트GALLEON_DIR
의 기본값은 < project_root_dir>/galleon
입니다. Maven은 파일을 사용하여 애플리케이션의 사용자 지정 Galleon 기능 팩을 프로비저닝합니다. settings.xml
파일을 생성하지 않으면 Maven은 S2I 이미지에서 생성한 기본 settings.xml
파일을 사용합니다.
S2I 빌더 이미지가 로컬 Maven 리포지토리의 위치를 지정하므로 settings.xml
파일에 로컬 Maven 리포지토리 위치를 지정하지 마십시오. S2I 빌더 이미지는 S2I 빌드 프로세스 중에 이 위치를 사용합니다.
추가 리소스
8.2.3. 사용자 정의 Galleon 기능 팩 환경 변수
다음 사용자 지정 Galleon 기능 팩 환경 변수를 사용하여 JBoss EAP S2I 이미지 사용 방법을 사용자 지정할 수 있습니다.
표 8.1. 사용자 지정 Galleon 기능 팩 환경 변수에 대한 설명
환경 변수 | 설명 |
---|---|
GALLEON_DIR=<path> |
여기서 <path >는 애플리케이션 프로젝트의 루트 디렉터리를 기준으로 하는 디렉터리입니다. & lt;path > 디렉터리에는
디렉터리의 기본값은 |
GALLEON_CUSTOM_FEATURE_PACKS_MAVEN_REPO=<path> |
<path >는 사용자 지정 기능 팩을 포함하는 Maven 로컬 리포지토리 디렉터리의 절대 경로입니다. 디렉터리의 기본값은 |
GALLEON_PROVISION_FEATURE_PACKS=<list_of_galleon_feature_packs> | 여기서 < list_of_galleon_feature_packs >은 Maven 좌표로 식별되는 사용자 지정 Galleon 기능 팩의 쉼표로 구분된 목록입니다. 나열된 기능 팩은 빌더 이미지에 있는 JBoss EAP 8.0 서버 버전과 호환되어야 합니다.
|
9장. OpenShift Container Platform에 Jboss EAP 애플리케이션 배포
9.1. OpenShift에서 애플리케이션 배포를 자동화하는 JBoss EAP operator
EAP Operator는 OpenShift API를 확장하는 JBoss EAP별 컨트롤러입니다. EAP Operator를 사용하여 복잡한 상태 저장 애플리케이션의 인스턴스를 생성, 구성, 관리 및 원활하게 업그레이드할 수 있습니다.
EAP 운영자는 클러스터에서 여러 JBoss EAP Java 애플리케이션 인스턴스를 관리합니다. 또한 복제본을 축소하고 종료를 위해 Pod를 정리하기
전에 모든 트랜잭션이 완료되었는지 확인하여 애플리케이션 클러스터에서 안전한 트랜잭션 복구를 보장합니다. EAP Operator는 Jakarta Enterprise Cryostat 원격 및 트랜잭션 복구 처리를 적절하게 처리하기 위해 StatefulSet
을 사용합니다. StatefulSet
은 Pod를 다시 시작한 후에도 영구 스토리지 및 네트워크 호스트 이름 안정성을 보장합니다.
OpenShift 클러스터 관리자가 Operator를 검색, 설치 및 업그레이드하는 데 사용할 수 있는 OperatorHub를 사용하여 EAP Operator를 설치해야 합니다.
OpenShift Container Platform 4에서는 OLM(Operator Lifecycle Manager)을 사용하여 모든 Operator 및 여러 클러스터에서 실행되는 관련 서비스의 라이프사이클을 설치, 업데이트 및 관리할 수 있습니다.
OLM은 OpenShift Container Platform 4에서 기본적으로 실행됩니다. 클러스터 관리자는 클러스터에서 실행되는 operator에 대한 액세스 권한을 설치, 업그레이드 및 부여할 수 있습니다. OpenShift Container Platform 웹 콘솔은 클러스터 관리자가 Operator를 설치할 수 있는 관리 화면을 제공하고, 특정 프로젝트에 클러스터에 사용 가능한 Operator 카탈로그를 사용할 수 있는 액세스 권한을 부여합니다.
Operator 및 OLM에 대한 자세한 내용은 OpenShift 설명서 를 참조하십시오.
9.1.1. 웹 콘솔을 사용하여 EAP Operator 설치
JBoss EAP 클러스터 관리자는 OpenShift Container Platform 웹 콘솔을 사용하여 Red Hat OperatorHub에서 EAP Operator를 설치할 수 있습니다. 그런 다음 EAP Operator를 하나 이상의 네임 스페이스에 가입하여 클러스터의 개발자가 사용할 수 있도록 할 수 있습니다.
웹 콘솔을 사용하여 EAP Operator를 설치하기 전에 알아야 할 몇 가지 사항은 다음과 같습니다.
- 설치 모드: 클러스터의 모든 네임스페이스(기본값) 를 선택하여 Operator를 모든 네임스페이스에 설치하거나 사용 가능한 경우 개별 네임스페이스를 선택하여 선택한 네임스페이스에만 Operator를 설치합니다.
- 업데이트 채널: EAP Operator를 여러 채널을 통해 사용할 수 있는 경우 구독할 채널을 선택할 수 있습니다. 예를 들어, stable 채널에서 배치하려면 (사용 가능한 경우) 목록에서 해당 채널을 선택합니다.
- 승인 전략: 자동 또는 수동 업데이트를 선택할 수 있습니다. EAP Operator에 대해 자동 업데이트를 선택하는 경우 새 버전의 Operator를 사용할 수 있는 경우 OLM(Operator Lifecycle Manager)은 실행 중인 EAP Operator 인스턴스를 자동으로 업그레이드합니다. 수동 업데이트를 선택하면 최신 버전의 Operator가 사용 가능할 때 OLM에서 업데이트 요청을 생성합니다. 그런 다음 Operator가 새 버전으로 업데이트되도록 업데이트 요청을 수동으로 승인해야 합니다.
다음 절차는 OpenShift Container Platform 웹 콘솔의 수정 사항에 따라 변경될 수 있습니다. 가장 정확한 최신 절차는 최신 버전의 OpenShift Container Platform 가이드의 Operator 작업 섹션에서 웹 콘솔을 사용하여 OperatorHub에서 설치 섹션을 참조하십시오.
사전 요구 사항
-
cluster-admin
권한이 있는 계정을 사용하여 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator→ OperatorHub 로 이동합니다.
-
아래로 스크롤하거나 키워드로 필터링 상자에
EAP
를 입력하여 EAP Operator를 찾습니다. - JBoss EAP Operator를 선택하고 설치를 클릭합니다.
Create Operator Subscription 페이지에서 다음을 수행합니다.
다음 명령 중 하나를 선택합니다.
-
클러스터의 모든 네임스페이스(기본값) 는 기본
openshift-operators
네임스페이스에 Operator를 설치하여 클러스터의 모든 네임스페이스를 감시하고 사용할 수 있게 합니다. 이 옵션을 항상 사용할 수있는 것은 아닙니다. - 클러스터의 특정 네임스페이스 는 선택한 특정 단일 네임스페이스에 Operator를 설치합니다. Operator는 이 단일 네임스페이스에서만 사용할 수 있습니다.
-
클러스터의 모든 네임스페이스(기본값) 는 기본
- Update Channel을 선택합니다.
- 앞에서 설명한 대로 자동 또는 수동 승인 전략을 선택합니다.
서브스크립션을 클릭하여 이 OpenShift Container Platform 클러스터에서 선택한 네임스페이스에서 EAP Operator를 사용할 수 있도록 합니다.
- 수동 승인 전략을 선택한 경우 설치 계획을 검토하고 승인할 때까지 서브스크립션의 업그레이드 상태가 Upgrading 으로 유지됩니다. 설치 계획 페이지에서 설치 계획을 승인한 후 서브스크립션 업그레이드 상태가 Up to date 로 이동합니다.
- 자동 승인 전략을 선택한 경우 업그레이드 상태가 개입 없이 최신 상태로 이동합니다.
서브스크립션의 업그레이드 상태가 최신 버전이면 Operator → 설치된 Operator를 선택하여 CSV(EAP ClusterServiceVersion)가 표시되고 해당 상태가 관련 네임스페이스에 InstallSucceeded 로 변경되었는지 확인합니다.
참고All namespaces… 설치 모드의 경우
openshift-operators
네임스페이스에 표시되는 상태가 InstallSucceeded 입니다. 다른 네임스페이스에서 상태가 Copied 입니다. . . Status 필드가 InstallSucceeded 로 변경되지 않는 경우 문제를 보고하는 워크로드 → Pod 페이지에서openshift-operators
프로젝트(또는 특정 네임스페이스… 설치 모드가 선택된 경우 기타 관련 네임스페이스)의 모든 Pod 의 로그를 확인합니다.
9.1.2. CLI를 사용하여 EAP Operator 설치
JBoss EAP 클러스터 관리자는 OpenShift Container Platform CLI를 사용하여 Red Hat OperatorHub에서 EAP Operator를 설치할 수 있습니다. 그런 다음 EAP Operator를 하나 이상의 네임 스페이스에 가입하여 클러스터의 개발자가 사용할 수 있도록 할 수 있습니다.
CLI를 사용하여 OperatorHub에서 EAP Operator를 설치할 때 oc
명령을 사용하여 Subscription
오브젝트를 생성합니다.
사전 요구 사항
-
cluster-admin
권한이 있는 계정을 사용하여 OpenShift Container Platform 클러스터에 액세스할 수 있습니다. -
로컬 시스템에
oc
툴을 설치했습니다.
프로세스
OperatorHub에서 클러스터에서 사용할 수 있는 Operator 목록을 확인합니다.
$ oc get packagemanifests -n openshift-marketplace | grep eap NAME CATALOG AGE ... eap Red Hat Operators 43d ...
서브스크립션
오브젝트 YAML 파일(예: Cryostat-operator-sub.yaml
)을 생성하여 네임스페이스를 EAP Operator에 서브스크립션합니다. 다음은Subscription
오브젝트 YAML 파일의 예입니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: eap namespace: openshift-operators spec: channel: stable installPlanApproval: Automatic name: eap 1 source: redhat-operators 2 sourceNamespace: openshift-marketplace
채널 및 승인 전략에 대한 자세한 내용은 이 절차의 웹 콘솔 버전을 참조하십시오.
YAML 파일에서
Subscription
오브젝트를 생성합니다.$ oc apply -f eap-operator-sub.yaml $ oc get csv -n openshift-operators NAME DISPLAY VERSION REPLACES PHASE eap-operator.v1.0.0 JBoss EAP 1.0.0 Succeeded
EAP Operator가 성공적으로 설치되었습니다. 이 시점에서 OLM은 EAP Operator를 알고 있습니다. Operator의 ClusterServiceVersion (CSV)이 대상 네임스페이스에 표시되고 EAP Operator에서 제공하는 API를 생성할 수 있습니다.
9.1.3. EAP Operator를 사용하여 OpenShift에 Java 애플리케이션 배포
EAP Operator는 OpenShift에서 Java 애플리케이션 배포를 자동화하는 데 도움이 됩니다. EAP Operator API에 대한 자세한 내용은 EAP Operator: API 정보를 참조하십시오.
사전 요구 사항
- EAP Operator를 설치했습니다. EAP Operator 설치에 대한 자세한 내용은 웹 콘솔을 사용하여 EAP Operator 설치 및 CLI를 사용하여 EAP Operator 설치를 참조하십시오.
- JBoss EAP for OpenShift S2I(Source-to-Image) 빌드 이미지를 사용하여 사용자 애플리케이션의 Docker 이미지를 빌드했습니다.
-
애플리케이션의 CRD(CustomResourceDefinition) 파일이 이를 참조하는 경우
Secret
오브젝트를 생성했습니다. 새Secret
오브젝트 생성에 대한 자세한 내용은 보안 생성을 참조하십시오. -
애플리케이션의 CRD 파일이 이를 참조하는 경우
ConfigMap
을 생성했습니다. ConfigMap 생성에 대한 자세한 내용은ConfigMap
생성을 참조하십시오. -
이렇게 하려면
standalone.xml
파일에서ConfigMap
을 생성했습니다. standalone.xml 파일에서ConfigMap
을 생성하는 방법에 대한 자세한 내용은standalone.xml
파일에서 ConfigMap 생성을 참조하십시오.
ConfigMap
에서 standalone.xml
파일을 제공하는 것은 JBoss EAP 8.0에서 지원되지 않습니다.
프로세스
- 웹 브라우저를 열고 OperatorHub에 로그인합니다.
- Java 애플리케이션에 사용할 프로젝트 또는 네임스페이스를 선택합니다.
- Installed Operator 로 이동하여 JBoss EAP operator 를 선택합니다.
- 개요 탭에서 인스턴스 생성 링크를 클릭합니다.
애플리케이션 이미지 세부 정보를 지정합니다.
애플리케이션 이미지는 Java 애플리케이션이 포함된 Docker 이미지를 지정합니다. 이미지는 JBoss EAP for OpenShift S2I(Source-to-Image) 빌드 이미지를 사용하여 빌드해야 합니다.
applicationImage
필드가 imagestreamtag에 해당하는 경우 이미지에 대한 모든 변경으로 애플리케이션의 자동 업그레이드가 트리거됩니다.다음 참조 중 하나로 OpenShift 애플리케이션 이미지에 대한 JBoss EAP를 제공할 수 있습니다.
- 이미지 이름: mycomp/myapp
- 태그: mycomp/myapp:1.0
- A digest: mycomp/myapp:@sha256:0af38bc38be93116b6a1d86a9c78bd14cd527121970899d719baf78e5dc7bfd2
- imagestreamtag: my-app:latest
애플리케이션 크기를 지정합니다. 예를 들면 다음과 같습니다.
spec: replicas:2
env 사양
을 사용하여 애플리케이션 환경을 구성합니다. 환경 변수는 POSTGRESQL_SERVICE_HOST 또는 POSTGRESQL_USER와 같은Secret
오브젝트에서 직접 가져올 수 있습니다. 예를 들면 다음과 같습니다.spec: env: - name: POSTGRESQL_SERVICE_HOST value: postgresql - name: POSTGRESQL_SERVICE_PORT value: '5432' - name: POSTGRESQL_DATABASE valueFrom: secretKeyRef: key: database-name name: postgresql - name: POSTGRESQL_USER valueFrom: secretKeyRef: key: database-user name: postgresql - name: POSTGRESQL_PASSWORD valueFrom: secretKeyRef: key: database-password name: postgresql
애플리케이션 배포와 관련된 다음 선택적 구성을 완료합니다.
- 서버 데이터 디렉터리에 대한 스토리지 요구 사항을 지정합니다. 자세한 내용은 애플리케이션용 영구 스토리지 구성을 참조하십시오.
WildFlyServerSpec
에서 생성한시크릿
이름을 지정하여 애플리케이션을 실행하는 Pod의 볼륨으로 마운트합니다. 예를 들면 다음과 같습니다.spec: secrets: - my-secret
Secret
은/etc/secrets/<secret name
>에 마운트되며 각 키/값은 파일로 저장됩니다. 파일 이름은 키이고 콘텐츠는 값입니다.시크릿
은 Pod 내부에 볼륨으로 마운트됩니다. 다음 예제에서는 키 값을 찾는 데 사용할 수 있는 명령을 보여줍니다.$ ls /etc/secrets/my-secret/ my-key my-password $ cat /etc/secrets/my-secret/my-key devuser $ cat /etc/secrets/my-secret/my-password my-very-secure-pasword
참고Secret
오브젝트를 수정하면 프로젝트 불일치가 발생할 수 있습니다. 기존Secret
오브젝트를 수정하는 대신 Red Hat은 이전 오브젝트와 동일한 콘텐츠를 사용하여 새 오브젝트를 생성하는 것이 좋습니다. 그런 다음 필요에 따라 콘텐츠를 업데이트하고 operator CR(사용자 정의 리소스)의 참조를 old에서 new로 변경할 수 있습니다. 이는 새 CR 업데이트로 간주되며 Pod가 다시 로드됩니다.WildFlyServerSpec
에서 생성한ConfigMap
의 이름을 지정하여 애플리케이션을 실행하는 Pod의 볼륨으로 마운트합니다. 예를 들면 다음과 같습니다.spec: configMaps: - my-config
ConfigMap
은/etc/configmaps/<configmap name
>에 마운트되며 각 키/값은 파일로 저장됩니다. 파일 이름은 키이고 콘텐츠는 값입니다.ConfigMap
은 Pod 내부에 볼륨으로 마운트됩니다. 키 값을 찾으려면 다음을 수행합니다.$ ls /etc/configmaps/my-config/ key1 key2 $ cat /etc/configmaps/my-config/key1 value1 $ cat /etc/configmaps/my-config/key2 value2
참고ConfigMap
을 수정하면 프로젝트 불일치가 발생할 수 있습니다. 기존ConfigMap
을 수정하는 대신 Red Hat은 이전ConfigMap
과 동일한 콘텐츠를 사용하여 새 ConfigMap을 생성하는 것이 좋습니다. 그런 다음 필요에 따라 콘텐츠를 업데이트하고 operator CR(사용자 정의 리소스)의 참조를 old에서 new로 변경할 수 있습니다. 이는 새 CR 업데이트로 간주되며 Pod가 다시 로드됩니다.고유한 독립 실행형
ConfigMap
을 사용하도록 선택하는 경우ConfigMap
의 이름과standalone.xml
파일의 키를 제공합니다.standaloneConfigMap: name: clusterbench-config-map key: standalone.xml
참고JBoss EAP 8.0에서는
standalone.xml
파일에서ConfigMap
을 생성할 수 없습니다.OpenShift에서 기본 HTTP 경로 생성을 비활성화하려면
disableHTTPRoute
를true
로 설정합니다.spec: disableHTTPRoute: true
9.1.3.1. 시크릿 생성
애플리케이션의 CRD(CustomResourceDefinition) 파일이 Secret
을 참조하는 경우 EAP Operator를 사용하여 OpenShift에 애플리케이션을 배포하기 전에 Secret
을 생성해야 합니다.
프로세스
-
시크릿
을 생성하려면 다음을 수행합니다.
$ oc create secret generic my-secret --from-literal=my-key=devuser --from-literal=my-password='my-very-secure-pasword'
9.1.3.2. configMap 생성
애플리케이션의 CRD(CustomResourceDefinition) 파일이 spec.ConfigMaps 필드의 ConfigMap을 참조하는 경우 EAP Operator를 사용하여 OpenShift에 애플리케이션을 배포하기 전에 ConfigMap을 생성해야 합니다.
프로세스
- configmap을 생성하려면 다음을 수행합니다.
$ oc create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2 configmap/my-config created
9.1.3.3. standalone.xml File에서 configMap 생성
OpenShift S2I(Source-to-Image)용 JBoss EAP에서 제공하는 애플리케이션 이미지에서 사용하지 않고 고유한 JBoss EAP 독립 실행형 구성을 생성할 수 있습니다. standalone.xml
파일은 Operator가 액세스할 수 있는 ConfigMap
에 배치해야 합니다.
ConfigMap
에서 standalone.xml
파일을 제공하는 것은 JBoss EAP 8.0에서 지원되지 않습니다.
프로세스
-
standalone.xml
파일에서ConfigMap
을 생성하려면 다음을 수행합니다.
$ oc create configmap clusterbench-config-map --from-file examples/clustering/config/standalone.xml configmap/clusterbench-config-map created
9.1.3.4. 애플리케이션의 영구 스토리지 구성
애플리케이션에 Pod를 다시 시작할 때마다 유지해야 하는 트랜잭션 또는 메시징 로그와 같은 일부 데이터에 대한 영구 스토리지가 필요한 경우 스토리지 사양을 구성합니다. 스토리지 사양이 비어 있으면 애플리케이션의 각 Pod에서 EmptyDir
볼륨이 사용됩니다. 그러나 해당 Pod가 중지된 후에는 이 볼륨이 유지되지 않습니다.
프로세스
JBoss EAP 독립 실행형 데이터 디렉터리를 저장하기 위한 리소스 요구 사항을 구성하려면
volumeClaimTemplate
을 지정합니다. 템플릿의 이름은 JBoss EAP의 이름에서 파생됩니다. 해당 볼륨은ReadWriteOnce
액세스 모드로 마운트됩니다.spec: storage: volumeClaimTemplate: spec: resources: requests: storage: 3Gi
이 스토리지 요구 사항을 충족하는 영구 볼륨은
/eap/standalone/data
디렉터리에 마운트됩니다.
9.1.4. EAP Operator를 사용하여 애플리케이션 메트릭 보기
EAP Operator를 사용하여 OpenShift에 배포된 애플리케이션의 지표를 볼 수 있습니다.
클러스터 관리자가 프로젝트에서 지표 모니터링을 활성화하면 EAP Operator가 OpenShift 콘솔에 지표를 자동으로 표시합니다.
사전 요구 사항
- 클러스터 관리자가 프로젝트에 대한 모니터링을 활성화했습니다. 자세한 내용은 사용자 정의 프로젝트에 대한 모니터링 활성화를 참조하십시오.
프로세스
- OpenShift Container Platform 웹 콘솔에서 모니터링→ 메트릭 으로 이동합니다.
- 메트릭 화면에서 텍스트 상자에 애플리케이션 이름을 입력하여 애플리케이션을 선택합니다. 애플리케이션의 메트릭이 화면에 표시됩니다.
9.1.5. 웹 콘솔을 사용하여 EAP Operator 설치 제거
클러스터에서 EAP Operator를 삭제하거나 제거할 수 있습니다. 서브스크립션을 삭제하여 서브스크립션된 네임스페이스에서 제거할 수 있습니다. EAP Operator의 CSV(ClusterServiceVersion) 및 배포를 제거할 수도 있습니다.
데이터 일관성과 안전성을 보장하기 위해 EAP Operator를 제거하기 전에 클러스터의 Pod 수를 0으로 축소합니다.
웹 콘솔을 사용하여 EAP Operator를 설치 제거할 수 있습니다.
전체 wildflyserver
정의(oc delete wildflyserver <deployment_name>
)를 삭제하기로 결정한 경우, 완료되지 않은 트랜잭션과 관계없이 Pod가 시작되지 않고 Pod가 종료됩니다. 이 작업을 수행하는 완료되지 않은 작업에서는 나중에 시작하는 데이터 변경 사항이 차단될 수 있습니다. 이 wildflyserver
를 사용한 트랜잭션 엔터프라이즈 빈 원격 호출과 관련된 다른 JBoss EAP 인스턴스에 대한 데이터 변경도 차단될 수 있습니다.
프로세스
- Operator→ 설치된 Operator 페이지에서 JBoss EAP 를 선택합니다.
- Operator 상세 정보 페이지 오른쪽에 있는 작업 드롭다운 메뉴에서 Operator 제거를 선택합니다.
- Operator 서브스크립션 제거 창에서 프롬프트가 표시되면 설치와 관련된 모든 구성 요소를 제거하려는 경우 선택적으로 선택한 네임스페이스 Operator 완전히 제거 확인란을 선택합니다. 이렇게 하면 CSV가 제거되어 Operator와 연결된 Pod, 배포, CRD(사용자 정의 리소스 정의) 및 CR(사용자 정의 리소스)이 제거됩니다.
- 제거를 클릭합니다. EAP Operator는 실행을 중지하고 더 이상 업데이트를 수신하지 않습니다.
9.1.6. CLI를 사용하여 JBoss EAP Operator 설치 제거
클러스터에서 EAP Operator를 삭제하거나 설치 제거할 수 있습니다. 서브스크립션을 삭제하여 서브스크립션된 네임스페이스에서 제거할 수 있습니다. EAP Operator의 CSV(ClusterServiceVersion) 및 배포를 제거할 수도 있습니다.
데이터 일관성과 안전성을 보장하기 위해 EAP Operator를 제거하기 전에 클러스터의 Pod 수를 0으로 축소합니다.
명령줄을 사용하여 EAP Operator를 설치 제거할 수 있습니다.
명령줄을 사용하는 경우 대상 네임스페이스에서 서브스크립션 및 CSV를 삭제하여 Operator를 제거합니다.
전체 wildflyserver
정의(oc delete wildflyserver <deployment_name>
)를 삭제하기로 결정한 경우, 완료되지 않은 트랜잭션과 관계없이 Pod가 시작되지 않고 Pod가 종료됩니다. 이 작업을 수행하는 완료되지 않은 작업에서는 나중에 시작하는 데이터 변경 사항이 차단될 수 있습니다. 이 wildflyserver
를 사용한 트랜잭션 엔터프라이즈 빈 원격 호출과 관련된 다른 JBoss EAP 인스턴스에 대한 데이터 변경도 차단될 수 있습니다.
프로세스
currentCSV
필드에서 EAP Operator 서브스크립션의 현재 버전을 확인합니다.$ oc get subscription eap-operator -n openshift-operators -o yaml | grep currentCSV currentCSV: eap-operator.v1.0.0
EAP Operator의 서브스크립션을 삭제합니다.
$ oc delete subscription eap-operator -n openshift-operators subscription.operators.coreos.com "eap-operator" deleted
이전 단계의
currentCSV
값을 사용하여 대상 네임스페이스에서 EAP Operator의 CSV를 삭제합니다.$ oc delete clusterserviceversion eap-operator.v1.0.0 -n openshift-operators clusterserviceversion.operators.coreos.com "eap-operator.v1.0.0" deleted
9.1.7. 안전한 트랜잭션 복구를 위한 JBoss EAP operator
JBoss EAP Operator는 애플리케이션 클러스터를 종료하기 전에 데이터 일관성을 보장합니다. 이를 위해 Operator는 복제본을 축소하고 종료를 위해 Pod를 정리
로 표시하기 전에 모든 트랜잭션이 완료되었는지 확인합니다.
즉, 데이터 불일치 없이 배포를 안전하게 제거하려면 먼저 Pod 수를 0으로 축소한 다음 모든 Pod가 종료될 때까지 기다린 다음 wildflyserver
인스턴스만 삭제해야 합니다.
전체 wildflyserver
정의(oc delete wildflyserver <deployment_name>
)를 삭제하기로 결정한 경우, 완료되지 않은 트랜잭션과 관계없이 Pod가 시작되지 않고 Pod가 종료됩니다. 이 작업을 수행하는 완료되지 않은 작업에서는 나중에 시작하는 데이터 변경 사항이 차단될 수 있습니다. 이 wildflyserver
를 사용한 트랜잭션 엔터프라이즈 빈 원격 호출과 관련된 다른 JBoss EAP 인스턴스에 대한 데이터 변경도 차단될 수 있습니다.
스케일다운 프로세스가 Pod 상태(oc get pod <pod_name>
)가 여전히 Running
으로 표시됩니다. Pod는 이를 대상으로 하는 원격 엔터프라이즈 빈 호출을 포함하여 완료되지 않은 모든 트랜잭션을 완료해야 합니다.
스케일 다운 프로세스의 상태를 모니터링하려면 wildflyserver
인스턴스의 상태를 관찰합니다. 자세한 내용은 스케일다운 프로세스 모니터링을 참조하십시오. 스케일 다운 중 Pod 상태에 대한 자세한 내용은 스케일 다운 중 Pod 상태를 참조하십시오.
9.1.7.1. 안정적인 네트워크 호스트 이름을 위한 상태 저장 세트
wildflyserver를 관리하는 EAP Operator는 JBoss EAP 포드를 관리하는 기본 오브젝트로 StatefulSet
을 생성합니다.
StatefulSet
은 상태 저장 애플리케이션을 관리하는 워크로드 API 오브젝트입니다. Pod 세트 배포 및 스케일링을 관리하고 이러한 Pod의 순서 및 고유성을 보장합니다.
StatefulSet
을 사용하면 클러스터의 Pod의 이름이 사전 정의된 순서로 지정됩니다. 또한 Pod 종료가 동일한 순서를 따릅니다. 예를 들어, pod-1은 추론적인 결과가 있는 트랜잭션을 가지고 있으므로 SCALING_DOWN_RECOVERY_DIRTY
의 상태에 있습니다. pod-0이 SCALING_DOWN_CLEAN
상태인 경우에도 pod-1 전에는 종료되지 않습니다. pod-1이 정리
되고 종료될 때까지 pod-0은 SCALING_DOWN_CLEAN
상태로 유지됩니다. 그러나 pod-0이 SCALING_DOWN_CLEAN
상태에 있더라도 새 요청이 수신되지 않으며 거의 유휴 상태입니다.
StatefulSet
의 복제본 크기를 줄이거나 Pod 자체를 삭제하는 것은 효과가 없으며 이러한 변경 사항이 취소됩니다.
9.1.7.2. 스케일 다운 프로세스 모니터링
스케일 다운 프로세스의 상태를 모니터링하려면 wildflyserver
인스턴스의 상태를 관찰해야 합니다. 스케일 다운 중 다양한 Pod 상태에 대한 자세한 내용은 스케일 다운 중 Pod 상태를 참조하십시오.
프로세스
축소 프로세스의 상태를 확인하려면 다음을 수행합니다.
oc describe wildflyserver <name>
- WildFlyServer.Status.Scalingdown Pod 및 WildFlyServer.Status.Replicas 필드에는 활성 및 비활성 Pod의 전체 상태가 표시됩니다.
- Scalingdown Pods 필드에는 모든 완료되지 않은 트랜잭션이 완료될 때 종료될 Pod 수가 표시됩니다.
- WildFlyServer.Status.Replicas 필드에는 실행 중인 현재 Pod 수가 표시됩니다.
- WildFlyServer.Spec.Replicas 필드에는 ACTIVE 상태의 Pod 수가 표시됩니다.
- 축소할 Pod가 없는 경우 WildFlyServer.Status.Replicas 및 WildFlyServer.Spec.Replicas 필드의 Pod 수가 동일합니다.
9.1.7.2.1. 스케일 다운 중 Pod 상태
다음 표에서는 확장 중에 다양한 Pod 상태를 설명합니다.
표 9.1. Pod 상태 설명
Pod 상태 | 설명 |
---|---|
활성 상태 | Pod는 활성 상태이며 요청을 처리합니다. |
SCALING_DOWN_RECOVERY_INVESTIGATION | Pod를 축소하려고 합니다. 스케일 다운 프로세스는 JBoss EAP의 트랜잭션 상태에 대해 조사 중입니다. |
SCALING_DOWN_RECOVERY_DIRTY | JBoss EAP에는 일부 불완전한 트랜잭션이 포함되어 있습니다. Pod를 정리할 때까지 종료할 수 없습니다. 트랜잭션 복구 프로세스는 JBoss EAP에서 주기적으로 실행되며 트랜잭션이 완료될 때까지 대기합니다. |
SCALING_DOWN_CLEAN |
Pod는 트랜잭션 축소 처리로 처리되며 클러스터에서 제거되도록 |
9.1.7.3. 논리적인 결과를 사용하여 트랜잭션 중 축소
트랜잭션 결과를 알 수 없는 경우 자동 트랜잭션 복구를 수행할 수 없습니다. 그런 다음 수동으로 트랜잭션을 복구해야합니다.
사전 요구 사항
-
Pod의 상태는
SCALING_DOWN_RECOVERY_DIRTY
에 있습니다.
프로세스
- CLI를 사용하여 JBoss EAP 인스턴스에 액세스합니다.
- 트랜잭션 오브젝트 저장소의 모든 추론 트랜잭션 레코드를 해결합니다. 자세한 내용은 JBoss EAP의 트랜잭션 관리에서 Recovering Heuristic Outcomes 를 참조하십시오.
Enterprise Cryostat 클라이언트 복구 폴더에서 모든 레코드를 제거합니다.
Pod enterprise Cryostat 클라이언트 복구 디렉터리에서 모든 파일을 제거합니다.
$JBOSS_HOME/standalone/data/ejb-xa-recovery oc exec <podname> rm -rf $JBOSS_HOME/standalone/data/ejb-xa-recovery
-
Pod 상태가
SCALING_DOWN_CLEAN
으로 변경되고 Pod가 종료됩니다.
9.1.7.4. 트랜잭션 로그에 JDBC 스토리지를 사용하도록 트랜잭션 하위 시스템 구성
시스템이 트랜잭션 로그
를 저장할 파일 시스템을 제공하지 않는 경우 JBoss EAP S2I 이미지를 사용하여 JDBC 개체 저장소를 구성합니다.
JBoss EAP가 부팅 가능한 JAR로 배포되면 S2I 환경 변수를 사용할 수 없습니다. 이 경우 Galleon 계층을 생성하거나 CLI 스크립트를 구성하여 필요한 구성을 변경해야 합니다.
JDBC 오브젝트 저장소는 TX_DATABASE_PREFIX_MAPPING
환경 변수를 사용하여 설정할 수 있습니다. 이 변수는 DB_SERVICE_PREFIX_MAPPING
과 동일한 구조를 갖습니다.
사전 요구 사항
- 환경 변수 값을 기반으로 데이터 소스를 생성했습니다.
-
데이터베이스와 JDBC 개체 저장소를 통해 통신하는
트랜잭션 관리자
간에 일관된 데이터 읽기 및 쓰기 권한이 있어야 합니다. 자세한 내용은 JDBC 데이터 소스 구성을참조하십시오.
프로세스
S2I 환경 변수를 통해 JDBC 오브젝트 저장소를 설정하고 구성합니다.
예제
# Narayana JDBC objectstore configuration via s2i env variables - name: TX_DATABASE_PREFIX_MAPPING value: 'PostgresJdbcObjectStore-postgresql=PG_OBJECTSTORE' - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_HOST value: 'postgresql' - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_PORT value: '5432' - name: PG_OBJECTSTORE_JNDI value: 'java:jboss/datasources/PostgresJdbc' - name: PG_OBJECTSTORE_DRIVER value: 'postgresql' - name: PG_OBJECTSTORE_DATABASE value: 'sampledb' - name: PG_OBJECTSTORE_USERNAME value: 'admin' - name: PG_OBJECTSTORE_PASSWORD value: 'admin'
검증
standalone.xml 구성 파일
oc rsh <podname> cat /opt/server/standalone/
을 모두 확인할 수 있습니다.standalone.xml
을 확인하여 데이터 소스 구성 및 트랜잭션 하위 시스템 구성예상 출력:
<datasource jta="false" jndi-name="java:jboss/datasources/PostgresJdbcObjectStore" pool-name="postgresjdbcobjectstore_postgresqlObjectStorePool" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}"> <connection-url>jdbc:postgresql://postgresql:5432/sampledb</connection-url> <driver>postgresql</driver> <security> <user-name>admin</user-name> <password>admin</password> </security> </datasource> <!-- under subsystem urn:jboss:domain:transactions --> <jdbc-store datasource-jndi-name="java:jboss/datasources/PostgresJdbcObjectStore"> <!-- the pod name was named transactions-xa-0 --> <action table-prefix="ostransactionsxa0"/> <communication table-prefix="ostransactionsxa0"/> <state table-prefix="ostransactionsxa0"/> </jdbc-store>
추가 리소스
- 관리 콘솔 또는 관리 CLI를 사용하여 데이터 소스 생성에 대한 자세한 내용은 JBoss EAP 구성 가이드의 데이터 소스 생성 을 참조하십시오.
9.1.8. 수평 Pod 자동 스케일러 HPA를 사용하여 Pod 자동 스케일링
EAP Operator를 사용하면 수평 Pod 자동 스케일러 HPA를 사용하여 해당 EAP 애플리케이션에 속하는 Pod에서 수집한 메트릭을 기반으로 EAP 애플리케이션의 규모를 자동으로 늘리거나 줄일 수 있습니다.
HPA를 사용하면 Pod를 축소할 때 트랜잭션 복구가 계속 처리됩니다.
프로세스
리소스를 구성합니다.
apiVersion: wildfly.org/v1alpha1 kind: WildFlyServer metadata: name: eap-helloworld spec: applicationImage: 'eap-helloworld:latest' replicas: 1 resources: limits: cpu: 500m memory: 2Gi requests: cpu: 100m memory: 1Gi
중요자동 스케일링이 예상대로 작동하려면 Pod에서 컨테이너의 리소스 제한 및 요청을 지정해야 합니다.
Horizontal Pod 자동 스케일러를 생성합니다.
oc autoscale wildflyserver/eap-helloworld --cpu-percent=50 --min=1 --max=10
검증
- 복제본을 확인하여 HPA 동작을 확인할 수 있습니다. 워크로드 증가 또는 감소에 따라 복제본 수가 증가 또는 감소합니다.
oc get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE eap-helloworld WildFlyServer/eap-helloworld 217%/50% 1 10 1 4s eap-helloworld WildFlyServer/eap-helloworld 217%/50% 1 10 4 17s eap-helloworld WildFlyServer/eap-helloworld 133%/50% 1 10 8 32s eap-helloworld WildFlyServer/eap-helloworld 133%/50% 1 10 10 47s eap-helloworld WildFlyServer/eap-helloworld 139%/50% 1 10 10 62s eap-helloworld WildFlyServer/eap-helloworld 180%/50% 1 10 10 92s eap-helloworld WildFlyServer/eap-helloworld 133%/50% 1 10 10 2m2s
9.1.9. Jarkarta Enterprise beans Remoting on OpenShift
9.1.9.1. Jakarta Enterprise Cryostats remoting on openShift
JBoss EAP가 OpenShift의 다른 JBoss EAP 클러스터 간에 엔터프라이즈급 remoting 호출을 올바르게 사용하려면 OpenShift에서 엔터프라이즈 empty 원격 구성 옵션을 이해해야 합니다.
OpenShift에 배포할 때 EAP Operator 사용을 고려하십시오. EAP Operator는 엔터프라이즈 빈 원격 설정 및 트랜잭션 복구 처리를 적절하게 처리하기 위해 StatefulSet
을 사용합니다. StatefulSet
은 Pod를 다시 시작한 후에도 영구 스토리지 및 네트워크 호스트 이름 안정성을 보장합니다.
트랜잭션 전파를 통한 엔터프라이즈VLAN 원격 호출을 사용하여 JBoss EAP 인스턴스에 연결할 때 네트워크 호스트 이름 안정성이 필요합니다. 포드가 다시 시작되는 경우에도 동일한 호스트 이름으로 JBoss EAP 인스턴스에 연결할 수 있어야 합니다. 상태 저장 구성 요소인 트랜잭션 관리자는 지속된 트랜잭션 데이터를 특정 JBoss EAP 인스턴스에 바인딩합니다. 트랜잭션 로그는 특정 JBoss EAP 인스턴스에 바인딩되므로 동일한 인스턴스에서 완료해야 합니다.
JDBC 트랜잭션 로그 저장소를 사용할 때 데이터 손실을 방지하려면 데이터베이스에서 데이터 일치 읽기 및 쓰기를 제공하는지 확인합니다. 데이터베이스가 여러 인스턴스로 수평으로 확장될 때 일관된 데이터 읽기 및 쓰기가 중요합니다.
enterprise Cryostat 원격 호출자에는 원격 호출을 구성하는 두 가지 옵션이 있습니다.
- 원격 아웃바운드 연결을 정의합니다. 자세한 내용은 원격 아웃 바운드 연결 구성을 참조하십시오.
- 원격 서버에서 8080에 대해 프로그래밍 방식의 JNDI 조회를 사용합니다. 자세한 내용은 원격 자카르타 Enterprise Cryostat 클라이언트 사용을 참조하십시오.
엔터프라이즈 빈 원격 호출 구성 방법에 따라 대상 노드의 주소를 나타내는 값을 재구성해야 합니다.
원격 호출의 대상 엔터프라이즈 빈 이름은 첫 번째 포드의 DNS 주소여야 합니다.
StatefulSet
동작은 Pod의 순서에 따라 다릅니다. Pod의 이름은 사전 정의된 순서로 지정됩니다. 예를 들어 애플리케이션을 3개의 복제본으로 스케일링하는 경우 Pod에 name -server-0 , Cryostat-server
-1 , Cryostat
와 같은 이름이 있습니다.
-server
-2
EAP Operator는 특정 DNS 호스트 이름이 포드에 할당되도록 하는 헤드리스 서비스도 사용합니다. 애플리케이션에서 EAP Operator를 사용하는 경우 헤드리스 서비스가 이름(예: Cryostat -server-headless
)으로 생성됩니다. 이 경우 첫 번째 Pod의 DNS 이름은 Cryostat -server-0.eap-server-headless
입니다.
hostname -server-0.eap-server-headless
를 사용하면 엔터프라이즈 콩 호출이 클러스터에 연결된 모든 EAP 인스턴스에 도달할 수 있습니다. 부트스트랩 연결은 다음 단계로 EAP 클러스터의 구조를 수집하는 Jakarta Enterprise Cryostats 클라이언트를 초기화하는 데 사용됩니다.
9.1.9.1.1. OpenShift에서 Jakarta Enterprise Cryostat 구성
엔터프라이즈 빈 재모팅을 위해 호출자 역할을 하는 JBoss EAP 서버를 구성해야 합니다. 대상 서버는 엔터프라이즈 빈 원격 호출을 수신할 수 있는 권한이 있는 사용자를 구성해야 합니다.
사전 요구 사항
- OpenShift에서 JBoss EAP 애플리케이션 인스턴스를 배포 및 관리하기 위해 EAP 운영자와 지원되는 OpenShift S2I 이미지를 사용했습니다.
- 클러스터링이 올바르게 설정됩니다. JBoss EAP 클러스터링에 대한 자세한 내용은 Cryostat 섹션을 참조하십시오. https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/8.0/html-single/getting_started_with_jboss_eap_for_openshift_container_platform/#ref_openshift-clustering_assembly_reference-information-for-openshift-container-platform
프로세스
엔터프라이즈 empty 원격 호출을 수신할 수 있는 권한을 사용하여 대상 서버에 사용자를 생성합니다.
$JBOSS_HOME/bin/add-user.sh
호출자 JBoss EAP 애플리케이션 서버를 구성합니다.
-
사용자 지정 구성 기능을 사용하여
$JBOSS_HOME/standalone/configuration
에 Cryostat-config.xml
파일을 만듭니다. 자세한 내용은 사용자 지정 구성 을 참조하십시오. wildfly.config.url
속성을 사용하여 호출자 JBoss EAP 애플리케이션 서버를 구성합니다.JAVA_OPTS_APPEND="-Dwildfly.config.url=$JBOSS_HOME/standalone/configuration/eap-config.xml"
참고구성에 다음 예제를 사용하는 경우 구성한 사용자 이름 및 암호로 >>
PASTE_…_HERE
<<를 사용자 이름 및 암호로 바꿉니다.설정 예
<configuration> <authentication-client xmlns="urn:elytron:1.0"> <authentication-rules> <rule use-configuration="jta"> <match-abstract-type name="jta" authority="jboss" /> </rule> </authentication-rules> <authentication-configurations> <configuration name="jta"> <sasl-mechanism-selector selector="DIGEST-MD5" /> <providers> <use-service-loader /> </providers> <set-user-name name="PASTE_USER_NAME_HERE" /> <credentials> <clear-password password="PASTE_PASSWORD_HERE" /> </credentials> <set-mechanism-realm name="ApplicationRealm" /> </configuration> </authentication-configurations> </authentication-client> </configuration>
-
사용자 지정 구성 기능을 사용하여
10장. 문제 해결
Pod는 여러 가지 이유로 다시 시작할 수 있지만 JBoss EAP 포드 재시작의 일반적인 원인에는 특히 메모리 부족 문제가 발생할 수 있습니다. OpenShift Pod 제거에 대한 자세한 내용은 OpenShift 설명서를 참조하십시오.
10.1. Pod 재시작 문제 해결
기본적으로 OpenShift 템플릿용 JBoss EAP는 메모리 부족 문제와 같은 상황이 발생하면 영향을 받는 컨테이너를 자동으로 재시작하도록 구성됩니다. 다음 단계는 메모리 부족 및 기타 Pod 재시작 문제를 진단하고 해결하는 데 도움이 될 수 있습니다.
문제가 발생한 Pod의 이름을 가져옵니다.
Pod 이름과 각 Pod가 다음 명령을 사용하여 재시작한 횟수를 확인할 수 있습니다.
$ oc get pods
포드가 재시작된 이유를 진단하기 위해 이전 포드의 JBoss EAP 로그 또는 OpenShift 이벤트를 검사할 수 있습니다.
이전 포드의 JBoss EAP 로그를 보려면 다음 명령을 사용합니다.
oc logs --previous POD_NAME
OpenShift 이벤트를 보려면 다음 명령을 사용합니다.
$ oc get events
- 리소스 문제로 인해 포드를 다시 시작한 경우 OpenShift 포드 구성을 수정하여 리소스 요청 및 제한을 늘릴 수 있습니다. Pod 컴퓨팅 리소스 구성에 대한 자세한 내용은 OpenShift 설명서를 참조하십시오.
10.2. JBoss EAP 관리 CLI를 사용한 문제 해결
JBoss EAP 관리 CLI, EAP_HOME/bin/jboss-cli.sh
는 문제 해결을 위해 컨테이너 내에서 액세스할 수 있습니다.
JBoss EAP 관리 CLI를 사용하여 실행 중인 포드에서 구성을 변경하지 않는 것이 좋습니다. 컨테이너를 다시 시작하면 실행 중인 컨테이너에서 관리 CLI를 사용하여 변경한 구성은 손실됩니다.
OpenShift용 JBoss EAP를 구성하려면 JBoss EAP 서버 및 애플리케이션 구성을 참조하십시오.
먼저 실행 중인 포드에 대한 원격 쉘 세션을 엽니다.
$ oc rsh POD_NAME
원격 쉘 세션에서 다음 명령을 실행하여 JBoss EAP 관리 CLI를 시작합니다.
$ /opt/server/bin/jboss-cli.sh
10.3. JBoss EAP 8의 버전 1.0.0에서 1.1.0으로 Helm 차트를 업데이트할 때 오류 문제 해결
Helm 차트를 JBoss EAP 8의 최신 버전으로 업그레이드할 때 오류가 발생할 수 있습니다. Helm 차트를 업그레이드하기 전에 변경할 수 없는 필드를 수정하면 업그레이드 중에 다음 오류 메시지가 표시될 수 있습니다.
UPGRADE FAILED: cannot patch "<helm-release-name>" with kind Deployment: Deployment.apps "<helm-release-name>" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/instance":"<helm-release-name>", "app.kubernetes.io/name":"<helm-release-name>"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
이 오류를 해결하려면 helm upgrade <helm-release-name> 명령을 실행하기 전에
> 명령을 실행하여 배포 리소스를 삭제합니다.
oc delete deployment <helm-release-name
11장. OpenShift Container Platform에 대한 참조 정보
이 섹션의 콘텐츠는 이 애플리케이션 이미지의 엔지니어링 문서에서 파생됩니다. 콘텐츠는 개발 목적 및 제품 문서의 범위를 벗어나는 테스트를 위한 참조로 제공됩니다.
11.1. 정보 환경 변수
다음 환경 변수는 이미지에 정보를 제공하도록 설계되었으며 사용자가 수정하지 않아야 합니다.
표 11.1. 정보 환경 변수
변수 이름 | 설명 및 값 |
---|---|
JBOSS_IMAGE_NAME | 이미지 이름입니다. 값:
|
JBOSS_IMAGE_VERSION | 이미지 버전입니다. 값: 이미지 버전 번호입니다. 최신 값은 Red Hat Container Catalog를 참조하십시오. |
JBOSS_MODULES_SYSTEM_PKGS | 애플리케이션에서 사용할 수 있는 JBoss EAP 시스템 모듈 패키지 쉼표로 구분된 목록입니다.
값: |
STI_BUILDER |
값: |
11.2. 구성 환경 변수
다시 빌드하지 않고도 이미지를 조정하도록 다음 환경 변수를 구성할 수 있습니다.
여기에 나열되지 않은 다른 환경 변수는 JBoss EAP 설명서 를 참조하십시오.
표 11.2. 구성 환경 변수
변수 이름 | 설명 |
---|---|
CLI_GRACEFUL_SHUTDOWN |
0이 아닌 길이 값으로 설정하면 이미지가
예제 value: |
CONTAINER_HEAP_PERCENT | 최대 Java 힙 크기를 사용 가능한 컨테이너 메모리의 백분율로 설정합니다.
예제 값: |
CUSTOM_INSTALL_DIRECTORIES | S2I 프로세스 중 이미지의 아티팩트 설치 및 구성에 사용되는 쉼표로 구분된 디렉터리 목록입니다.
값 예: |
DEFAULT_JMS_CONNECTION_FACTORY |
이 값은 Jakarta Messaging 연결 팩토리에 대한 기본 JNDI 바인딩을 지정하는 데 사용됩니다(예:
예제 값: |
ENABLE_ACCESS_LOG | 표준 출력 채널에 대한 액세스 메시지 로깅을 활성화합니다. 액세스 메시지의 로깅은 다음 방법을 사용하여 구현됩니다.
기본값은 |
INITIAL_HEAP_PERCENT | 초기 Java 힙 크기를 최대 힙 크기의 백분율로 설정합니다.
예제 값: |
JAVA_OPTS_APPEND | 서버 시작 옵션.
예제 값: |
JBOSS_MODULES_SYSTEM_PKGS_APPEND |
예시 값: |
JGROUPS_CLUSTER_PASSWORD |
Cryostat 클러스터에 참여할 수 있도록 노드를 인증하는 데 사용되는 암호입니다.
예제 값: |
JGROUPS_ENCRYPT_KEYSTORE |
예제 값: |
JGROUPS_ENCRYPT_KEYSTORE_DIR | 키 저장소가 포함된 시크릿이 마운트되는 디렉터리 경로입니다.
값 예: |
JGROUPS_ENCRYPT_NAME |
예제 값: |
JGROUPS_ENCRYPT_PASSWORD |
예제 값: |
JGROUPS_ENCRYPT_PROTOCOL |
클러스터 트래픽의 암호화에 사용할 Cryostat 프로토콜입니다.
기본값은
예제 값: |
JGROUPS_PING_PROTOCOL |
노드 검색에 사용할 Cryostat 프로토콜입니다. |
MQ_SIMPLE_DEFAULT_PHYSICAL_DESTINATION |
이전 버전과의 호환성을 위해 |
OPENSHIFT_DNS_PING_SERVICE_NAME | DNS 검색 메커니즘을 위해 서버에서 ping 포트를 노출하는 서비스의 이름입니다.
예제 값: |
OPENSHIFT_DNS_PING_SERVICE_PORT |
DNS 검색 메커니즘에 대한 ping 포트의 포트 번호입니다. 지정하지 않으면 서비스의 SRV 레코드에서 포트 번호를 검색하거나 기본
기본값은 |
OPENSHIFT_KUBE_PING_LABELS | Kubernetes 검색 메커니즘에 대한 클러스터링 라벨 선택기입니다.
예제 값: |
OPENSHIFT_KUBE_PING_NAMESPACE | Kubernetes 검색 메커니즘을 위한 프로젝트 네임스페이스 클러스터링.
예제 값: |
SCRIPT_DEBUG |
|
11.3. 노출된 포트
표 11.3. 노출된 포트
포트 번호 | 설명 |
---|---|
8443 | HTTPS |
11.4. 데이터 소스
데이터 소스는 일부 환경 변수의 값에 따라 자동으로 생성됩니다.
가장 중요한 환경 변수는 데이터 소스에 대한 JNDI 매핑을 정의하므로 DB_SERVICE_PREFIX_MAPPING
입니다. 이 변수에 허용되는 값은 쉼표로 구분된 POOLNAME-DATABASETYPE=PREFIX트립
릿 목록입니다.
-
POOLNAME
은 데이터소스에서 풀 이름으로
사용됩니다. -
DATABASETYPE
은 사용할 데이터베이스 드라이버입니다. -
PREFIX
는 데이터 소스를 구성하는 데 사용되는 환경 변수의 이름에 사용되는 접두사입니다.
11.4.1. 데이터 소스에 대한 JNDI 매핑
DB_SERVICE_PREF
트리트에 대해 시작 스크립트는 이미지를 실행할 때 실행되는 별도의 데이터 소스를 생성합니다.
IX_MAPPING
환경 변수에 정의된 각POOLNAME-DATABASETYPE=PREFIX
DB_SERVICE_PREFIX_MAPPING
의 첫 번째 부분은 소문자여야 합니다.
DATABASETYPE
은 데이터 소스에 대한 드라이버를 결정합니다.
드라이버 구성에 대한 자세한 내용은 모듈, 드라이버 및 일반 배포를 참조하십시오. JDK 8 이미지에는 기본적으로 postgresql
및 mysql
에 대한 드라이버가 있습니다.
POOLNAME
매개변수에는 특수 문자를 사용하지 마십시오.
OpenShift 이미지용 JBoss EAP와 함께 Red Hat 제공 내부 데이터 소스 드라이버 사용 지원이 더 이상 사용되지 않습니다. 데이터베이스 벤더에서 얻은 JDBC 드라이버를 JBoss EAP 애플리케이션에 사용하는 것이 좋습니다.
다음 내부 데이터 소스는 더 이상 OpenShift 이미지용 JBoss EAP와 함께 제공되지 않습니다.
- MySQL
- PostgreSQL
드라이버 설치에 대한 자세한 내용은 모듈, 드라이버 및 일반 배포를 참조하십시오.
JBoss EAP를 사용한 JDBC 드라이버 구성에 대한 자세한 내용은 JBoss EAP 구성 가이드의 JDBC 드라이버 를 참조하십시오.
프로비저닝된 서버에 추가하려는 경우 이러한 드라이버 및 데이터 소스를 설치하기 위해 사용자 지정 계층을 만들 수도 있습니다.
11.4.1.1. 데이터 소스 구성 환경 변수
다른 데이터 소스 속성을 구성하려면 다음 환경 변수를 사용합니다.
다음 변수 이름의 POOLNAME
, DATABASETYPE
및 PREFIX
값을 적절한 값으로 교체해야 합니다. 이러한 대체 가능한 값은 이 섹션과 Datasources 섹션에 설명되어 있습니다.
변수 이름 | 설명 |
---|---|
POOLNAME_DATABASETYPE_SERVICE_HOST |
데이터 소스의
예제 값: |
POOLNAME_DATABASETYPE_SERVICE_PORT | 데이터 소스에 대한 데이터베이스 서버의 포트를 정의합니다.
예제 값: |
PREFIX_BACKGROUND_VALIDATION |
|
PREFIX_BACKGROUND_VALIDATION_MILLIS |
|
PREFIX_CONNECTION_CHECKER | 사용 중인 특정 데이터베이스에 대한 연결의 유효성을 검사하는 데 사용되는 연결 검사 클래스를 지정합니다.
예: |
PREFIX_DATABASE | 데이터 소스의 데이터베이스 이름을 정의합니다.
예제 값: |
PREFIX_DRIVER | 데이터 소스에 대한 Java 데이터베이스 드라이버를 정의합니다.
예시 값: |
PREFIX_EXCEPTION_SORTER | 치명적인 데이터베이스 연결 예외 이후 적절하게 감지 및 정리하는 데 사용되는 예외 분류기 클래스를 지정합니다.
예제 값: |
PREFIX_JNDI |
데이터 소스에 대한 JNDI 이름을 정의합니다. 기본값은
예제 값: |
PREFIX_JTA | 비 XA 데이터 소스에 대한 Jakarta 트랜잭션 옵션을 정의합니다. XA 데이터 소스는 이미 Jakarta 트랜잭션입니다.
기본값은 |
PREFIX_MAX_POOL_SIZE | 데이터 소스에 대한 최대 풀 크기 옵션을 정의합니다.
예제 값: |
PREFIX_MIN_POOL_SIZE | 데이터 소스에 대한 최소 풀 크기 옵션을 정의합니다.
예제 값: |
PREFIX_NONXA |
데이터 소스를 비 XA 데이터 소스로 정의합니다. 기본값은 |
PREFIX_PASSWORD | 데이터 소스의 암호를 정의합니다.
예: |
PREFIX_TX_ISOLATION | 데이터 소스에 대한 java.sql.Connection 트랜잭션 격리 수준을 정의합니다.
예제 값: |
PREFIX_URL | 데이터 소스에 대한 연결 URL을 정의합니다.
예제 값: |
PREFIX_USERNAME | 데이터 소스의 사용자 이름을 정의합니다.
예제 값: |
11.4.1.2. 예
이 예제에서는 DB_SERVICE_PREFIX_MAPPING
환경 변수의 값이 데이터 소스 생성에 어떤 영향을 미치는지 보여줍니다.
11.4.1.2.1. 단일 매핑
test-postgresql=TEST
값을 고려하십시오.
이렇게 하면 java:jboss/datasources/test_postgresql
이름을 사용하여 데이터 소스가 생성됩니다. 또한 password 및 username과 같은 모든 필수 설정은 Cryostat _ 접두사(예: Cryostat_
)를 사용하여 환경 변수로 제공되어야 합니다.
USERNAME
및 Cryostat _
PASSWORD
11.4.1.2.2. 여러 매핑
여러 데이터 소스 매핑을 지정할 수 있습니다.
항상 여러 데이터 소스 매핑을 쉼표로 구분합니다.
DB_SERVICE_PREFIX_MAPPING
환경 변수에 대해 다음 값을 고려하십시오. cloud-postgresql=CLOUD,test-mysql=TEST_MYSQL
.
이렇게 하면 다음 두 데이터 소스가 생성됩니다.
-
java:jboss/datasources/test_mysql
-
java:jboss/datasources/cloud_postgresql
그런 다음 MySQL 데이터 소스의 사용자 이름 및 암호(예: Cryostat _MYSQL_
USERNAME )와 같은 항목을 구성하기 위해 Cryostat_MYSQL
접두사를 사용할 수 있습니다. PostgreSQL 데이터 소스의 경우 CLOUD_
접두사를 사용합니다(예: CLOUD_USERNAME
).
11.5. 클러스터링
11.5.1. Cryostat 검색 메커니즘 구성
OpenShift에서 JBoss EAP 클러스터링을 활성화하려면 kubernetes.KUBE_PING
또는 dns.DNS_PING
검색 메커니즘을 사용하도록 JBoss EAP 구성에서 Cryostat 프로토콜 스택을 구성합니다.
사용자 지정 standalone.xml
구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 Cryostat를 구성하는 것이 좋습니다.
아래 명령은 환경 변수를 사용하여 OpenShift 이미지용 JBoss EAP에 대한 검색 메커니즘을 구성합니다.
Helm 차트를 사용하여 OpenShift 이미지용 JBoss EAP 상단에 애플리케이션을 배포하는 경우 기본 검색 메커니즘은 dns.DNS_PING
입니다.
dns.DNS_PING
및 kubernetes.KUBE_PING
검색 메커니즘은 서로 호환되지 않습니다. 검색을 위해 dns.DNS_PING
메커니즘을 사용하고 kubernetes.KUBE_PING
메커니즘을 사용하여 두 개의 독립적인 하위 클러스터에서 슈퍼클러스터를 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 및 대상 클러스터 둘 다 검색 메커니즘이 동일해야 합니다.
11.5.1.1. KUBE_PING 구성
KUBE_PING
Cryostat 검색 메커니즘을 사용하려면 다음을 수행합니다.
KUBE_PING
을 검색 메커니즘으로 사용하도록 Cryostat 프로토콜 스택을 구성해야 합니다.JGROUPS_PING_PROTOCOL
환경 변수를kubernetes.KUBE_PING
으로 설정하여 이 작업을 수행할 수 있습니다.JGROUPS_PING_PROTOCOL=kubernetes.KUBE_PING
KUBERNETES_NAMESPACE
환경 변수를 OpenShift 프로젝트 이름으로 설정해야 합니다. 예를 들면 다음과 같습니다.KUBERNETES_NAMESPACE=PROJECT_NAME
KUBERNETES_LABELS
환경 변수를 설정해야 합니다. 이는 서비스 수준에서 설정된 라벨 과 일치해야 합니다. 설정되지 않으면 애플리케이션 외부의 Pod(네임스페이스에 있음)가 참여하려고 합니다. 예를 들면 다음과 같습니다.KUBERNETES_LABELS=application=APP_NAME
Kubernetes의 REST API에 액세스할 수 있도록 pod가 실행 중인 서비스 계정에 권한을 부여해야 합니다. 이 작업은 OpenShift CLI를 사용하여 수행됩니다. 다음 예제에서는 현재 프로젝트 네임스페이스의
default
서비스 계정을 사용합니다.oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
프로젝트 네임스페이스
에서 Cryostat-service-account
사용:oc policy add-role-to-user view system:serviceaccount:$(oc project -q):eap-service-account -n $(oc project -q)
참고서비스 계정에 정책을 추가하는 방법에 대한 자세한 내용은 OpenShift에서 애플리케이션 배포를 참조하십시오.
11.5.1.2. DNS_PING 구성
DNS_PING
Cryostat 검색 메커니즘을 사용하려면 다음을 수행합니다.
DNS_PING
을 검색 메커니즘으로 사용하도록 Cryostat 프로토콜 스택을 구성해야 합니다.JGROUPS_PING_PROTOCOL
환경 변수를dns.DNS_PING
:로 설정하여 이 작업을 수행할 수 있습니다.JGROUPS_PING_PROTOCOL=dns.DNS_PING
OPENSHIFT_DNS_PING_SERVICE_NAME
환경 변수는 클러스터의 ping 서비스 이름으로 설정해야 합니다.OPENSHIFT_DNS_PING_SERVICE_NAME=PING_SERVICE_NAME
OPENSHIFT_DNS_PING_SERVICE_PORT
환경 변수는 ping 서비스가 노출되는 포트 번호로 설정해야 합니다.DNS_PING
프로토콜은 SRV 레코드에서 포트를 식별하려고 합니다. 그렇지 않으면 기본값은8888
입니다.OPENSHIFT_DNS_PING_SERVICE_PORT=PING_PORT
ping 포트를 노출하는 ping 서비스를 정의해야 합니다. 이 서비스는 헤드리스(ClusterIP=None)여야 하며 다음이 있어야 합니다.
- 포트의 이름은 이어야 합니다.
서비스에
service.alpha.kubernetes.io/tolerate-unready-endpoints
및publishNotReadyAddresses
속성을true
로 설정해야 합니다.참고-
service.alpha.kubernetes.io/tolerate-unready-endpoints
및publishNotReadyAddresses
속성을 모두 사용하여 ping 서비스가 이전 OpenShift 릴리스와 최신 OpenShift 릴리스에서 작동하도록 합니다. - 이러한 주석을 생략하면 각 노드가 시작 중에 자체 "1 클러스터"를 형성합니다. 그런 다음 다른 노드가 시작된 후 다른 노드가 감지되지 않으므로 각 노드는 시작 후 클러스터를 다른 노드의 클러스터에 병합합니다.
kind: Service apiVersion: v1 spec: publishNotReadyAddresses: true clusterIP: None ports: - name: ping port: 8888 selector: deploymentConfig: eap-app metadata: name: eap-app-ping annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" description: "The JGroups ping port for clustering."
-
DNS_PING
은 서비스 계정을 수정할 필요가 없으며 기본 권한을 사용하여 작동합니다.
11.5.2. 클러스터 트래픽을 암호화하도록 Cryostat 구성
OpenShift에서 JBoss EAP에 대한 클러스터 트래픽을 암호화하려면 SYM_ENCRYPT
또는 ASYM_ENCRYPT
프로토콜을 사용하도록 JBoss EAP 구성에서 Cryostat 프로토콜 스택을 구성해야 합니다.
사용자 지정 standalone.xml
구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 Cryostat를 구성하는 것이 좋습니다.
아래 명령은 환경 변수를 사용하여 OpenShift 이미지의 JBoss EAP의 클러스터 트래픽 암호화 프로토콜을 구성합니다.
SYM_ENCRYPT
및 ASYM_ENCRYPT
프로토콜은 서로 호환되지 않습니다. 클러스터 트래픽 암호화를 위해 SYM_ENCRYPT 프로토콜을 사용하고 다른 하나는 A
프로토콜을 사용하여 두 개의 독립적인 하위 클러스터로 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 및 대상 클러스터 모두에서 프로토콜을 동일해야 합니다.
SYM_ENCRYPT
11.5.2.1. SYM_ENCRYPT 구성
SYM_ENCRYPT
프로토콜을 사용하여 Cryostat 클러스터 트래픽을 암호화하려면 다음을 수행합니다.
SYM_ENCRYPT
를 암호화 프로토콜로 사용하도록 Cryostat 프로토콜 스택을 구성해야 합니다.JGROUPS_ENCRYPT_PROTOCOL
환경 변수를SYM_ENCRYPT
로 설정하여 이 작업을 수행할 수 있습니다.JGROUPS_ENCRYPT_PROTOCOL=SYM_ENCRYPT
JGROUPS_ENCRYPT_KEYSTORE_DIR
환경 변수는 키 저장소를 포함하는 시크릿이 마운트된 디렉터리 경로로 설정해야 합니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_KEYSTORE_DIR=/etc/jgroups-encrypt-secret-volume
JGROUPS_ENCRYPT_KEYSTORE
환경 변수는 지정된 시크릿 내에서 키 저장소 파일의 이름으로 설정해야 합니다. 설정되지 않은 경우 클러스터 통신이 암호화되지 않고 경고가 표시됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceks
JGROUPS_ENCRYPT_NAME
환경 변수를 서버 인증서와 연결된 이름으로 설정해야 합니다. 설정되지 않은 경우 클러스터 통신이 암호화되지 않고 경고가 표시됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_NAME=jgroups
JGROUPS_ENCRYPT_PASSWORD
환경 변수는 키 저장소 및 인증서에 액세스하는 데 사용되는 암호로 설정해야 합니다. 설정되지 않은 경우 클러스터 통신이 암호화되지 않고 경고가 표시됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_PASSWORD=mypassword
11.5.2.2. ASYM_ENCRYPT 구성
JBoss EAP 8.0에는 새로운 버전의 ASYM_ENCRYPT
프로토콜이 포함되어 있습니다. 이전 버전의 프로토콜은 더 이상 사용되지 않습니다. JGROUPS_CLUSTER_PASSWORD
환경 변수를 지정하면 더 이상 사용되지 않는 프로토콜 버전이 사용되며 Pod 로그에 경고가 표시됩니다.
ASYM_ENCRYPT
프로토콜을 사용하여 Cryostat 클러스터 트래픽을 암호화하려면 ASYM_ENCRYPT
를 암호화 프로토콜로 지정하고 elytron
하위 시스템에 구성된 키 저장소를 사용하도록 구성합니다.
-e JGROUPS_ENCRYPT_PROTOCOL="ASYM_ENCRYPT" \ -e JGROUPS_ENCRYPT_NAME="encrypt_name" \ -e JGROUPS_ENCRYPT_PASSWORD="encrypt_password" \ -e JGROUPS_ENCRYPT_KEYSTORE="encrypt_keystore" \ -e JGROUPS_CLUSTER_PASSWORD="cluster_password"
11.5.3. Pod 스케일링 고려 사항
Cryostat의 검색 메커니즘을 기반으로 시작 노드는 기존 클러스터 코디네이터 노드를 검색합니다. 코디네이터 노드가 지정된 시간 내에 없으면 시작 노드는 해당 노드가 첫 번째 멤버라고 가정하고 코디네이터 상태를 차지합니다.
여러 노드가 동시에 시작되면 여러 파티션이 있는 분할 클러스터를 생성하는 첫 번째 멤버가 있다고 가정합니다. 예를 들어 DeploymentConfig
API를 사용하여 0에서 2개의 Pod로 확장하면 분할 클러스터가 생성될 수 있습니다. 이 상황을 방지하려면 첫 번째 Pod를 시작한 다음 필요한 Pod 수로 확장해야합니다.
기본적으로 JBoss EAP Operator는 Pod 생성을 순서대로 시작하는 StatefulSet
API(즉, 하나씩)를 사용하므로 분할 클러스터를 생성하지 못합니다.
11.6. 기본 상태 점검
OpenShift 이미지용 JBoss EAP는 기본적으로 OpenShift에 포함된 실시간 및 준비 상태 프로브를 구현합니다. 자세한 내용은 OpenShift Container Platform 개발자 가이드의 활성 상태 프로브 및 준비 상태 프로브를 참조하십시오.
다음 표는 이러한 상태 점검을 전달하는 데 필요한 값을 보여줍니다. 상태가 아래 값과 다른 경우 검사에 실패하고 이미지의 재시작 정책에 따라 이미지가 다시 시작됩니다.
11.7. 메시징
11.7.1. 외부 Red Hat AMQ 브로커 구성
외부 Red Hat AMQ 브로커에 연결하기 위해 환경 변수를 사용하여 OpenShift 이미지의 JBoss EAP를 구성할 수 있습니다.
11.8. 보안 도메인
새 보안 도메인을 구성하려면 사용자가 CloudEvent DOMAIN_NAME
환경 변수를 정의해야 합니다.
그러면 환경 변수 뒤에 이름이 지정된 보안 도메인이 생성됩니다. 사용자는 다음 환경 변수를 정의하여 도메인을 사용자 지정할 수도 있습니다.
표 11.5. 보안 도메인
변수 이름 | 설명 |
---|---|
SECDOMAIN_NAME | 추가 보안 도메인을 정의합니다.
예제 값: |
SECDOMAIN_PASSWORD_STACKING |
정의된 경우
예제 value: |
SECDOMAIN_LOGIN_MODULE | 사용할 로그인 모듈입니다.
기본값은 |
SECDOMAIN_USERS_PROPERTIES | 사용자 정의가 포함된 속성 파일의 이름입니다.
기본값은 |
SECDOMAIN_ROLES_PROPERTIES | 역할 정의가 포함된 속성 파일의 이름입니다.
기본값은 |
11.9. HTTPS 환경 변수
변수 이름 | 설명 |
---|---|
HTTPS_NAME |
예제 값: |
HTTPS_PASSWORD |
예제 값: |
HTTPS_KEYSTORE |
값 예: |
11.10. 관리 환경 변수
표 11.6. 관리 환경 변수
변수 이름 | 설명 |
---|---|
ADMIN_USERNAME |
이 및
예제 값: Cryo |
ADMIN_PASSWORD |
지정된
예제 값: |
11.11. S2I
이미지에는 S2I 스크립트와 Maven이 포함됩니다. Maven은 현재 OpenShift의 JBoss EAP 기반 컨테이너(또는 관련/하위 이미지)에 배포되어야 하는 애플리케이션의 빌드 도구로만 지원됩니다.
현재 WAR 배포만 지원됩니다.
11.11.1. 사용자 정의 설정
이미지에 대한 사용자 지정 구성 파일을 추가할 수 있습니다. configuration/
디렉토리에 배치된 모든 파일이 EAP_HOME/standalone/configuration/
에 복사됩니다. 예를 들어 이미지에 사용되는 기본 구성을 재정의하려면 사용자 지정 standalone.xml
을 configuration/
디렉터리에 추가하기만 하면 됩니다. 이러한 배포 예제는 예제를 참조하십시오.
11.11.1.1. 사용자 정의 모듈
사용자 지정 모듈을 추가할 수 있습니다. modules/
디렉터리의 모든 파일이 EAP_HOME/modules/
에 복사됩니다. 이러한 배포 예제는 예제를 참조하십시오.
11.11.2. 배포 Artifacts
기본적으로 소스 대상
디렉터리의 아티팩트가 배포됩니다. 다른 디렉터리에서 배포하려면 BuildConfig 정의에 ARTIFACT_DIR
환경 변수를 설정합니다. ARTIFACT_DIR
은 쉼표로 구분된 목록입니다. 예: ARTIFACT_DIR=app1/target,app2/target,app3/target
11.11.3. 아티팩트 저장소 미러
Maven의 리포지토리에는 다양한 유형의 빌드 아티팩트 및 종속성(예: 모든 프로젝트 JAR, 라이브러리 JAR, 플러그인 또는 기타 프로젝트별 아티팩트)이 있습니다. S2I 빌드를 수행하는 동안 아티팩트를 다운로드할 위치도 지정합니다. 중앙 리포지토리를 사용하는 것 외에도 조직에서 로컬 사용자 정의 미러 저장소를 배포하는 것이 일반적인 방법입니다.
미러를 사용하면 다음과 같은 이점이 있습니다.
- 동기화된 미러의 가용성은 지리적으로 더 빠르고 빠릅니다.
- 리포지토리 콘텐츠를 보다 효과적으로 제어할 수 있는 기능.
- 공용 서버 및 리포지토리에 의존할 필요 없이 다양한 팀(개발자, CI)에서 아티팩트를 공유할 수 있습니다.
- 빌드 시간이 개선되었습니다.
종종 저장소 관리자는 미러에 대한 로컬 캐시 역할을 할 수 있습니다. 리포지토리 관리자가 이미 배포되어 https://10.0.0.1:8443/repository/internal/
에서 외부에서 연결할 수 있다고 가정하면 S2I 빌드는 다음과 같이 애플리케이션의 빌드 구성에 MAVEN_MIRROR_URL
환경 변수를 제공하여 이 관리자를 사용할 수 있습니다.
MAVEN_MIRROR_URL
변수를 적용할 빌드 구성의 이름을 식별합니다.oc get bc -o name buildconfig/eap
MAVEN_MIRROR_URL
환경 변수를 사용하여 build 구성을 업데이트합니다.oc env bc/eap MAVEN_MIRROR_URL="https://10.0.0.1:8443/repository/internal/" buildconfig "eap" updated
설정을 확인합니다.
oc env bc/eap --list # buildconfigs eap MAVEN_MIRROR_URL=https://10.0.0.1:8443/repository/internal/
- 애플리케이션의 새 빌드를 예약합니다.
애플리케이션 빌드 중에 Maven 종속성은 기본 공용 리포지토리가 아니라 리포지토리 관리자에서 가져옵니다. 또한 빌드가 완료되면 빌드 중에 검색 및 사용된 모든 종속 항목으로 미러가 채워집니다.
11.11.3.1. 보안 아티팩트 저장소 미러 URL
Maven 리포지토리를 통해 "man-in-the-middle" 공격을 방지하려면 JBoss EAP에서 아티팩트 리포지토리 미러 URL에 대한 보안 URL을 사용해야 합니다.
URL은 보안 http("https") 및 보안 포트를 지정해야 합니다.
기본적으로 비보안 URL을 지정하면 오류가 반환됩니다. -Dinsecure.repositories=WARN
속성을 사용하여 이 동작을 재정의할 수 있습니다.
11.11.4. 스크립트
run
-
이 스크립트는
standalone.xml
구성으로 JBoss EAP를 구성하고 시작하는openshift-launch.sh
스크립트를 사용합니다. assemble
-
이 스크립트는 Maven을 사용하여 소스를 빌드하고 패키지(WAR)를 생성한 다음
EAP_HOME/standalone/deployments
디렉터리로 이동합니다.
11.11.5. 사용자 지정 스크립트
JBoss EAP가 시작되기 전에 포드를 시작할 때 실행할 사용자 지정 스크립트를 추가할 수 있습니다.
CLI 스크립트를 포함하여 Pod를 시작할 때 실행할 유효한 스크립트를 추가할 수 있습니다.
이미지에서 JBoss EAP를 시작할 때 스크립트를 포함하여 두 가지 옵션을 사용할 수 있습니다.
- postconfigure.sh로 실행할 configmap을 마운트합니다.
- nominated 설치 디렉터리에 install.sh 스크립트를 추가합니다.
11.11.5.1. 사용자 정의 스크립트를 실행하기 위한 configmap 마운트
런타임 시 사용자 지정 스크립트를 기존 이미지(즉, 이미 빌드된 이미지)에 마운트하려는 경우 configmap을 마운트합니다.
configmap을 마운트하려면 다음을 수행합니다.
postconfigure.sh에 포함할 콘텐츠로 configmap을 생성합니다.
예를 들어 프로젝트 루트 디렉터리에
확장
이라는 디렉터리를 생성하여postconfigure.sh
및extensions.cli
스크립트를 포함하고 다음 명령을 실행합니다.$ oc create configmap jboss-cli --from-file=postconfigure.sh=extensions/postconfigure.sh --from-file=extensions.cli=extensions/extensions.cli
배포 컨트롤러(dc)를 통해 configmap을 Pod에 마운트합니다.
$ oc set volume dc/eap-app --add --name=jboss-cli -m /opt/server/extensions -t configmap --configmap-name=jboss-cli --default-mode='0755' --overwrite
postconfigure.sh
예
#!/usr/bin/env bash set -x echo "Executing postconfigure.sh" $JBOSS_HOME/bin/jboss-cli.sh --file=$JBOSS_HOME/extensions/extensions.cli
extensions.cli
의 예
embed-server --std-out=echo --server-config=standalone.xml :whoami quit
11.11.5.2. install.sh를 사용하여 사용자 지정 스크립트 실행
빌드 시 스크립트를 이미지의 일부로 포함하려면 install.sh를 사용합니다.
install.sh를 사용하여 사용자 정의 스크립트를 실행하려면 다음을 수행합니다.
-
s2i 빌드 중에 사용할 프로젝트의 git 리포지토리에서
.s2i
라는 디렉터리를 생성합니다. s2i
디렉터리 내에서 다음 콘텐츠를 사용하여 environment라는 파일을 추가합니다.$ cat .s2i/environment CUSTOM_INSTALL_DIRECTORIES=extensions
-
extensions
이라는 디렉터리를 만듭니다. extensions
디렉토리에서 다음과 유사한 콘텐츠를 사용하여 postconfigure.sh 파일을 만듭니다(사용자 환경에 적합한 코드로 자리 표시자 코드를 교체).$ cat extensions/postconfigure.sh #!/usr/bin/env bash echo "Executing patch.cli" $JBOSS_HOME/bin/jboss-cli.sh --file=$JBOSS_HOME/extensions/some-cli-example.cli
extensions 디렉토리에서 다음과 유사한 내용으로 파일 install.sh를 만듭니다 ( 자리 표시자 코드를 환경에 적합한 코드로 교체).
$ cat extensions/install.sh #!/usr/bin/env bash set -x echo "Running $PWD/install.sh" injected_dir=$1 # copy any needed files into the target build. cp -rf ${injected_dir} $JBOSS_HOME/extensions
11.11.6. 환경 변수
환경 변수를 s2i build
명령에 제공하여 빌드 실행 방식에 영향을 미칠 수 있습니다. 제공할 수 있는 환경 변수는 다음과 같습니다.
표 11.7. s2i 환경 변수
변수 이름 | 설명 |
---|---|
ARTIFACT_DIR |
이 디렉터리의
예제 값: |
ENABLE_GENERATE_DEFAULT_DATASOURCE |
선택 사항: 값이 |
GALLEON_PROVISION_LAYERS | 선택 사항: 지정된 계층을 프로비저닝하도록 S2I 프로세스에 지시합니다. 값은 하나의 기본 계층과 임의의 수의 데코레이터 계층을 포함하여 프로비저닝할 쉼표로 구분된 계층 목록입니다.
예제 값: |
GALLEON_PROVISION_CHANNELS |
이는 쉼표로 구분된 JBoss EAP 채널 매니페스트 목록입니다. JBoss EAP 채널 매니페스트는 참고
버전은 선택 사항이므로 최신 채널 매니페스트가 검색됩니다. JBoss EAP 8.0의 경우 이 채널 |
GALLEON_PROVISION_FEATURE_PACKS |
환경 변수를 빌드하여 S2I 이미지의 사용자 지정 Galleon 기능 팩을 지정합니다. 예: 참고
|
HTTP_PROXY_HOST | Maven을 사용할 HTTP 프록시의 호스트 이름 또는 IP 주소입니다.
예제 값: |
HTTP_PROXY_PORT | Maven에서 사용할 HTTP 프록시의 TCP 포트입니다.
값 예: |
HTTP_PROXY_USERNAME |
예제 값: |
HTTP_PROXY_PASSWORD |
예제 값: |
HTTP_PROXY_NONPROXYHOSTS | 제공된 경우 구성된 HTTP 프록시는 이러한 호스트를 무시합니다.
예제 값: |
MAVEN_ARGS | 빌드 중에 Maven에 제공된 인수를 재정의합니다.
예: |
MAVEN_ARGS_APPEND | 빌드 중에 Maven에 제공된 사용자 인수를 추가합니다.
예제 값: |
MAVEN_MIRROR_URL | 구성할 Maven 미러/repository 관리자의 URL입니다.
예제 값: 지정된 URL은 안전해야 합니다. 자세한 내용은 Secure artifact repository 미러 URL을 참조하십시오. |
MAVEN_CLEAR_REPO | 선택적으로 빌드 후 로컬 Maven 리포지토리를 지웁니다. 이미지에 있는 서버가 로컬 캐시에 강하게 연결된 경우 캐시가 삭제되지 않고 경고가 출력됩니다.
예제 value: |
APP_DATADIR | 정의된 경우 데이터 파일이 복사되는 소스의 디렉터리입니다.
예제 값: |
DATA_DIR |
예시 값: |
자세한 내용은 Maven 및 S2I 스크립트를 사용하는 OpenShift Container Platform에서 JBoss EAP 애플리케이션 빌드 및 실행을 참조하십시오.
11.12. 지원되지 않는 트랜잭션 복구 시나리오
- OpenShift에서는 JTS 트랜잭션이 지원되지 않습니다.
- OpenShift에서 XTS 트랜잭션은 지원되지 않습니다.
- 일부 타사에서 트랜잭션 완료 및 충돌 복구 흐름에 사용하는 XATerminator 인터페이스는 OpenShift에서 지원되지 않습니다.
- JBoss Remoting 을 통해 배포되지 않는 트랜잭션은 지원되지 않습니다.
JBoss Remoting 을 통해 전파되는 트랜잭션은 EAP Operator를 사용하여 지원됩니다.
11.13. 포함된 JBoss 모듈
아래 표에는 OpenShift용 JBoss EAP에 JBoss 모듈이 포함되어 있습니다.
표 11.8. 포함된 JBoss 모듈
JBoss 모듈 |
---|
org.jboss.as.clustering.common |
org.jboss.as.clustering.jgroups |
org.jboss.as.ee |
org.jgroups |
org.openshift.ping |
net.oauth.core |
11.14. EAP Operator: API 정보
EAP Operator는 다음 API를 도입합니다.
11.14.1. WildFlyServer
WildFlyServer
는 사용자 지정 JBoss EAP 리소스를 정의합니다.
11.14.2. WildFlyServerList
WildFlyServerList
는 JBoss EAP 배포 목록을 정의합니다.
표 11.10. 표
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
| 표준 목록의 메타데이터 | false | |
|
| true |
11.14.3. WildFlyServerSpec
WildFlyServerSpec
은 JBoss EAP 리소스의 원하는 동작 사양입니다.
/opt/jboss/wildfly/standalone/data에서 스토리지에 지정된 볼륨을 마운트하는 Pod 사양과 함께 StatefulSet
을 사용합니다.
표 11.11. WildFlyServerSpec
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
| 배포할 애플리케이션 이미지의 이름 | string | false |
| 애플리케이션에 필요한 복제본 수 | int32] | true |
|
| false | |
|
Stateful Set의 요청 또는 제한을 지정하는 | false | |
|
Stateful Set에서 생성한 Pod 컨테이너에 대한 권한 및 액세스 제어 설정을 정의하는 security | false | |
|
스토리지 사용 방법을 지정하는 스토리지 사양입니다. 생략하면 | false | |
| JBoss EAP Pod를 실행하는 데 사용할 ServiceAccount의 이름 | string | false |
|
| false | |
| 컨테이너에 존재하는 환경 변수 목록 | false | |
|
컨테이너에 볼륨으로 마운트할 시크릿 이름 목록입니다. 각 보안은 | string | false |
|
컨테이너에 볼륨으로 마운트할 | string | false |
| 애플리케이션 서비스의 HTTP 포트에 대한 경로 생성 비활성화(삭제된 경우 false) | boolean | false |
| 동일한 클라이언트 IP의 연결이 매번 동일한 JBoss EAP 인스턴스/Pod에 전달되는 경우(삭제된 경우 false) | boolean | false |
11.14.4. Resources
리소스는
WildflyServer
리소스에 대해 구성된 리소스를 정의합니다. Resources
필드가 정의되지 않았거나 Request
또는 Limits
가 비어 있으면 이 리소스는 StatefulSet
에서 제거됩니다. 이 리소스에 대한 설명은 표준 컨테이너 리소스 이며
corev1.ResourceRequirements의 스키마를 사용합니다.
11.14.5. StorageSpec
StorageSpec
은 WildFlyServer
리소스에 대해 구성된 스토리지를 정의합니다. EmptyDir
및 volumeClaimTemplate
이 정의되지 않은 경우 기본 EmptyDir
이 사용됩니다.
EAP Operator는 JBoss EAP에서 자체 데이터를 유지하기 위해 사용하는 standalone/data 디렉터리 전용 볼륨을 마운트하기 위해 이 StorageSpec
의 정보를 사용하여 StatefulSet
을 구성합니다. 예를 들어 트랜잭션 로그입니다. EmptyDir
을 사용하는 경우 데이터를 Pod를 다시 시작해도 데이터가 유지되지 않습니다. JBoss EAP에 배포된 애플리케이션이 트랜잭션을 사용하는 경우 Pod를 다시 시작할 때 동일한 영구 볼륨을 재사용할 수 있도록 volumeClaimTemplate
을 지정합니다.
표 11.12. 표
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
|
| false | |
|
JBoss EAP 독립 실행형 데이터 디렉터리를 저장하기 위한 | false |
11.14.6. StandaloneConfigMapSpec
StandaloneConfigMapSpec
은 ConfigMap
에서 JBoss EAP 독립 실행형 구성을 읽을 수 있는 방법을 정의합니다. 생략하면 JBoss EAP는 이미지의 standalone.xml
구성을 사용합니다.
표 11.13. StandaloneConfigMapSpec
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
|
독립 실행형 구성 XML 파일이 포함된 | string | true |
key |
값이 독립 실행형 구성 XML 파일인 | string | false |
11.14.7. WildFlyServerStatus
WildFlyServerStatus
는 JBoss EAP 배포의 가장 최근 관찰된 상태입니다. 읽기 전용입니다.
표 11.14. WildFlyServerStatus
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
| 애플리케이션의 실제 복제본 수 | int32 | true |
| HorizontalPodAutoscaler에서 사용하는 Pod 선택기 | string | true |
| 애플리케이션 HTTP 서비스로 라우팅하는 호스트 | string | true |
| Pod 상태 | true | |
| 축소 프로세스 축소 중인 Pod 수 | int32 | true |
11.14.8. PodStatus
PodStatus
는 JBoss EAP 애플리케이션을 실행하는 Pod의 가장 최근 관찰된 상태입니다.
표 11.15. PodStatus
필드 | 설명 | 스키마 | 필수 항목 |
---|---|---|---|
| Pod 이름 | string | true |
| Pod에 할당된 IP 주소 | string | true |
| 축소 프로세스의 Pod 상태. 상태는 기본적으로 ACTIVE이며, 이는 요청을 제공하는 것을 의미합니다. | string | false |
2024-02-08에 최종 업데이트된 문서