我希望将服务部署到运行在多个区域上的Kubernetes集群,并希望能够使用环境变量将区域/区域标签注入到我的Pod中。我已经研究了向下的API,但是这似乎只允许您从pod/服务注入标签/元数据,而不是从运行pod的节点注入。如果没有办法注入节点标签,我想到的另一个解决方案是让容器查询kubernetes/AWS API来获取这些信息,但是这意味着给我的容器增加了很多复杂性。
wz8daaqr1#
我想让容器查询kubernetes/AWS API来获取这些信息,但这意味着给我的容器增加了很多复杂性。这是目前推荐的获取向下API中不可用的信息的方法。为了避免容器中的额外复杂性,您可以使用Tobias解决方案的变体“sidecar”。sidecar将是pod中的附加容器,它连接到kubernetes API,查询您正在寻找的信息(节点标签),并将输出写入共享卷。这可以实现为init container,或持续与API同步的sidecar。
n53p2ov02#
如果你想避免向每个需要访问节点标签的pod授予Kubernetes API权限,可以考虑使用mutation webhook。使用kyverno的示例实现,当pod使用copy-topology-labels-to-pod注解时,将拓扑标签添加到pod:
copy-topology-labels-to-pod
apiVersion: kyverno.io/v1kind: ClusterPolicymetadata: name: copy-topology-labels-to-podspec: rules: - name: copy-topology-labels-to-pod match: any: - resources: kinds: - 'Pod' context: - name: topology_labels apiCall: urlPath: "/api/v1/nodes/{{request.object.spec.nodeName}}" jmesPath: "metadata.labels|items(@, 'key','value')[?pattern_match('topology.kubernetes.io/*', key)]|object_from_lists([].key, [].value)" preconditions: - all: - key: "{request.annotations.\"copy-topology-labels-to-pod\"}" operator: Equals value: "true" - key: "{{request.object.spec.nodeName}}" operator: NotEquals value: "" mutate: patchStrategicMerge: metadata: labels: "{{ topology_labels }}" spec: containers: - env: - name: TOPOLOGY_REGION valueFrom: fieldRef: fieldPath: "metadata.labels['topology.kubernetes.io/region']" - name: TOPOLOGY_ZONE valueFrom: fieldRef: fieldPath: "metadata.labels['topology.kubernetes.io/zone']"
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: copy-topology-labels-to-pod
spec:
rules:
- name: copy-topology-labels-to-pod
match:
any:
- resources:
kinds:
- 'Pod'
context:
- name: topology_labels
apiCall:
urlPath: "/api/v1/nodes/{{request.object.spec.nodeName}}"
jmesPath: "metadata.labels|items(@, 'key','value')[?pattern_match('topology.kubernetes.io/*', key)]|object_from_lists([].key, [].value)"
preconditions:
- all:
- key: "{request.annotations.\"copy-topology-labels-to-pod\"}"
operator: Equals
value: "true"
- key: "{{request.object.spec.nodeName}}"
operator: NotEquals
value: ""
mutate:
patchStrategicMerge:
labels: "{{ topology_labels }}"
containers:
- env:
- name: TOPOLOGY_REGION
valueFrom:
fieldRef:
fieldPath: "metadata.labels['topology.kubernetes.io/region']"
- name: TOPOLOGY_ZONE
fieldPath: "metadata.labels['topology.kubernetes.io/zone']"
字符串本质上,你的容器不需要任何API服务器权限,因为所有的事情都是在pod创建时为你执行的:
ldioqlga3#
实现此目的的一个选项是在每个节点上存储一个自定义文件,其中包含所需环境变量的定义。然后将包含该文件的文件夹装入容器,并将文件内容作为容器启动的一部分。这里描述了Kubernetes secrets的类似方法:https://github.com/kubernetes/kubernetes/blob/master/docs/design/secrets.md#deferral-consuming-secrets-as-environment-variables
xkftehaa4#
如上所述,可以通过kubernetes API访问标签。我继续做了一个完整的工作版本来演示这一点(包括所需的RBAC):https://github.com/scottcrossen/kube-node-labels在这个例子中,你可以在任何地方引用节点标签,否则你会引用一个环境变量。
vohkndzv5#
从Tim St. Clair的回答中衍生出来的是,您也可以考虑从PostStart container hook中写出pod元数据。从a well known URL中获取您想要的元数据。然后将其写出到k8s via the API。这具有一次性执行的优点。由于区域和区域信息不会更改,因此无需保持侧车运行。
5条答案
按热度按时间wz8daaqr1#
我想让容器查询kubernetes/AWS API来获取这些信息,但这意味着给我的容器增加了很多复杂性。
这是目前推荐的获取向下API中不可用的信息的方法。为了避免容器中的额外复杂性,您可以使用Tobias解决方案的变体“sidecar”。sidecar将是pod中的附加容器,它连接到kubernetes API,查询您正在寻找的信息(节点标签),并将输出写入共享卷。这可以实现为init container,或持续与API同步的sidecar。
n53p2ov02#
如果你想避免向每个需要访问节点标签的pod授予Kubernetes API权限,可以考虑使用mutation webhook。
使用kyverno的示例实现,当pod使用
copy-topology-labels-to-pod
注解时,将拓扑标签添加到pod:字符串
本质上,你的容器不需要任何API服务器权限,因为所有的事情都是在pod创建时为你执行的:
ldioqlga3#
实现此目的的一个选项是在每个节点上存储一个自定义文件,其中包含所需环境变量的定义。然后将包含该文件的文件夹装入容器,并将文件内容作为容器启动的一部分。
这里描述了Kubernetes secrets的类似方法:https://github.com/kubernetes/kubernetes/blob/master/docs/design/secrets.md#deferral-consuming-secrets-as-environment-variables
xkftehaa4#
如上所述,可以通过kubernetes API访问标签。
我继续做了一个完整的工作版本来演示这一点(包括所需的RBAC):https://github.com/scottcrossen/kube-node-labels
在这个例子中,你可以在任何地方引用节点标签,否则你会引用一个环境变量。
vohkndzv5#
从Tim St. Clair的回答中衍生出来的是,您也可以考虑从PostStart container hook中写出pod元数据。从a well known URL中获取您想要的元数据。然后将其写出到k8s via the API。这具有一次性执行的优点。由于区域和区域信息不会更改,因此无需保持侧车运行。