kubernetes-pod的调度

kubernetes-7

1、pod停止之后,服务不会停止

使用 kubectl delete 命令删除特定的 Service:

kubectl delete service <service-name>
[root@master pod]# kubectl get service
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          14d
mydb              ClusterIP   10.111.97.213    <none>        80/TCP           9d
myservice         ClusterIP   10.110.72.101    <none>        80/TCP           9d
mysql-service     NodePort    10.108.120.107   <none>        3306:30008/TCP   43h
redis-leader      ClusterIP   10.98.178.58     <none>        6379/TCP         43h
scnginx-service   NodePort    10.103.157.7     <none>        80:30009/TCP     43h
[root@master pod]# 
[root@master pod]# kubectl delete service scnginx-service
service "scnginx-service" deleted
[root@master pod]# kubectl delete service redis-leader
service "redis-leader" deleted
[root@master pod]# kubectl delete service mysql-service
service "mysql-service" deleted
[root@master pod]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   14d
mydb         ClusterIP   10.111.97.213   <none>        80/TCP    9d
myservice    ClusterIP   10.110.72.101   <none>        80/TCP    9d
[root@master pod]# 

2、pod endpoint service之间的关系

  • Pod是Kubernetes中能够创建和部署的最小单元,代表集群中的一个应用实例。每个Pod都有一个或多个容器,这些容器共享网络和存储资源。Pods可以独立运行,但通常它们被组织成更大的结构以便于管理和扩展。

  • ENDPOINTS就是service关联的pod的ip地址和端口

  • Service是定义一组Pods的逻辑集合以及访问它们的策略的抽象。Service允许外部流量通过统一的接口访问一组Pods,而不需要关心后端Pods的具体IP地址或数量。Service通常通过Label Selector来选择目标Pods,这意味着只有带有特定标签的Pods才会成为Service的一部分。

在Kubernetes集群中,Pods是运行在私有网络空间内的容器,它们被分配有集群内部的私有IP地址。这些私有IP地址对于外部网络是不可见的,因此外部用户无法直接访问到这些Pods。

Service对象在Kubernetes中充当了将Pods的私有网络接口转换为可从外部访问的接口的角色。Service通过定义一种访问策略(例如负载均衡),使得外部流量可以被均匀地分配到后端的Pods上。这个过程通常由kube-proxy来实现,它负责在集群节点上设置相应的网络规则。

Service有两种主要的类型:

  1. ClusterIP:这是Service的默认类型,它为Service分配一个集群内部的虚拟IP地址。这个IP地址可以被集群内的其他组件(如其他Pods或Services)用来访问Service。

  2. NodePort 或 LoadBalancer:这两种类型的Service可以将流量从集群外部导向集群内部。NodePort在集群的所有节点上分配一个端口,而LoadBalancer(如果云提供商支持)会为Service分配一个公有IP地址。这样,外部用户就可以通过这个端口或IP地址访问到Service,进而访问到后端的Pods。

Endpoints是Service背后的实际网络地址列表,它包含了所有匹配Service选择器的Pods的IP地址和端口号。当Service接收到外部请求时,它会通过Endpoints来确定应该将请求转发到哪个Pod上。

总结来说,Service通过kube-proxy作为负载均衡器,将外部的请求转发到集群内部的Pods。Service有一个虚拟的IP地址和端口,这些信息通过Endpoints映射到实际的Pods上。这样,即使Pods的私有IP地址对外部不可见,外部用户也可以通过Service访问到这些Pods上运行的应用。

一个service对应一个pod

3、pod的调度

总述

  1. 自动调度:根据node节点的综合算例(cpu,内存等资源) 分配–》具有随机性
  2. 定向调度:指定在哪个node节点上 —>NodeName、NodeSelector
  3. 亲和性和反亲和性调度:
    • pod亲和性
    • node亲和性
    • pod反亲和性:排斥,互斥
  4. 污点和容忍度

1. 资源请求(Resource Requests)和资源限制(Resource Limits)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      requests:
       cpu: "500m"
       memory: "256Mi"
      limits:
       cpu: "1"
       memory: "512Mi"

