4

I'm trying to run a zookeeper ensemble and am having an issue passing a unique ID as envrionment varible ZOO_MY_ID as required by official zookeeeper image found here.

I've tried reading about this and found similar overflow questions but none seems to be working.

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

For some reason, I am still seeing the ID for all servers to be the default id of 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

Running the following command shows that no ID is passed however I am using the hacky way shown here: 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
Ani Aggarwal
  • 361
  • 4
  • 16

2 Answers2

6

I am not sure if it was resolved so:

As mentioned in the StatefulSets concept, the Pods in a StatefulSet have a sticky, unique identity. This identity is based on a unique ordinal index that is assigned to each Pod by the StatefulSet controller.

You can find an example here.

For example You can modify your statefulSet spec. by adding:

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

You can parse the index out of that.

More information and discussion about this particular topic you can find here

Hope this help.

Mark
  • 3,644
  • 6
  • 23
3

Not quite sure how useful this is anymore, but this will work for ZooKeeper in my case:

   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"]

It turned out the only thing that ZOO_MY_ID does is being passed to ${ZOO_DATA_DIR}/myid file. I'm doing it "manualy" and setting the file before entrypoint.

Marcin
  • 146
  • 4