创建一个仅指向由有状态集创建的 pod 的服务?
让我的解决方案是:
- 作为代表容器的提供程序放置。
- 带有容器名称的动态标签。
根据 Kubernetes 1.9,您可以使用: statefulset.kubernetes.io/pod-name
从文档中:
"当StatefulSet控制器创建一个Pod时,它会添加一个标签, statefulset.kubernetes.io/pod-name,即设置为名称 荚。此标签允许您将服务附加到 有状态集。
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-name-label
您可以使用 statefulset pod 的序号值来标记 pod。
我会在 initContainer 中使用 kubectl 来标记由 statefulset 创建的 pod 中的 pod,并在服务选择器规范中使用该标签。
示例初始化容器:
initContainers:
- name: set-label
image: lachlanevenson/k8s-kubectl:v1.8.5
command:
- sh
- -c
- '/usr/local/bin/kubectl label pod $POD_NAME select-id=${HOSTNAME##*-} --server=https://kubernetes.default --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt -n $POD_NAMESPACE'
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
示例服务选择器:
selector:
app: my-app
select-id: <0|1|2 ordinal value>