Apache Ignite服务端模式Kubernetes部署节点不通配置问题排查
Ignite Kubernetes集群发现失败问题解决方案
核心代码错误
你在Kubernetes发现逻辑中创建的KubernetesConnectionConfiguration配置未绑定到IP Finder实例,是导致报错的直接原因:
你在kubernetesDiscovery方法中实例化了KubernetesConnectionConfiguration,设置了命名空间和服务名state-manager,但完全没有将这个配置对象注入到TcpDiscoveryKubernetesIpFinder中,导致IP Finder使用默认配置(默认服务名为ignite)去查询Kubernetes API,所以报错中显示访问的是endpoints/ignite,和你实际的服务名不符,自然返回404找不到资源。
修正后的kubernetesDiscovery方法代码:
private TcpDiscoverySpi kubernetesDiscovery(IgniteProps igniteProps) { log.info("++ creating k8s based discovery, {}", igniteProps); TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryKubernetesIpFinder k8sIpFinder = new TcpDiscoveryKubernetesIpFinder(); KubernetesConnectionConfiguration kubernetesConnectionConfiguration = new KubernetesConnectionConfiguration(); kubernetesConnectionConfiguration.setNamespace("default"); kubernetesConnectionConfiguration.setServiceName("state-manager"); // 缺失的绑定逻辑 k8sIpFinder.setConnectionConfiguration(kubernetesConnectionConfiguration); spi.setIpFinder(k8sIpFinder); log.info("++ creating k8s based discovery, {}", spi); return spi; }
配套Kubernetes配置要求
除代码修正外,K8s侧还需要满足两个必要条件:
- 必须部署Headless类型的Service绑定Ignite Pod:普通Service不会暴露Pod IP到Endpoints列表,需要设置
spec.clusterIP: None,且服务名要和代码里配置的state-manager完全一致 - 必须配置RBAC权限:Ignite需要调用Kubernetes API查询Endpoints资源,所以需要给Pod使用的ServiceAccount绑定对应权限,参考配置如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: ignite-endpoint-reader rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: ignite-read-endpoints namespace: default subjects: - kind: ServiceAccount name: 你的Pod使用的ServiceAccount名 roleRef: kind: Role name: ignite-endpoint-reader apiGroup: rbac.authorization.k8s.io
其他配置问题
你代码里注册了两次EVT_NODE_JOINED事件监听器,第二个监听节点离开的逻辑应该监听EventType.EVT_NODE_LEFT事件,否则不会触发节点离开后的对应逻辑。
内容的提问来源于stack exchange,提问作者vvra
相关产品推荐
相关产品推荐

