是否可以知道调度 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.

中得到一些有用的东西

顺便说一句,我认为你目前的解决方案是正确的:)