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

2020-03-10  本文已影响0人  小E的私房菜

第5题:pod的调度:


题目:
解题思路:

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

解题步骤:
获取Node:
  sudo kubectl get nodes 
向您选择的节点(ubuntu002 )添加标签:
  sudo kubectl label node ubuntu002 disk=ssd
查看标签:
  sudo kubectl get nodes ubuntu002 --show-labels
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可以安排在哪些节点上进行调度。
当前有两种类型的节点关联性:

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

代码解释:

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反亲和性规则。
在此示例中:

上一篇 下一篇

猜你喜欢

热点阅读