将节点标签注入Kubernetes pod

5ssjco0h  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(5)|浏览(190)

我希望将服务部署到运行在多个区域上的Kubernetes集群,并希望能够使用环境变量将区域/区域标签注入到我的Pod中。
我已经研究了向下的API,但是这似乎只允许您从pod/服务注入标签/元数据,而不是从运行pod的节点注入。
如果没有办法注入节点标签,我想到的另一个解决方案是让容器查询kubernetes/AWS API来获取这些信息,但是这意味着给我的容器增加了很多复杂性。

wz8daaqr

wz8daaqr1#

我想让容器查询kubernetes/AWS API来获取这些信息,但这意味着给我的容器增加了很多复杂性。
这是目前推荐的获取向下API中不可用的信息的方法。为了避免容器中的额外复杂性,您可以使用Tobias解决方案的变体“sidecar”。sidecar将是pod中的附加容器,它连接到kubernetes API,查询您正在寻找的信息(节点标签),并将输出写入共享卷。这可以实现为init container,或持续与API同步的sidecar。

n53p2ov0

n53p2ov02#

如果你想避免向每个需要访问节点标签的pod授予Kubernetes API权限,可以考虑使用mutation webhook。
使用kyverno的示例实现,当pod使用copy-topology-labels-to-pod注解时,将拓扑标签添加到pod:

  1. apiVersion: kyverno.io/v1
  2. kind: ClusterPolicy
  3. metadata:
  4. name: copy-topology-labels-to-pod
  5. spec:
  6. rules:
  7. - name: copy-topology-labels-to-pod
  8. match:
  9. any:
  10. - resources:
  11. kinds:
  12. - 'Pod'
  13. context:
  14. - name: topology_labels
  15. apiCall:
  16. urlPath: "/api/v1/nodes/{{request.object.spec.nodeName}}"
  17. jmesPath: "metadata.labels|items(@, 'key','value')[?pattern_match('topology.kubernetes.io/*', key)]|object_from_lists([].key, [].value)"
  18. preconditions:
  19. - all:
  20. - key: "{request.annotations.\"copy-topology-labels-to-pod\"}"
  21. operator: Equals
  22. value: "true"
  23. - key: "{{request.object.spec.nodeName}}"
  24. operator: NotEquals
  25. value: ""
  26. mutate:
  27. patchStrategicMerge:
  28. metadata:
  29. labels: "{{ topology_labels }}"
  30. spec:
  31. containers:
  32. - env:
  33. - name: TOPOLOGY_REGION
  34. valueFrom:
  35. fieldRef:
  36. fieldPath: "metadata.labels['topology.kubernetes.io/region']"
  37. - name: TOPOLOGY_ZONE
  38. valueFrom:
  39. fieldRef:
  40. fieldPath: "metadata.labels['topology.kubernetes.io/zone']"

字符串
本质上,你的容器不需要任何API服务器权限,因为所有的事情都是在pod创建时为你执行的:

  • 当pod具有nodeName时,它会查找节点标签,只保留拓扑标签
  • 将拓扑标签注入pod
  • 使用向下的API将标签值作为环境值注入pod
展开查看全部
ldioqlga

ldioqlga3#

实现此目的的一个选项是在每个节点上存储一个自定义文件,其中包含所需环境变量的定义。然后将包含该文件的文件夹装入容器,并将文件内容作为容器启动的一部分。
这里描述了Kubernetes secrets的类似方法:https://github.com/kubernetes/kubernetes/blob/master/docs/design/secrets.md#deferral-consuming-secrets-as-environment-variables

xkftehaa

xkftehaa4#

如上所述,可以通过kubernetes API访问标签。
我继续做了一个完整的工作版本来演示这一点(包括所需的RBAC):https://github.com/scottcrossen/kube-node-labels
在这个例子中,你可以在任何地方引用节点标签,否则你会引用一个环境变量。

vohkndzv

vohkndzv5#

从Tim St. Clair的回答中衍生出来的是,您也可以考虑从PostStart container hook中写出pod元数据。从a well known URL中获取您想要的元数据。然后将其写出到k8s via the API。这具有一次性执行的优点。由于区域和区域信息不会更改,因此无需保持侧车运行。

相关问题