是否可以根据StatefulSets中的序数索引将不同的args传递给pod?没有在StatefulSets文档中找到答案。谢谢!
答案 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
:
command:
- bash
- c
- |
ordinal=${HOSTNAME##*-}
if [[ "$ordinal" = "0" ]]; then
...
else
...
fi