美文网首页
pod学习3

pod学习3

作者: 菜头_355f | 来源:发表于2021-05-07 09:15 被阅读0次


node 节点选择器

我们在创建 pod 资源的时候,pod 会根据 schduler 进行调度,那么默认会调度到随机的一个工

作节点,如果我们想要 pod 调度到指定节点或者调度到一些具有相同特点的 node 节点,怎么办呢?

可以使用

pod 中的 nodeName 或者 nodeSelector 字段指定要调度到的 node 节点

1、nodeName:

指定

pod 节点运行在哪个具体 node

cat pod-node.yaml

apiVersion: v1   #pod属于k8s核心组v1

kind: Pod         #创建的是一个pod资源   

metadata:        #元数据

  name: demo-pod1  #pod名字

  namespace: default   #pod所属的名称空间

  labels:     #标签

    app: myapp   #pod具有的标签

    env: dev          #pod具有的标签

spec:

  nodeName: god64

  containers:         #定义一个容器,容器是独享列表

  - name: tomcat-pod-java   #容器名字

    ports:

    - containerPort: 8080    #容器内部的port

 的    image: tomcat:8.5-jre8-alpine  #容器使用的景象

    imagePullPolicy: IfNotPresent       #容器拉取的策略

  - name: busybox

    image: busybox:latest

    command:       #command是一个列表,定义的时候下面的参数加横线

    - "/bin/sh"

    - "-c"

    - "sleep 3600"

#kubectl apply -f pod-node.yaml

#kubectl get pods -o wide 查看调度到哪里了

#优雅删除

kubectl delete -f pod-node.yaml

#强制删除

kubectl delete -f pod-node.yaml --force --grace-period=0

2、nodeSelector:

指定 

pod 调度到具有哪些标签的 node 节点上

#给 node 节点打标签,打个具有 disk=ceph 的标签

kubectl label nodes god62 disk=ceph

kubectl get nodes god62 --show-labels

#定义 pod 的时候指定要调度到具有 disk=ceph 标签的 node 上

vim pod1.yaml

apiVersion: v1

kind: Pod

metadata:

  name: demo-pod-1

  namespace: default

  labels:

    app: myapp

    env: dev

spec:

  nodeSelector:    ##定义 pod 的时候指定要调度到具有 disk=ceph 标签的 node 上

    disk: ceph

  containers:

  - name: tomcat-pod-java

    ports:

    - containerPort: 8080

    image: tomcat:8.5-jre8-alpine

    imagePullPolicy: IfNotPresent

#更新,查看调度到哪里了

kubectl apply -f pod-1.yaml

kubectl get pods -o wide

# 查看kubectl describe pods demo-pod 详细信息

3.污点和容忍度

node 节点亲和性调度:nodeAffinity

kubectl explain pods.spec.affinity

FIELDS:

  nodeAffinity <Object>

    Describes node affinity scheduling rules for the pod.

  podAffinity  <Object>

    Describes pod affinity scheduling rules (e.g. co-locate this pod in the

    same node, zone, etc. as some other pod(s)).

  podAntiAffinity      <Object>

    Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod

    in the same node, zone, etc. as some other pod(s)).

#在查询kubectl explain pods.spec.affinity.nodeAffinity

preferredDuringSchedulingIgnoredDuringExecution <[]Object>

prefered 表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性 

requiredDuringSchedulingIgnoredDuringExecution <Object>

require 表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性

kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms

FIELDS:

matchExpressions <[]Object> matchFields <[]Object>

matchExpressions:匹配表达式的 matchFields: 匹配字段的

  nodeSelectorTerms    <[]Object> -required-          #required必须字段

kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms.matchFields

VERSION: v1

RESOURCE: matchExpressions <[]Object>

DESCRIPTION:

FIELDS:

key <string> -required- operator <string> -required- values <[]string>

key:检查 label

operator:做等值选则还是不等值选则 

values:给定值

使用 requiredDuringSchedulingIgnoredDuringExecution 硬亲和性 #把 myapp-v1.tar.gz 上传到 62 和 64 上,手动解压:

docker load -i myapp-v1.tar.gz