在这个例子中,my-pod Pod中的容器my-container请求了500毫核的CPU和256Mi的内存。同时,它设置了1个CPU核心和512Mi内存的资源限制。

2. 节点选择器(Node Selector)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - name: my-container
    image: my-image

这里,my-pod将被调度到带有disktype: ssd标签的节点上。

3. 污点和容忍度(Taints and Tolerations)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  tolerations:
  - key: "example-key"
    operator: "Equal"
    value: "example-value"
    effect: "NoSchedule"
  containers:
  - name: my-container
    image: my-image

在这个Pod定义中,my-pod容忍了一个名为example-key的污点,其操作符为Equal,值为example-value,并且这个污点的效果是NoSchedule,意味着这个Pod不会被调度到带有不匹配污点的节点上。

4. 亲和性和反亲和性(Affinity and Anti-Affinity)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: example
            operator: In
            values:
            - value
        topologyKey: "kubernetes.io/hostname"
  containers:
  - name: my-container
    image: my-image

这个Pod定义使用了podAffinity来指定my-pod在调度时需要与具有example: value标签的Pods在同一主机(kubernetes.io/hostname)上运行。

5. 优先级类(PriorityClass)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  annotations:
    "scheduler.alpha.kubernetes.io/critical-pod": ""
spec:
  priorityClassName: high-priority
  containers:
  - name: my-container
    image: my-image

这里,my-pod使用了high-priority优先级类,这意味着它在资源不足时会比其他低优先级的Pod更有可能被调度。

6. 调度策略(Scheduling Policy)

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  schedulerName: my-scheduler
  containers:
  - name: my-container
    image: my-image

在这个例子中,my-pod指定了使用名为my-scheduler的调度器,而不是默认的调度器。

4、Kubernetes Pod调度:CPU和内存资源配置与调度策略详解

4.1、例子

在Kubernetes中,Pod的自动调度涉及到多个与资源相关的设置,尤其是CPU和内存的配置。以下是关于CPU和内存设置的详细信息,这些设置会影响Pod的调度行为:

4.2、CPU设置

  1. CPU请求(cpuRequests):

    • 指定Pod需要的最小CPU资源量。
    • 例如:cpuRequests: "250m" 表示Pod需要250毫核(millicores)的CPU资源。
  2. CPU限制(cpuLimits):

    • 指定Pod可以使用的最大CPU资源量。
    • 例如:cpuLimits: "500m" 表示Pod最多只能使用500毫核的CPU资源。

4.3、内存设置

  1. 内存请求(memoryRequests):

    • 指定Pod需要的最小内存资源量。
    • 例如:memoryRequests: "128Mi" 表示Pod需要128 Mebibytes(Mi)的内存资源。
  2. 内存限制(memoryLimits):

    • 指定Pod可以使用的最大内存资源量。
    • 例如:memoryLimits: "256Mi" 表示Pod最多只能使用256 Mebibytes的内存资源。

4.4、配置示例

以下是一个Pod定义文件的示例,展示了如何设置CPU和内存的请求和限制:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      requests:
        cpu: "250m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"

在这个示例中,my-pod Pod中的my-container容器请求了250毫核的CPU和128Mi的内存。同时,它设置了500毫核CPU和256Mi内存的限制。

4.5、调度器如何使用这些设置

Kubernetes调度器在调度Pod时会考虑这些资源请求和限制:

  • 过滤(Filtering)阶段: 调度器会筛选出具有足够资源(基于请求)的节点。
  • 打分(Scoring)阶段: 调度器会根据资源的使用情况和其他策略(如亲和性规则)为每个节点打分,选择得分最高的节点来调度Pod。

正确配置资源请求和限制对于确保Pod的稳定运行和集群资源的有效管理至关重要。请求设置得太小可能会导致Pod在资源紧张时被频繁地驱逐,而请求设置得太大可能会导致资源浪费。限制设置得太小可能会导致Pod在资源使用高峰时被杀掉,而设置得太大则可能会导致集群资源过载。

5、Kubernetes Pod调度:定向调度

5.1、指定nodeName

[root@master sch]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: sc
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
  nodeName: node-1
