首页 文章

如何强制Pods / Deployments到主节点?

提问于
浏览
7

我已经设置了一个Kubernetes 1.5集群,其中三个主节点被污染为dedicated = master:NoSchedule . 现在我只想在主节点上部署Nginx入口控制器,所以我增加了容忍度:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-lb
        name: nginx-ingress-lb
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
    […]

不幸的是,这没有达到预期效果:Kubernetes安排 Worker 的所有Pod . 将副本数量扩展到更大数量时,Pod也会部署在工作者上 .

如何才能实现主节点的调度?

谢谢你的帮助 .

2 回答

  • 0

    您可能想深入了解Assigning Pods to Nodes文档 . 基本上你应该为你的节点添加一些标签,如下所示:

    kubectl label nodes <node-name> <label-key>=<label-value>
    

    然后在 Pod 规范中引用它,如下所示:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
      nodeSelector:
        label: value
    

    但是当特定节点被污染时,我不确定这是否适用于非关键插件 . 更多细节可以找到here

  • 13

    容忍并不意味着必须在具有此类污点的节点上安排pod . 这意味着吊舱容忍这种污点 . 如果您希望pod对于特定节点"attracted",则需要将 label 附加到您的专用=主要受污染节点,并在pod中设置nodeSelector以查找此类标签 .

    将标签附加到每个特殊用途节点:

    kubectl label nodes name_of_your_node dedicated=master
    

    Kubernetes 1.6及以上语法

    将nodeSelector添加到您的pod:

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: nginx-ingress-controller
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            k8s-app: nginx-ingress-lb
            name: nginx-ingress-lb
          annotations:
        spec:
          nodeSelector:
            dedicated: master
          tolerations:
          - key: dedicated
            operator: Equal
            value: master
            effect: NoSchedule
        […]
    

    如果您不喜欢 nodeSelector ,可以在 spec: 下添加 affinity:

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            matchExpressions:
            - key: dedicated
              operator: Equal
              values: ["master"]
    

    Pre 1.6语法

    将nodeSelector添加到您的pod:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx-ingress-controller
      namespace: kube-system
      labels:
        kubernetes.io/cluster-service: "true"
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            k8s-app: nginx-ingress-lb
            name: nginx-ingress-lb
          annotations:
            scheduler.alpha.kubernetes.io/tolerations: |
              [
                {
                  "key": "dedicated",
                  "operator": "Equal",
                  "value": "master",
                  "effect": "NoSchedule"
                }
              ]
        spec:
          nodeSelector:
            dedicated: master
        […]
    

    如果你不喜欢 nodeSelector ,你也可以添加这样的注释:

    scheduler.alpha.kubernetes.io/affinity: >
      {
        "nodeAffinity": {
          "requiredDuringSchedulingIgnoredDuringExecution": {
            "nodeSelectorTerms": [
              {
                "matchExpressions": [
                  {
                    "key": "dedicated",
                    "operator": "Equal",
                    "values": ["master"]
                  }
                ]
              }
            ]
          }
        }
      }
    

    请记住,NoSchedule不会驱逐已安排的pod .

    以上信息来自https://kubernetes.io/docs/user-guide/node-selection/,那里有更多细节 .

相关问题