是否可以知道调度 Kubernetes Pod 的节点是 master 还是 worker?
Is it possible to know if the node where a Kubernetes Pod is being scheduled is master or worker?
我目前正在使用 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 is being scheduled is master or worker.
有没有办法以编程方式了解有关节点的此信息(甚至读取节点中的配置文件[例如只有主服务器拥有或反之亦然]或类似的东西)?
提前致谢。
如果节点具有标签 node-role.kubernetes.io/master: ""
,则可以判断它是主节点。
您需要做的是从您的容器访问该标签,这可以通过 Downward Api 完成(编辑:错误,只能从向下访问 Pod 信息 Api).您可以使用以下方法将标签安装在容器中:
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
然后您可以从容器中搜索该文件的内容。
遗憾的是,没有方便的方式来访问pod中的节点信息。
如果你只想要一个DaemonSet
定义,你可以在你的pod中添加一个sidecar
容器,sidecar
容器可以access the k8s api,然后你的主容器可以从 sidecar
.
中得到一些有用的东西
顺便说一句,我认为你目前的解决方案是正确的:)
我目前正在使用 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 is being scheduled is master or worker.
有没有办法以编程方式了解有关节点的此信息(甚至读取节点中的配置文件[例如只有主服务器拥有或反之亦然]或类似的东西)?
提前致谢。
如果节点具有标签 node-role.kubernetes.io/master: ""
,则可以判断它是主节点。
您需要做的是从您的容器访问该标签,这可以通过 Downward Api 完成(编辑:错误,只能从向下访问 Pod 信息 Api).您可以使用以下方法将标签安装在容器中:
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
然后您可以从容器中搜索该文件的内容。
遗憾的是,没有方便的方式来访问pod中的节点信息。
如果你只想要一个DaemonSet
定义,你可以在你的pod中添加一个sidecar
容器,sidecar
容器可以access the k8s api,然后你的主容器可以从 sidecar
.
顺便说一句,我认为你目前的解决方案是正确的:)