【问题标题】:Is there any less hacky way of passing an Ordinal Index to StatefulSet environment variable?将 Ordinal Index 传递给 StatefulSet 环境变量是否有更简单的方法?
【发布时间】:2019-05-24 01:40:02
【问题描述】:

我正在尝试运行 zookeeper 合奏,但在将唯一 ID 作为环境变量 ZOO_MY_ID 传递时遇到问题,这是官方 zookeeper 图像发现 here 的要求。

我已尝试阅读此内容并发现类似的溢出问题,但似乎没有一个有效。

kubernetes statefulsets index/ordinal exposed in template Is there a way to get ordinal index of a pod with in kubernetes statefulset configuration file?

由于某种原因,我仍然看到所有服务器的 ID 都是默认 ID 1

2019-05-24 01:38:31,648 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@847] - Notification time out: 60000
2019-05-24 01:38:31,649 [myid:1] - INFO  [WorkerSender[myid=1]:QuorumCnxManager@347] - Have smaller server identifier, so dropping the connection: (2, 1)
2019-05-24 01:38:31,649 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection@595] - Notification: 1 (message format version), 1 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x0 (n.peerEpoch) LOOKING (my state)
2019-05-24 01:38:31,649 [myid:1] - INFO  [/0.0.0.0:3888:QuorumCnxManager$Listener@743] - Received connection request /10.24.1.64:37382
2019-05-24 01:38:31,650 [myid:1] - WARN  [RecvWorker:1:QuorumCnxManager$RecvWorker@1025] - Connection broken for id 1, my id = 1, error = 
java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:392)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.run(QuorumCnxManager.java:1010)
2019-05-24 01:38:31,651 [myid:1] - WARN  [RecvWorker:1:QuorumCnxManager$RecvWorker@1028] - Interrupting SendWorker

运行以下命令显示没有传递任何 ID,但是我使用的是此处显示的 hacky 方式:https://stackoverflow.com/a/48086813/5813215

kubectl exec -it zoo-2 -n kafka-dev printenv | grep "ZOO_"

ZOO_USER=zookeeper
ZOO_CONF_DIR=/conf
ZOO_DATA_DIR=/data
ZOO_DATA_LOG_DIR=/datalog
ZOO_LOG_DIR=/logs
ZOO_PORT=2181
ZOO_TICK_TIME=2000
ZOO_INIT_LIMIT=5
ZOO_SYNC_LIMIT=2
ZOO_AUTOPURGE_PURGEINTERVAL=0
ZOO_AUTOPURGE_SNAPRETAINCOUNT=3
ZOO_MAX_CLIENT_CNXNS=60

【问题讨论】:

  • 您能否提供有关您的 statefulset yaml 配置的更多详细信息?
  • 你可以使用 confimap 传递一个变量吗? 'ZOO_MY_ID=' 只需使用 as env 的 configmap 传递值。
  • 我不能将 ID 作为环境变量传递,因为每个 pod 必须是唯一的。

标签: kubernetes google-kubernetes-engine kubernetes-statefulset


【解决方案1】:

我不确定它是否已解决:

如 StatefulSets 概念中所述,StatefulSet 中的 Pod 具有粘性且唯一的标识。此标识基于 StatefulSet 控制器分配给每个 Pod 的唯一序号索引。

你可以找到一个例子here

例如,您可以修改 statefulSet 规范。通过添加:

   env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name

你可以从中解析出索引。

有关此特定主题的更多信息和讨论,您可以找到here

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    不太确定这有多大用处,但在我的情况下这将适用于 ZooKeeper:

       env:
          - name: POD_ID_OF_STATEFULSET
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
       lifecycle:
          postStart:
             exec:
                command: ["/bin/sh", "-c", "echo ${POD_ID_OF_STATEFULSET##*-} > ${ZOO_DATA_DIR}/myid"]
    

    原来ZOO_MY_ID 所做的唯一事情就是传递给${ZOO_DATA_DIR}/myid 文件。我正在“手动”执行此操作并在入口点之前设置文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 2013-12-29
      • 2019-06-02
      • 2021-09-05
      • 2020-03-27
      • 2017-03-30
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多