我目前正在使用Kubernetes在主节点和辅助节点上调度DaemonSet。
两种节点类型(相同的映像,相同的卷等)的DaemonSet定义都是相同的,唯一的区别是执行入口点时,我需要编写一个不同的配置文件(该文件在Python中生成并带有一些动态值)(如果该节点是主节点还是工作节点。
当前,为了解决这个问题,我使用了两个不同的DaemonSet定义以及一个env值,该值指示节点是否为主节点。这是yaml文件(仅相关部分):
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: worker-ds
namespace: kube-system
labels:
k8s-app: worker
spec:
...
spec:
hostNetwork: true
containers:
- name: my-image
...
env:
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: IS_MASTER
value: "false"
...
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: master-ds
namespace: kube-system
labels:
k8s-app: master
spec:
...
spec:
hostNetwork: true
nodeSelector:
node-role.kubernetes.io/master: ""
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: my-image
...
env:
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: IS_MASTER
value: "true"
...
但是,由于唯一的区别是 IS_MASTER 值,我想将这两个定义合并为一个以编程方式理解的位置,以了解计划调度Pod的当前节点是主节点还是工人。
是否可以通过编程方式了解有关节点的信息(甚至读取节点中的配置文件(例如,只有主节点拥有或反之亦然)还是类似的东西)?
谢谢。
答案 0 :(得分:2)
不幸的是,没有方便的方法来访问pod中的节点信息。
如果只需要一个DaemonSet
定义,则可以向容器中添加一个sidecar
容器,sidecar
容器可以access the k8s api,那么您的主容器可以sidecar
中有用的内容。
顺便说一句,我认为您当前的解决方案是正确的:)
答案 1 :(得分:1)
您可以告诉节点是主节点,是否带有标签node-role.kubernetes.io/master: ""
。
您需要做的是通过Downward Api(编辑:错误,只能从Downpi Api 访问Pod信息)来从容器中访问该标签。您可以使用以下方法将标签贴在容器内:
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
然后您可以从容器中搜索该文件的内容。