是否可以知道正在调度Kubernetes Pod的节点是主节点还是工作节点?

时间:2019-05-27 14:49:52

标签: kubernetes pod daemonset

我目前正在使用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的当前节点是主节点还是工人。

是否可以通过编程方式了解有关节点的信息(甚至读取节点中的配置文件(例如,只有主节点拥有或反之亦然)还是类似的东西)?

谢谢。

2 个答案:

答案 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

然后您可以从容器中搜索该文件的内容。