8.7. 클러스터링

8.7.1. systemtap 검색 Mechanism 구성

OpenShift에서 JBoss EAP 클러스터링을 활성화하려면 kubernetes.KUBE_PING 또는 dns.DNS_PING 검색 메커니즘을 사용하도록 JBoss EAP 구성에서 JGroups 프로토콜 스택을 구성합니다.

사용자 지정 standalone-openshift.xml 구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 JGroups를 구성하는 것이 좋습니다.

아래 지침에서는 환경 변수를 사용하여 OpenShift 이미지에 대한 JBoss EAP의 검색 메커니즘을 구성합니다.

중요

사용 가능한 애플리케이션 템플릿 중 하나를 사용하여 OpenShift 이미지용 JBoss EAP에 애플리케이션을 배포하는 경우 기본 검색 메커니즘은 dns.DNS_PING 입니다.

dns.DNS_PINGkubernetes.KUBE_PING 검색 메커니즘은 서로 호환되지 않습니다. 검색에 dns.DNS_PING 메커니즘을 사용하고 다른 하나는 kubernetes.KUBE_PING 메커니즘을 사용하여 두 개의 독립 하위 클러스터로 슈퍼 클러스터를 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 및 대상 클러스터 모두에서 검색 메커니즘이 동일해야 합니다.

8.7.1.1. KUBE_PING 구성

KUBE_PING JGroups 검색 메커니즘을 사용하려면 다음을 수행합니다.

  1. JGroups 프로토콜 스택은 검색 메커니즘으로 KUBE_PING 을 사용하도록 구성해야 합니다.

    JGROUPS_PING_PROTOCOL 환경 변수를 kubernetes.KUBE_PING 로 설정하여 이 작업을 수행할 수 있습니다.

    JGROUPS_PING_PROTOCOL=kubernetes.KUBE_PING
  2. KUBERNETES_NAMESPACE 환경 변수를 OpenShift 프로젝트 이름으로 설정해야 합니다. 설정되지 않은 경우 서버는 단일 노드 클러스터("클러스터"로 작동합니다. 예를 들면 다음과 같습니다.

    KUBERNETES_NAMESPACE=PROJECT_NAME
  3. KUBERNETES_LABELS 환경 변수를 설정해야 합니다. 이는 서비스 수준에서 설정된 레이블과 일치해야 합니다. 설정되지 않은 경우 애플리케이션 외부의 Pod(네임스페이스에 있음)가 참여하려고 합니다. 예를 들면 다음과 같습니다.

    KUBERNETES_LABELS=application=APP_NAME
  4. 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 검색 메커니즘을 사용하려면 다음을 수행합니다.

  1. JGroups 프로토콜 스택은 검색 메커니즘으로 DNS_PING 을 사용하도록 구성해야 합니다.

    JGROUPS_PING_PROTOCOL 환경 변수를 dns.DNS_PING 으로 설정하여 이 작업을 수행할 수 있습니다.

    JGROUPS_PING_PROTOCOL=dns.DNS_PING
  2. OPENSHIFT_DNS_PING_SERVICE_NAME 환경 변수는 클러스터의 ping 서비스 이름으로 설정해야 합니다.

    OPENSHIFT_DNS_PING_SERVICE_NAME=PING_SERVICE_NAME
  3. OPENSHIFT_DNS_PING_SERVICE_PORT 환경 변수는 ping 서비스가 노출되는 포트 번호로 설정해야 합니다. DNS_PING 프로토콜은 SRV 레코드에서 포트를 식별하려고 합니다. 그렇지 않으면 기본값은 8888 입니다.

    OPENSHIFT_DNS_PING_SERVICE_PORT=PING_PORT
  4. ping 포트를 노출하는 ping 서비스를 정의해야 합니다. 이 서비스는 헤드리스(ClusterIP=None)여야 하며 다음이 있어야 합니다.

    1. 포트 이름은 이어야 합니다.
    2. 서비스에 service.alpha.kubernetes.io/tolerate-unready-endpointspublishNotReadyAddresses 속성이 모두 true 로 설정되어 있어야 합니다.

      참고
      • service.alpha.kubernetes.io/tolerate-unready-endpointspublishNotReadyAddresses 속성을 모두 사용하여 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 또는 ASYM_ENCRYPT 프로토콜을 사용하도록 JBoss EAP 구성에서 JGroups 프로토콜 스택을 구성해야 합니다.

사용자 지정 standalone-openshift.xml 구성 파일을 사용할 수 있지만 환경 변수를 사용하여 이미지 빌드에서 JGroups를 구성하는 것이 좋습니다.

아래 지침에서는 환경 변수를 사용하여 OpenShift 이미지의 JBoss EAP에 대한 클러스터 트래픽 암호화에 대한 프로토콜을 구성합니다.

중요

SYM_ENCRYPTASYM_ENCRYPT 프로토콜은 서로 호환되지 않습니다. 클러스터 트래픽 암호화에 SYM_ENCRYPT 프로토콜을 사용하고 다른 하나는 ASYM_ENCRYPT 프로토콜을 사용하여 두 개의 독립 하위 클러스터로 슈퍼 클러스터를 구성할 수 없습니다. 마찬가지로 롤링 업그레이드를 수행할 때 소스 클러스터와 대상 클러스터 모두에서 프로토콜이 동일해야 합니다.

8.7.2.1. SYM_ENCRYPT 구성

SYM_ENCRYPT 프로토콜을 사용하여 JGroups 클러스터 트래픽을 암호화하려면 다음을 수행합니다.

  1. SYM_ENCRYPT 를 암호화 프로토콜로 사용하도록 JGroups 프로토콜 스택을 구성해야 합니다.

    JGROUPS_ENCRYPT_PROTOCOL 환경 변수를 SYM_ENCRYPT 로 설정하여 이 작업을 수행할 수 있습니다.

    JGROUPS_ENCRYPT_PROTOCOL=SYM_ENCRYPT
  2. JGROUPS_ENCRYPT_SECRET 환경 변수는 JGroups 통신 보안에 사용되는 JGroups 키 저장소 파일이 포함된 시크릿 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.

    JGROUPS_ENCRYPT_SECRET=eap7-app-secret
  3. JGROUPS_ENCRYPT_KEYSTORE_DIR 환경 변수는 JGROUPS_ENCRYPT_SECRET 변수를 통해 지정한 시크릿 내의 키 저장소 파일의 디렉터리 경로로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.

    JGROUPS_ENCRYPT_KEYSTORE_DIR=/etc/jgroups-encrypt-secret-volume
  4. JGROUPS_ENCRYPT_KEYSTORE 환경 변수는 JGROUPS_ENCRYPT_SECRET 변수를 통해 지정한 시크릿 내의 키 저장소 파일 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.

    JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceks
  5. JGROUPS_ENCRYPT_NAME 환경 변수는 서버의 인증서와 연결된 이름으로 설정해야 합니다. 설정되지 않으면 클러스터 통신이 암호화되지 않고 경고가 실행됩니다. 예를 들면 다음과 같습니다.

    JGROUPS_ENCRYPT_NAME=jgroups
  6. 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를 사용하므로 하나씩 분할 클러스터가 생성되지 않습니다.