【发布时间】:2017-06-03 13:42:18
【问题描述】:
是否可以根据它们在 StatefulSets 中的序数索引将不同的参数传递给 pod?在 StatefulSets 文档中找不到答案。谢谢!
【问题讨论】:
标签: kubernetes
是否可以根据它们在 StatefulSets 中的序数索引将不同的参数传递给 pod?在 StatefulSets 文档中找不到答案。谢谢!
【问题讨论】:
标签: kubernetes
推荐方式,见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
【讨论】:
我不知道有什么方法可以做到这一点,但我知道一种可行的方法。首先,StatefulSet 中的每个 pod 都有一个唯一的可预测名称。它可以通过the downward API 或仅通过调用hostname 来发现该名称。因此,我将 shell 脚本作为容器的入口点,该脚本获取它的 pod/主机名。从那里它使用适用于特定主机的命令行参数调用“真正的”可执行文件。
例如,我的一个脚本希望通过向下 api 将 pod 名称映射到环境中为 POD_NAME。然后它会执行以下操作:
#!/bin/bash
pet_number=${POD_NAME##*-}
if [ pet_number == 0 ]
then
# stuff here
fi
# etc.
【讨论】:
我发现少了一种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
【讨论】:
如果您想跟踪此进度,此功能的相关票证在这里:https://github.com/kubernetes/kubernetes/issues/30427
该提议涉及将序号作为标签放在 pod 上,然后使用向下的 api 将其拉出到环境变量或其他东西中。
【讨论】:
您可以通过使用HOSTNAME 来避免使用 Downward API:
command:
- bash
- c
- |
ordinal=${HOSTNAME##*-}
if [[ "$ordinal" = "0" ]]; then
...
else
...
fi
【讨论】: