八 pod:pod的调度——将 Pod 指派给节点

目录

  • 一.系统环境
  • 二.前言
  • 三.pod的调度
    • 3.1 pod的调度概述
    • 3.2 pod自动调度
      • 3.2.1 创建3个主机端口为80的pod
    • 3.3 使用nodeName 字段指定pod运行在哪个节点
    • 3.4 使用节点标签nodeSelector指定pod运行在哪个节点
      • 3.4.1 查看标签
      • 3.4.2 创建标签
      • 3.4.3 通过标签控制pod在哪个节点运行
    • 3.5 使用亲和性与反亲和性调度pod
      • 3.5.1 使用硬策略requiredDuringSchedulingIgnoredDuringExecution
      • 3.5.2 使用软策略preferredDuringSchedulingIgnoredDuringExecution
      • 3.5.3 节点亲和性权重
    • 3.6 Pod 拓扑分布约束
一.系统环境服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点
服务器操作系统版本CPU架构进程功能描述k8scloude1/192.168.110.130CentOS Linux release 7.4.1708 (Core)x86_64docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calicok8s master节点k8scloude2/192.168.110.129CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点k8scloude3/192.168.110.128CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点二.前言本文介绍pod的调度,即如何让pod运行在Kubernetes集群的指定节点 。
进行pod的调度的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html
三.pod的调度3.1 pod的调度概述你可以约束一个 Pod 以便 限制 其只能在特定的节点上运行,或优先在特定的节点上运行 。有几种方法可以实现这点 , 推荐的方法都是用 标签选择算符来进行选择 。通常这样的约束不是必须的,因为调度器将自动进行合理的放置(比如,将 Pod 分散到节点上,而不是将 Pod 放置在可用资源不足的节点上等等) 。但在某些情况下,你可能需要进一步控制 Pod 被部署到哪个节点 。例如,确保 Pod 最终落在连接了 SSD 的机器上, 或者将来自两个不同的服务且有大量通信的 Pods 被放置在同一个可用区 。
你可以使用下列方法中的任何一种来选择 Kubernetes 对特定 Pod 的调度:
  • 与节点标签匹配的 nodeSelector
  • 亲和性与反亲和性
  • nodeName 字段
  • Pod 拓扑分布约束
3.2 pod自动调度如果不手动指定pod运行在哪个节点上,k8s会自动调度pod的,k8s自动调度pod在哪个节点上运行考虑的因素有:
  • 待调度的pod列表
  • 可用的node列表
  • 调度算法:主机过滤,主机打分
3.2.1 创建3个主机端口为80的pod查看hostPort字段的解释 , hostPort字段表示把pod的端口映射到节点,即在节点上公开 Pod 的端口 。
#主机端口映射:hostPort: 80[root@k8scloude1 pod]# kubectl explain pods.spec.containers.ports.hostPortKIND:PodVERSION:v1FIELD:hostPort <integer>DESCRIPTION:Number of port to expose on the host. If specified, this must be a validport number, 0 < x < 65536. If HostNetwork is specified, this must matchContainerPort. Most containers do not need this.创建第一个pod,hostPort: 80表示把容器的80端口映射到节点的80端口
[root@k8scloude1 pod]# vim schedulepod.yaml#kind: Pod表示资源类型为Podlabels指定pod标签metadata下面的name指定pod名字containers下面全是容器的定义#image指定镜像名字imagePullPolicy指定镜像下载策略containers下面的name指定容器名#resources指定容器资源(CPU,内存等)env指定容器里的环境变量dnsPolicy指定DNS策略#restartPolicy容器重启策略ports指定容器端口containerPort容器端口hostPort节点上的端口[root@k8scloude1 pod]# cat schedulepod.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: podname: podnamespace: podspec:containers:- image: nginximagePullPolicy: IfNotPresentname: podresources: {}ports:- name: httpcontainerPort: 80protocol: TCPhostPort: 80dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}[root@k8scloude1 pod]# kubectl apply -f schedulepod.yamlpod/pod created[root@k8scloude1 pod]# kubectl get podsNAMEREADYSTATUSRESTARTSAGEpod1/1Running06s可以看到pod创建成功 。
接下来创建第二个pod,hostPort: 80表示把容器的80端口映射到节点的80端口 , 两个pod只有pod名字不一样 。
[root@k8scloude1 pod]# cp schedulepod.yaml schedulepod1.yaml [root@k8scloude1 pod]# vim schedulepod1.yaml [root@k8scloude1 pod]# cat schedulepod1.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod1namespace: podspec:containers:- image: nginximagePullPolicy: IfNotPresentname: pod1resources: {}ports:- name: httpcontainerPort: 80protocol: TCPhostPort: 80dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}[root@k8scloude1 pod]# kubectl apply -f schedulepod1.yamlpod/pod1 created[root@k8scloude1 pod]# kubectl get podsNAMEREADYSTATUSRESTARTSAGEpod1/1Running011mpod11/1Running05s

推荐阅读