CKA考试习题:调度管理- nodeAffinity、podAffinity、Taints

所有命令都验证过,有更好的方式,欢迎留言~~~

CKA 习题和真题汇总

更多CKA资料或交流:可加 wei  xin :wyf19910905

调度管理

大 纲

• 理解资源限制对Pod调度的影响
• 使用label selector调度Pod
• 手动调度Pod
• 理解DaemonSet
• 调度失败原因分析
• 使用多调度器
• 了解调度器的配置

Kubernetes 调度相关基础概念

Kubernetes 调度相关基础概念

Node 定义

Node 定义

 Pod 定义

  • resources.requests: 请求的资源量
  • resources.limits:给kubelet使用,一个pod能使用多少资源

Kubernetes 中的资源分配

Kubernetes 中的资源分配
  • 未指定request资源使用场景:离线任务,优先级不高、只是夹缝利用节点没有利用的资源进行一些计算,有资源就运行
  • 资源分配相关算法
    – GeneralPredicates(主要是PodFitsResources)--负责检查CPU、内存和硬盘的使用量,检查余量,余量不足直接排除
    – LeastRequestedPriority  -- 排序算法,最少调度pod的节点,从pod数量角度保证均衡
    – BalancedResourceAllocation,平衡cpu/mem的消耗比例  -- 排序算法

 Pod 所需资源的计算

 Pod 所需资源的计算

 Kubernetes 中的高级调度及用法

nodeSelector:将 Pod 调度到特定的 Node 上
nodeAffinity: nodeSelector 升级版

 nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution 硬性过滤规则支持指定 多条件之间的逻辑或运算

扫描二维码关注公众号,回复: 8595146 查看本文章
  • matchExpressions可以指定多个,单个matchExpressions内是与运算
podAffinity:让某些 Pod 分布在同一组 Node 上
  •  podAffinity:与nodeAffinity的主要区别是,labelSelector匹配的对象不是node,而是集中已调度或将要调度pod
    • topologyKey: 作用是--待调度的pod和目标pod是分配在哪个级别?同一个节点?机架?AZ?或自定义的node分组?

               -- 对node分组,依据label-key = topologyKey,每个label-value取值为一组

podAntiAffinity:避免某些 Pod 分布在同一组 Node 上

手动调度和DaemonSet

手动调度Pod(不经过调度器)

手动调度Pod(不经过调度器)

 DaemonSet:每个节点来一份

DaemonSet:每个节点来一份

 Taints:避免 Pod 调度到特定 Node 上

 Taints:避免 Pod 调度到特定 Node 上

Tolerations:允许 Pod 调度到有特定 taints 的 Node 上 

Tolerations:允许 Pod 调度到有特定 taints 的 Node 上

operator:为Exist时,只需要匹配key 

调度结果和失败原因分析
 


• 查看调度结果

kubectl get pod [podname] –o wide

• 查看调度失败原因(event)

kubectl describe pod [podname]

• 调度失败错误列表( kubernetes 1.9版本)
https://github.com/kubernetes/kubernetes/blob/release-1.9/plugin/pkg/scheduler/algorithm/predicates/error.go#L25-L58

• 调度失败错误列表( kubernetes 1.9以上版本)
https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/error.go#L25-L58

多调度器及调度器配置

多调度器及调度器配置

自定义调度器配置

  • --policy-config-file自定义调度器加载的算法,或者调整排序算法权重
  • 执行 kube-scheduler --help 查看更多调度器配置项
{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
  {"name" : "PodFitsHostPorts"},
  {"name" : "PodFitsResources"},
  {"name" : "NoDiskConflict"},
  {"name" : "NoVolumeZoneConflict"},
  {"name" : "MatchNodeSelector"},
  {"name" : "HostName"}
],
"priorities" : [
  {"name" : "LeastRequestedPriority", "weight" : 1},
  {"name" : "BalancedResourceAllocation", "weight" : 1},
  {"name" : "ServiceSpreadingPriority", "weight" : 1},
  {"name" : "EqualPriority", "weight" : 1}
],
"hardPodAffinitySymmetricWeight" : 10,
"alwaysCheckAllPredicates" : false
}


 

调度管理习题

1. 通过命令行,使用nginx镜像创建一个pod并手动调度到集群中的一个节点。
– Pod的名称为<hwcka-002-你的华为云id>

cat manual-deployment.yaml


apiVersion: v1
kind: Pod
metadata:
  name: hwcka-002-fly
  namespace: default  
  labels:
    run: hwcka-002-fly
spec:
  nodeName: node1
  containers:
  -image: nginx
   name: hwcka-002-fly



kubectl create -f manual-deployment.yaml

参考链接:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodename

2. 通过命令行,创建两个deployment。

– 需要集群中有2个节点

– 第1个deployment名称为<hwcka-002-app1-你的华为云id>,使用nginx镜像,拥有2个pod,并配
置该deployment自身的pod之间在节点级别反亲和

# kubectl create -f podAntiAffinity.yaml
# cat podAntiAffinity.yam
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: hwcka-002-app1-fly
  name: hwcka-002-app1-fly 
spec:
  replicas: 2 
  selector:
    matchLabels:
      run: hwcka-002-app1-fly
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hwcka-002-app1-fly
    spec:
      containers:
      - image: nginx
        name: hwcka-002-app1-fly
        resources: {}
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: run
                operator: In
                values:
                - hwcka-002-app1-fly
            topologyKey: kubernetes.io/hostname
status: {}

– 第2个deployment名称为<hwcka-002-app2-你的华为云id>,使用nginx镜像,用有2个pod,并配
置该deployment的pod与第1个deployment的pod在节点级别亲和

# kubectl create -f podAffinity.yaml
# cat podAffinity.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: hwcka-002-app2-fly
  name: hwcka-002-app2-fly
spec:
  replicas: 2
  selector:
    matchLabels:
      run: hwcka-002-app2-fly
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hwcka-002-app2-fly
    spec:
      containers:
      - image: nginx
        name: hwcka-002-app2-fly
        resources: {}
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: run
                operator: In
                values:
                - hwcka-002-app2-fly
            topologyKey: kubernetes.io/hostname
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: run
                operator: In
                values:
                - hwcka-002-app1-fly
            topologyKey: kubernetes.io/hostname
status: {}

参考链接:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity

 

发布了389 篇原创文章 · 获赞 1041 · 访问量 163万+

猜你喜欢

转载自blog.csdn.net/fly910905/article/details/103553839