8.7. 集群
8.7.1. 配置 JGroups Discovery Mechanism 复制链接链接已复制到粘贴板!
要在 OpenShift 上启用 JBoss EAP 集群,请将 JBoss EAP 配置中的Groups 协议堆栈配置为使用 kubernetes.KUBE_PING 或 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
JGROUPS_PING_PROTOCOL=kubernetes.KUBE_PINGCopy to Clipboard Copied! Toggle word wrap Toggle overflow KUBERNETES_NAMESPACE环境变量必须设置为 OpenShift 项目名称。如果没有设置,则服务器的行为为一个单节点集群(一个"集群")。例如:KUBERNETES_NAMESPACE=PROJECT_NAME
KUBERNETES_NAMESPACE=PROJECT_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 应设置
KUBERNETES_LABELS环境变量。这应当 与服务级别 中设置的标签匹配。如果没有设置,则应用程序外部的 pod(位于您的命名空间中)将尝试加入。例如:KUBERNETES_LABELS=application=APP_NAME
KUBERNETES_LABELS=application=APP_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 必须授权授予在 下运行 Pod 的服务帐户,以允许访问 Kubernetes 的 REST API。这可通过 OpenShift CLI 完成。以下示例使用当前项目命名空间中的
default服务帐户:oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在项目命名空间中使用
eap-service-account:oc policy add-role-to-user view system:serviceaccount:$(oc project -q):eap-service-account -n $(oc project -q)
oc policy add-role-to-user view system:serviceaccount:$(oc project -q):eap-service-account -n $(oc project -q)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如需有关向服务帐户添加策略的更多信息,请参阅为 应用程序部署准备 OpenShift。
8.7.1.2. 配置 DNS_PING 复制链接链接已复制到粘贴板!
使用 DNS_PING JGroups 发现机制:
JGroups 协议堆栈必须配置为使用
DNS_PING作为发现机制。您可以将
JGROUPS_PING_PROTOCOL环境变量设置为dns.DNS_PING:JGROUPS_PING_PROTOCOL=dns.DNS_PING
JGROUPS_PING_PROTOCOL=dns.DNS_PINGCopy to Clipboard Copied! Toggle word wrap Toggle overflow OPENSHIFT_DNS_PING_SERVICE_NAME环境变量必须设置为集群的 ping 服务名称。OPENSHIFT_DNS_PING_SERVICE_NAME=PING_SERVICE_NAME
OPENSHIFT_DNS_PING_SERVICE_NAME=PING_SERVICE_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow OPENSHIFT_DNS_PING_SERVICE_PORT环境变量应设置为公开 ping 服务的端口号。DNS_PING协议尝试从 SRV 记录中识别端口,否则默认为8888。OPENSHIFT_DNS_PING_SERVICE_PORT=PING_PORT
OPENSHIFT_DNS_PING_SERVICE_PORT=PING_PORTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 必须定义公开 ping 端口的 ping 服务。这个服务应该是无头(ClusterIP=None),且必须具有以下内容:
- 端口必须命名为。
该服务必须注解为
service.alpha.kubernetes.io/tolerate-unready-endpoints和publishNotReadyAddresses属性,两者均设置为true。注意-
使用
service.alpha.kubernetes.io/tolerate-unready-endpoints和publishNotReadyAddresses属性来确保 ping 服务在两个更新的 OpenShift 版本中正常工作。 - 省略这些注解会导致每个节点在启动过程中组成自己的"集群"。然后,每个节点会在启动时将其集群合并到其他节点的集群,因为其他节点在启动后不会检测到它们。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
DNS_PING 不需要对服务帐户进行任何修改,并使用默认权限工作。
8.7.2. 配置 JGroups 以加密集群流量 复制链接链接已复制到粘贴板!
要在 OpenShift 上为 JBoss EAP 加密集群流量,您必须在 JBoss EAP 配置中配置 JGroups 协议堆栈,以使用 SYM_ENCRYPT 或 ASYM_ENCRYPT 协议。
虽然您可以使用自定义 standalone-openshift.xml 配置文件,但建议您使用环境变量在镜像构建中配置 JGroups。
以下说明使用环境变量来配置用于 OpenShift 镜像的 JBoss EAP 集群流量加密的协议。
SYM_ENCRYPT 和 ASYM_ENCRYPT 协议不相互兼容。无法将超级集群从两个独立的子集群组成,并有一个使用 SYM_ENCRYPT 协议加密集群流量,然后使用 ASYM_ENCRYPT 协议。同样,当执行滚动升级时,源和目标集群的协议需要相同。
8.7.2.1. Configuring SYM_ENCRYPT 复制链接链接已复制到粘贴板!
使用 SYM_ENCRYPT 协议加密 JGroups 集群流量:
JGroups 协议堆栈必须配置为使用
SYM_ENCRYPT作为加密协议。您可以将
JGROUPS_ENCRYPT_PROTOCOL环境变量设置为SYM_ENCRYPT:JGROUPS_ENCRYPT_PROTOCOL=SYM_ENCRYPT
JGROUPS_ENCRYPT_PROTOCOL=SYM_ENCRYPTCopy to Clipboard Copied! Toggle word wrap Toggle overflow JGROUPS_ENCRYPT_SECRET环境变量必须设置为包含用于保护 JGroups 通讯的机密名称。如果没有设置,集群通信不会加密,并发出警告。例如:JGROUPS_ENCRYPT_SECRET=eap7-app-secret
JGROUPS_ENCRYPT_SECRET=eap7-app-secretCopy to Clipboard Copied! Toggle word wrap Toggle overflow JGROUPS_ENCRYPT_KEYSTORE_DIR环境变量必须设置为通过JGROUPS_ENCRYPT_SECRET变量指定的 secret 中密钥存储文件的目录路径。如果没有设置,集群通信不会加密,并发出警告。例如:JGROUPS_ENCRYPT_KEYSTORE_DIR=/etc/jgroups-encrypt-secret-volume
JGROUPS_ENCRYPT_KEYSTORE_DIR=/etc/jgroups-encrypt-secret-volumeCopy to Clipboard Copied! Toggle word wrap Toggle overflow JGROUPS_ENCRYPT_KEYSTORE环境变量必须设置为通过JGROUPS_ENCRYPT_SECRET变量指定的 secret 内的密钥存储文件的名称。如果没有设置,集群通信不会加密,并发出警告。例如:JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceks
JGROUPS_ENCRYPT_KEYSTORE=jgroups.jceksCopy to Clipboard Copied! Toggle word wrap Toggle overflow JGROUPS_ENCRYPT_NAME环境变量必须设置为与服务器证书关联的名称。如果没有设置,集群通信不会加密,并发出警告。例如:JGROUPS_ENCRYPT_NAME=jgroups
JGROUPS_ENCRYPT_NAME=jgroupsCopy to Clipboard Copied! Toggle word wrap Toggle overflow JGROUPS_ENCRYPT_PASSWORD环境变量必须设置为用于访问密钥存储和证书的密码。如果没有设置,集群通信不会加密,并发出警告。例如:JGROUPS_ENCRYPT_PASSWORD=mypassword
JGROUPS_ENCRYPT_PASSWORD=mypasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.7.2.2. Configuring ASYM_ENCRYPT 复制链接链接已复制到粘贴板!
JBoss EAP 7.4 包含 ASYM_ENCRYPT 协议的新版本。以前版本的协议已弃用。如果指定了 JGROUPS_CLUSTER_PASSWORD 环境变量,则会使用已弃用的协议版本,并在 pod 日志中打印警告。
要使用 ASYM_ENCRYPT 协议加密 JGroups 集群流量,请指定 ASYM_ENCRYPT 作为加密协议,并将它配置为使用 elytron 子系统中配置的密钥存储。
8.7.3. 扩展 pod 的注意事项 复制链接链接已复制到粘贴板!
根据 JGroups 中的发现机制,启动节点将搜索现有集群协调器节点。如果在给定超时内找不到协调器节点,则起始节点会假定它是第一个成员,它会占用协调器状态。
当多个节点同时启动时,它们都假定第一个成员为第一个成员,从而导致使用多个分区的分割集群。例如,使用 DeploymentConfig API 扩展从 0 到 2 个 pod 可能会导致分割集群创建。为避免这种情况,您需要启动第一个 pod,然后再扩展至所需 pod 数量。
默认情况下,EAP Operator 使用 StatefulSet API,按顺序启动 pod,即逐个启动 pod,从而防止创建拆分集群。