前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 1.19.0——Pod(2)

Kubernetes 1.19.0——Pod(2)

原创
作者头像
gz_naldo
修改2020-09-21 10:46:16
6792
修改2020-09-21 10:46:16
举报

静态pod

如果apiserver没有运行的时候,master肯定是不能工作的

Master不能工作,那么是谁把apiserver运行起来的呢?

先有鸡还是先有蛋?

静态pod:不受master管理,完全是由kubelet来管理

所谓静态pod就是,不是master上创建的,而是需要到Node的/etc/kubelet.d/里创建一

个yaml文件,然后根据这个yaml文件,创建一个pod,这样创建出来的node,是不会

接受master的管理的。

静态pod用到的机会不多,这里不作主要演示

调度的三个对象

当我们创建一个pod的时候,scheduler会根据自己的算法来决定此pod到底在哪个节点上运行。

待调度pod列表

可用node列表

调度算法:主机过滤、主机打分

主机过滤

NoDiskConflict

PodFitsResources

PodFitsPorts

MatchNodeSelector

HostName

NoVolumeZoneConflict

PodToleratesNodeTaints

CheckNodeMemoryPressure

CheckNodeDiskPressure

MaxEBSVolumeCount

MaxGCEPDVolumeCount

MaxAzureDiskVolumeCount

MatchInterPodAffinity

GeneralPredicates

NodeVolumeNodeConflict

主机打分

LeastRequestedPriority

公式

score=cpu ( ( capacity - sum ( requested ) ) * 10 / capacity) + memory

( ( capacity - sum ( requested) ) * 10 / capacity )/2

BalanceResourceAllocation

公式

score = 10 -abs ( cpuFraction - memoryFraction ) * 10

CalculateSpreadPriority

公式

Score = 10 * ((maxCount -counts)/ (maxCount))

从两个方面来考虑,如何让pod在特定的节点上运行

1. node标签的方式

所有的对象都有标签  --show-labels

标签的格式:

键=值

xxxxx=yyyyy

对所有节点设置标签
对所有节点设置标签

kubectl label nodes --all aa=bb

对所有节点取消设置标签

kubectl label nodes --all aa-

修改内置标签
修改内置标签

kubectl label nodes vms62 node-role.kubernetes.io/worker1=""

手动指定pod运行位置

给vms63设置一个标签disktype=ssd
给vms63设置一个标签disktype=ssd
修改pod4.yaml,通过nodeSelector选择器定义,表示此pod只会在含有disktype=ssd的节点上运行
修改pod4.yaml,通过nodeSelector选择器定义,表示此pod只会在含有disktype=ssd的节点上运行

注:如果有62和63两台机器都有此标签,那么pod会选择一台运行

2. Node亲和性

软策略:尽可能的在满足条件的节点上运行,如果没有满足条件的节点则在其它节点上也能运行

硬策略:必须满足条件才能运行

affinity:

nodeAffinity:

# requiredDuringSchedulingIgnoredDuringExecution: # 硬策略

# nodeSelectorTerms:

# - matchExpressions:

# - key: kubernetes.io/hostname

# operator: In

# values:

# - vms63

# - vms62

Operator的值还可以为NotIn,Exists,DoesNotExist

创建一个deployment,并添加硬策略配置
创建一个deployment,并添加硬策略配置

kubectl create deployment web1 --image=nginx --dry-run=client -o yaml > web1.yaml

红框中的values可以指定在哪台机器上运行,根据情况修改即可

只在vms62上运行
只在vms62上运行

也可在多台机器上运行,为节约篇幅这里不作演示

preferredDuringSchedulingIgnoredDuringExecution: # 软策略

- weight: 2

preference:

matchExpressions:

- key: bb

operator: Gt

values:

- "3

Values设置成vms62意思是优先在62这台机器运行
Values设置成vms62意思是优先在62这台机器运行

调度:警戒线cordon

如果把某个节点设置了cordon,则这个节点会被设置为不可调度,再创建新的pod的时候是不会调度到此节点上的

创建8个副本的pod
创建8个副本的pod
通过kubectl cordon vms63设置63这台机器的cordon,则新创建的pod就不会调度到此节点,但不会影响之前创建好的pod
通过kubectl cordon vms63设置63这台机器的cordon,则新创建的pod就不会调度到此节点,但不会影响之前创建好的pod
由此可见,新创建的pod将不会运行在被设置了cordon的节点上
由此可见,新创建的pod将不会运行在被设置了cordon的节点上

通过kubectl uncordon vms63取消cordon后恢复正常

调度:节点的drain

如果一个节点被设置为drain,则此节点不再被调度pod,

且此节点上已经运行的pod会被驱逐(evicted)到其他节点,用于节点的维护

kubectl drain vms63 --ignore-daemonsets

kubectl uncordon vms63

此操作不在这里单独演示

调度:节点taint及pod的tolerations

之前的pod都在worker上创建,为什么没有在master上创建呢?

因为设置了污点taint

而另外两台机器是没有污点taint的
而另外两台机器是没有污点taint的
检查vms62和vms63上没有设置污点
检查vms62和vms63上没有设置污点
通过kubectl taint nodes vms63 keyxx=valuexx:NoSchedule将vms63设置污点
通过kubectl taint nodes vms63 keyxx=valuexx:NoSchedule将vms63设置污点
因为之前设置了nodeSelector来让此pod运行至vms63节点,现在给此节点加了taint后再创建pod将会一直处于pending状态
因为之前设置了nodeSelector来让此pod运行至vms63节点,现在给此节点加了taint后再创建pod将会一直处于pending状态

通过kubectl taint nodes vms63 keyxx-取消污点设置

如果非要在有污点的机器上运行pod怎么办?那就需要配置能够容忍污点

tolerations:

- key:"keyxx"

operator:"Equal"

value:"valuexx"

effect:"NoSchedule"

此参数设置意为能够容忍key为”keyxx”并且value为”valuexx”的污点 成功运行至有污点的机器
此参数设置意为能够容忍key为”keyxx”并且value为”valuexx”的污点 成功运行至有污点的机器

跟之前的cordon一样,通过设置63这台机器的污点,已经成功运行的pod不受影响

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态pod
  • 调度的三个对象
    • 主机过滤
      • 主机打分
        • 手动指定pod运行位置
          • 调度:警戒线cordon
            • 调度:节点的drain
              • 调度:节点taint及pod的tolerations
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档