pod学习3


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的时候才会用到


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容