如何根据StatefulSet中的Ordinal Index将args传递给pod?

时间:2017-01-19 00:44:35

标签: kubernetes

是否可以根据StatefulSets中的序数索引将不同的args传递给pod?没有在StatefulSets文档中找到答案。谢谢!

5 个答案:

答案 0 :(得分:2)

我发现使用生命周期挂钩将序数索引传递到容器中的方法少了hacky

  containers:
  - name: cp-kafka
    imagePullPolicy: Always
    image: confluentinc/cp-kafka:4.0.0
    resources:
      requests:
        memory: "2Gi"
        cpu: 0.5
    ports:
    - containerPort: 9093
      name: server
      protocol: TCP
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "export KAFKA_BROKER_ID=${HOSTNAME##*-}"]
    env:
      - name: KAFKA_ZOOKEEPER_CONNECT
        value: zk-cs.default.svc.cluster.local:2181
      - name: KAFKA_ADVERTISED_LISTENERS
        value: PLAINTEXT://localhost:9093

答案 1 :(得分:1)

我不知道这样做的非黑客方式,但我知道一个有效的黑客行为。首先,StatefulSet中的每个pod都会获得一个唯一的可预测名称。它可以通过the downward API或仅通过调用hostname来发现该名称。所以我有shell脚本作为我的容器的入口点,该脚本获取它的pod / hostname。从那里,它使用适合特定主机的命令行参数调用“真正的”可执行文件。

例如,我的一个脚本希望通过向下api将pod名称作为POD_NAME映射到环境中。然后它做了类似的事情:

#!/bin/bash

pet_number=${POD_NAME##*-}

if [ pet_number == 0 ]
then
   # stuff here
fi

# etc.

答案 2 :(得分:1)

如果您想跟踪此进度,此功能的相关故障单位于:https://github.com/kubernetes/kubernetes/issues/30427

该提案涉及将序号作为标签放在pod上,然后使用向下api将其拉出到环境变量或其他内容中。

答案 3 :(得分:1)

推荐方式,请参见https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/#statefulset

# Generate server-id from pod ordinal index.

[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}

# ${ordinal} now holds the replica number

server-id=$((100 + $ordinal))

# Copy appropriate conf.d files from config-map to emptyDir.
if [[ $ordinal -eq 0 ]]; then
  # do something
else
  # do something else
fi

答案 4 :(得分:0)

您可以使用HOSTNAME

来避免使用Downward API
command:
- bash
- c
- |
  ordinal=${HOSTNAME##*-}  
  if [[ "$ordinal" = "0" ]]; then
    ...
  else
    ...
  fi