簡體   English   中英

分布式系統的唯一標識符:Kuberbetes stateful set

[英]Unique identifiers for distributed systems: Kuberbetes stateful set

我正在使用 springboot 微服務和 Kube.netes 進行應用程序開發和部署。 我們正在使用有狀態集進行部署。 我們需要生成唯一標識符,這些標識符可用於跨集群部署在節點上的跨 Pod 的服務。

我正在使用 twitter 雪花格式來生成具有 K8s 狀態集的唯一 ID。 格式:64 bit java long:1 bit reserved + 41 bit timestamp + 10 bits nodeId + 12 bits counter

如果我們談論的是部署在同一個集群(跨不同節點)上的 5 個副本,這是一個很容易解決的問題。 我可以輕松生成唯一的 orderId,它將作為上述格式的 nodeId。 但是當我在多個集群上部署 pod 時,它會復制 nodeIds,因為它在集群中生成了相似的訂單。

示例:單個集群中的 5 個副本創建如下 Pod:service-0、service-1、service-2、service-3 service-4

我可以獲得唯一的 pod 編號 (0,1,2,3..),它們將在我的 uniqueId 生成器中用作 nodeId,因此我可以派生一個唯一的標識符。 但是如果我將應用程序(通過有狀態集)部署到 2 個集群,它也會在第二個集群中生成類似的服務:

服務 0、服務 1、服務 2、服務 3 服務 4

現在,如果我的 GLB 將我的呼叫隨機路由到 2 集群中的 10 個 pod,則生成重復的唯一 ID(對於在同一毫秒內進行的呼叫)的可能性非常高,因此我的解決方案可能不起作用。

需要關於如何解決問題的意見。 任何幫助將不勝感激

您好WhizKid我可以嘗試將您的集群名稱包括在命名約定中(例如:cluster1-service-0),而不是僅僅使用 nodeID。 由於我們現在已經為每個集群生成了唯一的 ID,即使它們位於相同的節點或相同的服務器上,也不會成為問題。 希望這對你有幫助。

感謝所有的建議。 我們想出了一種從代碼中檢索集群 ID 的方法。 我們在 Jules 文件中設置集群 ID(因為使用 jules 部署到 Kube.netes),然后在部署中使用集群變量。 這樣我們就可以在代碼中檢索集群名稱。 是這樣的:

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

然后在代碼中使用環境變量 INFO_KUBE_CLUSTER,如下所示:

System.getenv("INFO_KUBE_CLUSTER")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM