美文网首页
备战CKA每日一题——第5天

备战CKA每日一题——第5天

作者: 小E的私房菜 | 来源:发表于2020-03-10 18:11 被阅读0次

    第5题:pod的调度:


    题目:
    • 创建一个pod名称为nginx,并将其调度到节点为 disk=ssd上
    解题思路:

    本题考点是nodeSelector-节点选择约束的最简单推荐形式。
    nodeSelector是PodSpec的领域。它指定键值对的映射。为了使Pod有资格在节点上运行,该节点必须具有每个指示的键值对作为标签(它也可以具有其他标签)。最常见的用法是一对键值对。
    具体可参考:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

    解题步骤:
    • 将标签粘贴到节点(运行kubectl get nodes以获取群集节点的名称。选择要向其添加标签的标签,然后运行):
    获取Node:
      sudo kubectl get nodes 
    向您选择的节点(ubuntu002 )添加标签:
      sudo kubectl label node ubuntu002 disk=ssd
    查看标签:
      sudo kubectl get nodes ubuntu002 --show-labels
    
    • 向您的Pod配置添加一个nodeSelector字段
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        run: kucc4
      name: kucc4
      namespace: ns-ehj
    spec:
      containers:
      - image: nginx
        name: kucc4
      - image: redis
        name: redis
      - image: memcached
        name: memcached
      - image: consul
        name: consul
      nodeSelector:
        disk: ssd
    

    最后apply即可调度到有disk: ssd标签的Node上去:

    sudo kubectl apply -f kucc4.yaml
    
    定向调度到ubuntu003
    标签为disk=ssd的node

    调度策略:

    Pod在绝大多数场景下只是容器的载体,我们需要用各种策略将此POD调度到指定的Node上去,调度的方法会有很多种,我们一起来分析下:

    1.Deployment/RC全自动调度:

    该策略是基于K8S本身的调度算法,我们举个例子来演示下:我们先创建一个有3个repilca的pod,基于Deployment来做调度,Deployment文件如下:
    我们照旧先dry-run一个文件出来修改:

     sudo kubectl run deploymentTest --image=nginx -n ns-ehj --generator=run-pod/v1 --dry-run -o yaml > deploymentTest.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        name: deployment-test
      name: deployment-test
      namespace: ns-ehj
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: deployment-test
      template:
        metadata:
          labels:
            name: deployment-test
        spec:
          containers:
          - image: nginx
            name: deployment-nginx
    
    全自动调度
    2.Node定向调度:(如题干所示即为定向调度)
    3.Node亲和性调度:

    用于替换NodeSelector的全新调度策略,节点亲和力在概念上类似于nodeSelector–它使您可以基于节点上的标签来限制Pod可以安排在哪些节点上进行调度。
    当前有两种类型的节点关联性:

    • requiredDuringSchedulingIgnoredDuringExecution:指定了将Pod调度到节点上必须满足的规则,与nodeSelector工作原理类似,只是语法不同,相当于硬限制。
    • preferredDuringSchedulingIgnoredDuringExecution
      强调优先满足指定规则,调度器会尝试调度至满足该条件的Node上,但是不强求,相当于软限制。可以设置优先级来指定先后顺序。
      注意:
      IgnoredDuringExecution的意思是如果一个pod所在的节点在pod运行期间标签发生了变化,不在符合该pod的亲和性要求,那么将忽略此变化,该pod能继续在该节点运行。
      我们需要在PodSpec里面指定nodeAffinity 和 affinity,下面我们来看个例子:
    apiVersion: v1
    kind: Pod
    metadata:
      name: with-node-affinity
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/e2e-az-name
                operator: In
                values:
                - e2e-az1
                - e2e-az2
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: another-node-label-key
                operator: In
                values:
                - another-node-label-value
      containers:
      - name: with-node-affinity
        image: k8s.gcr.io/pause:2.0
    

    代码解释:

    • 该节点相似性规则表示,只能将Pod放置在带有标签的标签上,该标签的键为 kubernetes.io/e2e-az-name,值为e2e-az1或e2e-az2。
    • 另外,在满足该条件的节点中,应首选带有如下标签的节点:该标签的键为another-node-label-key值为another-node-label-value
    • 如果同时指定nodeSelector和nodeAffinity,则必须满足两个条件,才能将Pod调度到候选节点上
    4.Pod亲和性调度

    根据节点上运行的Pod的标签而不是Node的标签进行调度,要求对节点和Pod两个条件进行匹配。可以描述为,如果在具有标签X的Node上运行了一个活多个符合条件的YPod,那么该Pod应该运行在这个Node上

    apiVersion: v1
    kind: Pod
    metadata:
      name: with-pod-affinity
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - S1
            topologyKey: failure-domain.beta.kubernetes.io/zone
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: security
                  operator: In
                  values:
                  - S2
              topologyKey: failure-domain.beta.kubernetes.io/zone
      containers:
      - name: with-pod-affinity
        image: k8s.gcr.io/pause:2.0
    

    此Pod上的 亲和性定义了一个Pod亲和性规则和一个Pod反亲和性规则。
    在此示例中:

    • podAffinityis是:requiredDuringSchedulingIgnoredDuringExecution,指的是该pod承接的Node必须拥有一个Key为security,Value为S1的Pod。
    • podAntiAffinityis是:preferredDuringSchedulingIgnoredDuringExecution,指的是如果节点已经运行了一个具有键“security”和值“S2”的标签的 pod,则该 pod 不希望将其调度到该节点上。

    相关文章

      网友评论

          本文标题:备战CKA每日一题——第5天

          本文链接:https://www.haomeiwen.com/subject/elvidhtx.html