可以将多个Hazelcast实例嵌入部署在单个POD中的应用程序中。然后,您可以控制集群的形成方式。它需要额外的配置,但您不必修改
HazelcastKubernetesDiscoveryStrategy
.
示例应用程序
我创建了一个示例应用程序来演示它是如何工作的。请在这里检查:
https://github.com/leszko/hazelcast-code-samples/tree/kubernetes-embedded-multiple/hazelcast-integration/kubernetes/samples/embedded
配置步骤
应用程序中有两个Hazelcast实例,因此需要指定它们使用的端口。同时,利用
hazelcast-kubernetes
插件,您可以配置哪些Hazelcast实例一起构成集群。
例如,假设第一个Hazelcast实例应该与当前Kubernetes命名空间中的所有其他Hazelcast实例形成一个集群,那么它的配置可以如下所示。
Config config = new Config();
config.getNetworkConfig().setPort(5701);
config.getProperties().setProperty("hazelcast.discovery.enabled", "true");
JoinConfig joinConfig = config.getNetworkConfig().getJoin();
joinConfig.getMulticastConfig().setEnabled(false);
HazelcastKubernetesDiscoveryStrategyFactory discoveryStrategyFactory = new HazelcastKubernetesDiscoveryStrategyFactory();
Map<String, Comparable> properties = new HashMap<>();
joinConfig.getDiscoveryConfig().addDiscoveryStrategyConfig(new DiscoveryStrategyConfig(discoveryStrategyFactory, properties));
然后,第二个Hazelcast实例只能使用相同的应用程序组成集群。我们可以通过给它一个
service-name
参数的值。
Config config = new Config();
config.getNetworkConfig().setPort(5702);
config.getProperties().setProperty("hazelcast.discovery.enabled", "true");
JoinConfig joinConfig = config.getNetworkConfig().getJoin();
joinConfig.getMulticastConfig().setEnabled(false);
HazelcastKubernetesDiscoveryStrategyFactory discoveryStrategyFactory = new HazelcastKubernetesDiscoveryStrategyFactory();
Map<String, Comparable> properties = new HashMap<>();
String serviceName = System.getenv("KUBERNETES_SERVICE_NAME");
properties.put("service-name", serviceName);
properties.put("service-port", "5702");
joinConfig.getDiscoveryConfig().addDiscoveryStrategyConfig(new DiscoveryStrategyConfig(discoveryStrategyFactory, properties));
GroupConfig groupConfig = new GroupConfig("separate");
Kubernetes模板
然后,在Kubernetes部署模板中,需要配置两个端口:
5701
和
5702
ports:
- containerPort: 5701
- containerPort: 5702
以及具有服务名称的环境变量:
env:
- name: KUBERNETES_SERVICE_NAME
value: hazelcast-separate-1
另外,您需要为每个Hazelcast实例创建两个服务。
kind: Service
metadata:
name: hazelcast-shared-1
spec:
type: ClusterIP
selector:
app: hazelcast-app
ports:
- name: hazelcast-shared
port: 5701
kind: Service
metadata:
name: hazelcast-separate-1
spec:
type: ClusterIP
selector:
app: hazelcast-app
ports:
- name: hazelcast-separate
port: 5702
显然,以同样的方式,您可以使用服务标签而不是服务名称来分离Hazelcast集群。