8.7. 클러스터링
8.7.1. systemtap 검색 Mechanism 구성
OpenShift에서 JBoss EAP 클러스터링을 활성화하려면 kubernetes.KUBE_PING 또는
검색 메커니즘을 사용하도록 JBoss EAP 구성에서 JGroups 프로토콜 스택을 구성합니다.
dns.DNS_PING
사용자 지정 standalone-openshift.xml
구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 JGroups를 구성하는 것이 좋습니다.
아래 지침에서는 환경 변수를 사용하여 OpenShift 이미지에 대한 JBoss EAP의 검색 메커니즘을 구성합니다.
사용 가능한 애플리케이션 템플릿 중 하나를 사용하여 OpenShift 이미지용 JBoss EAP에 애플리케이션을 배포하는 경우 기본 검색 메커니즘은 dns.DNS_PING
입니다.
dns.DNS_PING
및 kubernetes.KUBE_PING
검색 메커니즘은 서로 호환되지 않습니다. 검색에 dns.DNS_PING 메커니즘을 사용하고 다른 하나는
메커니즘을 사용하여 두 개의 독립 하위 클러스터로 슈퍼 클러스터를 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 및 대상 클러스터 모두에서 검색 메커니즘이 동일해야 합니다.
kubernetes.KUBE_PING
8.7.1.1. KUBE_PING 구성
KUBE_PING
JGroups 검색 메커니즘을 사용하려면 다음을 수행합니다.
JGroups 프로토콜 스택은 검색 메커니즘으로
KUBE_PING
을 사용하도록 구성해야 합니다.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에 액세스할 수 있도록 포드가 에서 실행되고 있는 서비스 계정에 권한 부여를 부여해야 합니다. OpenShift CLI를 사용하여 수행합니다. 다음 예제에서는 현재 프로젝트의 네임스페이스에 있는
default
서비스 계정을 사용합니다.oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
프로젝트 네임스페이스에서
eap-service-account
사용:oc policy add-role-to-user view system:serviceaccount:$(oc project -q):eap-service-account -n $(oc project -q)
참고서비스 계정에 정책 추가에 대한 자세한 내용은 OpenShift for Application Deployment 를 참조하십시오.
8.7.1.2. DNS_PING 구성
DNS_PING
JGroups 검색 메커니즘을 사용하려면 다음을 수행합니다.
JGroups 프로토콜 스택은 검색 메커니즘으로
DNS_PING
을 사용하도록 구성해야 합니다.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 릴리스에서 작동하는지 확인합니다. - 이러한 주석을 생략하면 각 노드가 시작하는 동안 자체 "한 개의 클러스터"를 형성하게 됩니다. 그런 다음 각 노드는 시작 후 다른 노드가 시작될 때까지 탐지되지 않으므로 클러스터를 다른 노드의 클러스터에 병합합니다.
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
는 서비스 계정을 수정할 필요가 없으며 기본 권한을 사용하여 작동합니다.
8.7.2. 클러스터 트래픽을 암호화하도록 JGroups 구성
OpenShift에서 JBoss EAP의 클러스터 트래픽을 암호화하려면 SYM_ENCRYPT 또는
프로토콜을 사용하도록 JBoss EAP 구성에서 JGroups 프로토콜 스택을 구성해야 합니다.
ASYM_ENCRYPT
사용자 지정 standalone-openshift.xml
구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 JGroups를 구성하는 것이 좋습니다.
아래 지침에서는 환경 변수를 사용하여 OpenShift 이미지의 JBoss EAP에 대한 클러스터 트래픽 암호화에 대한 프로토콜을 구성합니다.
SYM_ENCRYPT
및 ASYM_ENCRYPT
프로토콜은 서로 호환되지 않습니다. 클러스터 트래픽 암호화에 SYM_ENCRYPT 프로토콜을 사용하고 다른 하나는
프로토콜을 사용하여 두 개의 독립 하위 클러스터로 슈퍼 클러스터를 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 클러스터와 대상 클러스터 모두에서 프로토콜이 동일해야 합니다.
ASYM_ENCRYPT
8.7.2.1. SYM_ENCRYPT 구성
SYM_ENCRYPT
프로토콜을 사용하여 JGroups 클러스터 트래픽을 암호화하려면 다음을 수행합니다.
SYM_ENCRYPT
를 암호화 프로토콜로 사용하도록 JGroups 프로토콜 스택을 구성해야 합니다.JGROUPS_ENCRYPT_PROTOCOL 환경 변수를
로 설정하여 이 작업을 수행할 수 있습니다.SYM_ENCRYPT
JGROUPS_ENCRYPT_PROTOCOL=SYM_ENCRYPT
JGROUPS_ENCRYPT_SECRET
환경 변수는 JGroups 통신 보안에 사용되는 JGroups 키 저장소 파일이 포함된 시크릿 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_SECRET=eap7-app-secret
JGROUPS_ENCRYPT_KEYSTORE_DIR
환경 변수는JGROUPS_ENCRYPT_SECRET
변수를 통해 지정한 시크릿 내의 키 저장소 파일의 디렉터리 경로로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_KEYSTORE_DIR=/etc/jgroups-encrypt-secret-volume
JGROUPS_ENCRYPT_KEYSTORE
환경 변수는JGROUPS_ENCRYPT_SECRET
변수를 통해 지정한 시크릿 내의 키 저장소 파일 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceks
JGROUPS_ENCRYPT_NAME
환경 변수는 서버의 인증서와 연결된 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_NAME=jgroups
JGROUPS_ENCRYPT_PASSWORD
환경 변수는 키 저장소 및 인증서에 액세스하는 데 사용되는 암호로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.JGROUPS_ENCRYPT_PASSWORD=mypassword
8.7.2.2. ASYM_ENCRYPT 구성
JBoss EAP 7.4에는 ASYM_ENCRYPT
프로토콜의 새 버전이 포함되어 있습니다. 이전 버전의 프로토콜은 더 이상 사용되지 않습니다. JGROUPS_CLUSTER_PASSWORD
환경 변수를 지정하면 더 이상 사용되지 않는 프로토콜 버전이 사용되며 경고가 Pod 로그에 출력됩니다.
ASYM_ENCRYPT
프로토콜을 사용하여 JGroups 클러스터 트래픽을 암호화하려면 암호화 프로토콜로 ASYM_ENCRYPT
를 지정하고 elytron
하위 시스템에 구성된 키 저장소를 사용하도록 구성합니다.
-e JGROUPS_ENCRYPT_PROTOCOL="ASYM_ENCRYPT" \ -e JGROUPS_ENCRYPT_SECRET="encrypt_secret" \ -e JGROUPS_ENCRYPT_NAME="encrypt_name" \ -e JGROUPS_ENCRYPT_PASSWORD="encrypt_password" \ -e JGROUPS_ENCRYPT_KEYSTORE="encrypt_keystore" \ -e JGROUPS_CLUSTER_PASSWORD="cluster_password"
8.7.3. Pod 확장 고려 사항
ServiceAccount의 검색 메커니즘에 따라 시작 노드는 기존 클러스터 조정기 노드를 검색합니다. 지정된 시간 초과 내에 조정된 노드가 없는 경우 시작 노드는 첫 번째 멤버이고 coordinator 상태를 사용합니다.
여러 노드가 동시에 시작되면 모두 첫 번째 멤버가 될 것으로 가정하여 여러 파티션이 있는 분할 클러스터를 만듭니다. 예를 들어 DeploymentConfig
API를 사용하여 Pod를 0에서 2개로 확장하면 분할 클러스터가 생성될 수 있습니다. 이러한 상황을 방지하려면 첫 번째 Pod를 시작한 다음 필요한 Pod 수로 확장해야합니다.
기본적으로 EAP Operator는 Pod를 순서대로 시작하는 StatefulSet
API를 사용하므로 하나씩 분할 클러스터가 생성되지 않습니다.