kubernetes 分布式系统的唯一标识符:Kuberbetes状态集

e5nszbig  于 2023-01-29  发布在  Kubernetes
关注(0)|答案(2)|浏览(114)

我正在使用springboot微服务和Kubernetes进行应用程序开发和部署。我们正在使用有状态集进行部署。我们需要生成唯一标识符,以便在跨集群节点部署的pod服务中使用。
我正在使用twitter雪花格式生成具有K8s状态集的唯一ID。格式:64位java长:1位保留+ 41位时间戳+ 10位节点ID + 12位计数器
这是一个简单的问题,如果我们谈论说5个副本部署在同一集群(跨不同节点)。我可以很容易地生成唯一的orderId,将作为nodeId以上格式。但当我部署在多个集群上的pod,它复制nodeId,因为它生成了类似的顺序跨集群。
示例:单个群集中的5个复制副本创建的pod如下:服务-0、服务-1、服务-2、服务-3服务-4
我可以得到唯一的pod编号(0,1,2,3...),它将作为我的uniqueId生成器中的nodeId,因此我可以得到一个唯一的标识符。但是如果我将应用程序(通过有状态集)部署到2个集群,它也会在第二个集群中生成类似的服务:
服务-0、服务-1、服务-2、服务-3服务-4
现在,如果我的GLB在2集群中的10个荚上随机地路由我的呼叫,则生成重复的唯一ID(对于在相同毫秒期间进行的呼叫)的概率相当高,因此我的解决方案可能不起作用。
需要输入如何解决问题。任何帮助将不胜感激

xwbd5t1u

xwbd5t1u1#

Hi WhizKid我可以给予一个解决方法,尝试将您的群集名称包含在命名约定中(例如:cluster 1-service-0),而不是仅仅使用nodeID。由于我们现在已经为每个集群生成了唯一的ID,即使它们位于相同的节点或相同的服务器上,也不会成为问题。希望这对您有所帮助。

8ftvxx2r

8ftvxx2r2#

感谢所有的建议。我们找到了一种从代码中检索集群ID的方法。我们在Jules文件中设置集群ID(因为使用jules部署到Kubernetes),然后在部署中使用集群变量。这样我们就可以在代码中检索集群名称。类似于:

Deployment.yml:
......
          env:
            - name: INFO_KUBE_ENV
              value: ${environment}
            - name: INFO_KUBE_CLUSTER
              value: ${cluster}

然后在如下代码中使用环境变量INFO_KUBE_CLUSTER:

System.getenv("INFO_KUBE_CLUSTER")

相关问题