[root@master sch]# 
[root@master sch]# kubectl apply -f pod.yaml 
pod/pod-nodename created
[root@master sch]# kubectl get pod -n sc
NAME           READY   STATUS    RESTARTS   AGE
pod-nodename   1/1     Running   0          11s
[root@master sch]# kubectl get pod -n sc -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
pod-nodename   1/1     Running   0          21s   10.244.84.152   node-1   <none>           <none>
[root@master sch]# 

5.2、nodeselector 方式实现定向调度

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

  1. 首先分别为node-2节点添加标签:nodeenv=prod

    [root@master sch]# kubectl label nodes node-2 nodeenv=prod
    node/node-2 labeled
    [root@master sch]# kubectl get nodes --show-labels
    NAME     STATUS   ROLES                  AGE   VERSION   LABELS
    node-2   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-2,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=prod
    [root@master sch]# 
    
  2. 给node-1节点添加标签: nodeenv=test

    [root@master sch]# kubectl label nodes node-1 nodeenv=test
    node/node-1 labeled
    [root@master sch]# kubectl get nodes --show-labels|grep node-1
    node-1   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=test
    [root@master sch]# 
    
  3. 创建一个pod-node-selector.yaml文件,并使用它创建Pod

    [root@master sch]# vim pod-node-selector.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-nodeselector
      namespace: sc
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
      nodeSelector:
        nodeenv: prod # 指定调度到具有nodeenv=prod标签的节点上
    [root@master sch]# 
    
    [root@master sch]# kubectl apply -f pod-node-selector.yaml 
    pod/pod-nodeselector created
    [root@master sch]# kubectl get -f pod-node-selector.yaml
    NAME               READY   STATUS    RESTARTS   AGE
    pod-nodeselector   1/1     Running   0          9s
    [root@master sch]# kubectl get -f pod-node-selector.yaml -o wide
    NAME               READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
    pod-nodeselector   1/1     Running   0          14s   10.244.247.28   node-2   <none>           <none>
    [root@master sch]# 
    

6、Kubernetes Pod调度:节点亲和性

6.1、概述

节点亲和性(Node Affinity)是 Kubernetes 中的一个调度特性,它允许你定义规则,指导调度器将 Pod 调度到具有特定特征的节点上。这些特征可以是节点的标签(Labels),也可以是节点的其他属性,如硬件类型、区域等。节点亲和性的目的是确保 Pod 能够运行在最适合其运行条件的节点上,从而优化资源利用率、提高性能或满足特定的部署要求。

亲和性调度(Aw inity)主要分为三类:

  • nodeAw inity(node亲和性):以node为目标,解决pod可以调度到哪些node的问题
  • podAw inity(pod亲和性) :以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
  • podAntiAw inity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题

6.2、node亲和性

1.选择一个节点,给它添加一个标签:

[root@master sch]# kubectl label nodes node-1 disktype=hdd
node/node-1 labeled
[root@master sch]# kubectl get nodes --show-labels|grep node-1
node-1   Ready    worker                 11d   v1.20.6   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=hdd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,nodeenv=test
[root@master sch]# 

2.创建pod-nginx的yaml文件

[root@master sch]# vim pod-nginx-podaffinity.yaml
[root@master sch]# cat pod-nginx-podaffinity.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity: #亲和性
    nodeAffinity: #节点亲和性
      requiredDuringSchedulingIgnoredDuringExecution: #硬限制
        nodeSelectorTerms:
        - matchExpressions: #匹配标签
          - key: disktype
            operator: In
            values:
            - hdd            
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
[root@master sch]# 
[root@master sch]# kubectl apply -f pod-nginx-podaffinity.yaml 
pod/nginx created
[root@master sch]# kubectl get -f pod-nginx-podaffinity.yaml -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          10s   10.244.84.147   node-1   <none>           <none>
[root@master sch]# 

7、小知识点

  • 每个服务都会有一个ip
  • 通过访问宿主机上的端口,映射到pod里–》外网就可以访问内部的pod了
  • kubectl get service —》用于获取集群中服务(Service)的列表或特定服务的详细信息。
  • kubectl get nodes --show-labels —》查看节点打的标签
  • disk磁盘类型:hdd—>机械磁盘 hard disk driver ssd:固态磁盘
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不冤不乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值