vim pod-nodeaffinity-demo.yaml

apiVersion: v1

kind: Pod

metadata:

        name: pod-node-affinity-demo

        namespace: default

        labels:

            app: myapp

            tier: frontend

spec:

    containers:

    - name: myapp

      image: ikubernetes/myapp:v1

    affinity:

        nodeAffinity:

            requiredDuringSchedulingIgnoredDuringExecution:

                  nodeSelectorTerms:

                  - matchExpressions:

                    - key: zone

                      operator: In

                      values:

                      - foo

                      - bar

spec:我们检查当前节点中有任意一个节点拥有 zone 标签的值是 foo 或者 bar,就可以把 pod 调度到 这个 node 节点的 foo 或者 bar 标签上的节点上

    containers:

    - name: myapp

      image: ikubernetes/myapp:v1

    affinity:

        nodeAffinity:

            requiredDuringSchedulingIgnoredDuringExecution:

                  nodeSelectorTerms:

                  - matchExpressions:

                    - key: zone

                      operator: In

                      values:

                      - foo

                      - bar

kubectl apply -f pod-nodeaffinity-demo.yaml 

 kubectl get pods -o wide | grep pod-node

status 的状态是 pending,上面说明没有完成调度,因为没有一个拥有 zone 的标签的值是 foo 或者 bar,而且使用的是硬亲和性,必须满足条件才能完成调度

kubectl label nodes god64 zone=foo

给这个 god64 节点打上标签 zone=foo,在查看

使用 preferredDuringSchedulingIgnoredDuringExecution 软亲和性

vi pod-nodeaffinity-demo-2.yaml

apiVersion: v1

kind: Pod

metadata:

        name: pod-node-affinity-demo-2

        namespace: default

        labels:

            app: myapp

            tier: frontend

spec:

    containers:

    - name: myapp

      image: ikubernetes/myapp:v1

    affinity:

        nodeAffinity:

            preferredDuringSchedulingIgnoredDuringExecution:

            - preference:

              matchExpressions:

              - key: zone1

                operator: In

                values:

                - foo1

                - bar1

              weight: 60

Pod 节点亲和性

pod 自身的亲和性调度有两种表示形式

podaffinity:pod 和 pod 更倾向腻在一起,把相近的 pod 结合到相近的位置,如同一区域,同 一机架,这样的话 pod 和 pod 之间更好通信,比方说有两个机房,这两个机房部署的集群有 1000 台主机,那么我们希望把 nginx 和 tomcat 都部署同一个地方的 node 节点上,可以提高 通信效率;

podunaffinity:pod 和 pod 更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于 反亲和性,这样相互之间不会有影响。

第一个 pod 随机选则一个节点,做为评判后续的 pod 能否到达这个 pod 所在的节点上的运行方 式,这就称为 pod 亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的;我们 在定义 pod 亲和性时需要有一个前提,哪些 pod 在同一个位置,哪些 pod 不在同一个位置,这 个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置, 节点名称不相同的表示不是一个位置。

kubectl explain pods.spec.affinity.podAffinity

podAffinity  亲和性

podAntiAffinity 反亲和性

requiredDuringSchedulingIgnoredDuringExecution: 硬亲和性 preferredDuringSchedulingIgnoredDuringExecution:软亲和性

topologyKey: 位置拓扑的键,这个是必须字段 怎么判断是不是同一个位置: rack=rack1

row=row1

使用 rack 的键是同一个位置

使用 row 的键是同一个位置

labelSelector:

我们要判断 pod 跟别的 pod 亲和,跟哪个 pod 亲和,需要靠 labelSelector,通过 labelSelector 选则一组能作为亲和对象的 pod 资源

namespace:

labelSelector 需要选则一组资源,那么这组资源是在哪个名称空间中呢,通过 namespace 指 定,如果不指定 namespaces,那么就是当前创建 pod 的名称空间

定义两个 pod,第一个 pod 做为基准,第二个 pod 跟着它走 cat pod-required-affinity-demo.yaml


apiVersion: v1

kind: Pod

metadata:

  name: pod-first

  labels:

    app: myapp

    tier: frontend

spec:

    containers:

    - name: myapp

      image: ikubernetes/myapp:v1

---

apiVersion: v1

kind: Pod

metadata:

  name: pod-second

  labels:

    app: backend

    tier: db

spec:

    containers:

    - name: busybox

      image: busybox:latest

      imagePullPolicy: IfNotPresent

      command: ["sh","-c","sleep 3600"]

    affinity:

      podAffinity:

        requiredDuringSchedulingIgnoredDuringExecution:

        - labelSelector:

              matchExpressions:

              - {key: app, operator: In, values: ["myapp"]}

          topologyKey: kubernetes.io/hostname

#              - {key: app, operator: In, values: ["myapp"]}.  key里面的app引用的是之前pod的labels的app

operator 的ln代表等值关系,values: ["myapp]对应app的 myapp ,靠第一个pod的标签对应亲和性,第二个标签会找标签app: myapp的标签

#更新看亲和性

kubectl apply -f pod-required-affinity-demo.yaml

kubectl get pods -o wide

看到pod-second跟pod-first在同一个节点

上面说明第一个 pod 调度到哪,第二个 pod 也调度到哪,这就是 pod 节点亲和性

kubectl delete -f pod-required-affinity-demo.yaml

pod 节点反亲和性

定义两个 

pod,第一个 pod 做为基准,第二个 pod 跟它调度节点相反

 cat pod-required-anti-affinity-demo.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod-first labels:

app: myapp

tier: frontend spec:

---

containers:

- name: myapp

image: ikubernetes/myapp:v1

apiVersion: v1 kind: Pod metadata:

name: pod-second labels:

app: backend

tier: db spec:

containers:

- name: busybox

image: busybox:latest

imagePullPolicy: IfNotPresent

command: ["sh","-c","sleep 3600"] affinity:

podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector:

matchExpressions:

- {key: app, operator: In, values: ["myapp"]} topologyKey: kubernetes.io/hostname

 kubectl apply -f pod-required-anti-affinity-demo.yaml 

 kubectl get pods -o wide 显示两个 pod 不在一个 node 节点上,这 就是 pod 节点反亲和性

pod-first running god64

pod-second running  god62

kubectl delete -f pod-required-anti-affinity-demo.yaml

换一个 topologykey

kubectl label nodes god62 zone=foo

kubectl label nodes god64 zone=foo

cat pod-required-anti-affinity-demo-1.yaml

apiVersion: v1

kind: Pod

metadata:

  name: pod-first

  labels:

    app: myapp

    tier: frontend

spec:

    containers:

    - name: myapp

      image: ikubernetes/myapp:v1

---

apiVersion: v1

kind: Pod

metadata:

  name: pod-second

  labels:

    app: backend

    tier: db

spec:

    containers:

    - name: busybox

      image: busybox:latest

      imagePullPolicy: IfNotPresent

      command: ["sh","-c","sleep 3600"]

    affinity:

      podAffinity:

        requiredDuringSchedulingIgnoredDuringExecution:

        - labelSelector:

              matchExpressions:

              - {key: app, operator: In, values: ["myapp"]}

          topologyKey: zone

kubectl apply -f pod-required-anti-affinity-demo.yaml 

kubectl get pods -o wide 显示如下:

pod-first running god64

pod-second pending

第二个节点现是 pending,因为两个节点是同一个位置,现在没有不是同一个位置的了,而且我 们要求反亲和性,所以就会处于 pending 状态,如果在反亲和性这个位置把 required 改成 preferred,那么也会运行。

podaffinity:pod 节点亲和性,pod 倾向于哪个 pod

nodeaffinity:node 节点亲和性,pod 倾向于哪个 node

tolerationSeconds参数含义:

假如说你原来node1节点没有污点,上面会有很多pod在运行,现在你把node1节点打个污点,排斥等级是NoExecute,这样你node1上的pod就会被驱逐走,那多长时间被撵走,取决于tolerationSeconds,这个参数知识在定义排斥等级是NoExecute的时候才会用到


相关文章

网友评论

      本文标题:pod学习3

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