K8S自己动手系列 - 1.3 - Taint & Affinity
Taint
please refer https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
三种taint:
- NoSchedule
- PreferNoSchedule
- NoExecute
为节点打Taint
~ kubectl taint node worker02 role=nginx:NoSchedule node/worker02 tainted ~ kubectl describe node worker02 Name: worker02 ... Taints: role=nginx:NoSchedule ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-748j6 1/1 Running 0 5m21s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 5m22s 10.244.1.35 worker02 <none> <none>
通过查看pod,发现已经运行的pod并未受影响
扩容pod,看下效果
~ kubectl scale --replicas=5 deployment/nginx deployment.extensions/nginx scaled ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-4rjhf 0/1 ContainerCreating 0 1s <none> worker01 <none> <none> nginx-7cffb9df96-748j6 1/1 Running 0 6m8s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-89ngr 0/1 ContainerCreating 0 1s <none> worker01 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 6m9s 10.244.1.35 worker02 <none> <none> nginx-7cffb9df96-zsgmd 0/1 ContainerCreating 0 1s <none> worker01 <none> <none>
通过实验发现由于taint NoSchedule的影响,新pod不会调度到含有污点的节点上
移除节点Taint
~ kubectl taint node worker02 role:NoSchedule- node/worker02 untainted
再次扩容,查看效果
~ kubectl scale --replicas=10 deployment/nginx deployment.extensions/nginx scaled ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-7cffb9df96-2wlln 1/1 Running 0 4s 10.244.1.38 worker02 <none> <none> nginx-7cffb9df96-4rjhf 1/1 Running 0 3m10s 10.244.0.26 worker01 <none> <none> nginx-7cffb9df96-748j6 1/1 Running 0 9m17s 10.244.0.23 worker01 <none> <none> nginx-7cffb9df96-89ngr 1/1 Running 0 3m10s 10.244.0.24 worker01 <none> <none> nginx-7cffb9df96-9vbdt 1/1 Running 0 4s 10.244.1.36 worker02 <none> <none> nginx-7cffb9df96-d2rt5 1/1 Running 0 9m18s 10.244.1.35 worker02 <none> <none> nginx-7cffb9df96-hqvfh 1/1 Running 0 4s 10.244.1.37 worker02 <none> <none> nginx-7cffb9df96-mhxmn 1/1 Running 0 4s 10.244.1.40 worker02 <none> <none> nginx-7cffb9df96-xdnzc 1/1 Running 0 4s 10.244.1.39 worker02 <none> <none> nginx-7cffb9df96-zsgmd 1/1 Running 0 3m10s 10.244.0.25 worker01 <none> <none>
发现新增加的pod已经可以调度到worker02上了
容忍节点Taint
重新为节点增加污点
~ kubectl taint node worker02 role=nginx:NoSchedule node/worker02 tainted
然后在deploy定义中增加:
tolerations: - key: "role" operator: "Equal" value: "nginx" effect: "NoSchedule"
通过kubectl diff -f xxx.yaml可以查看变化情况
lab02 kubectl diff -f nginx-deploy.yaml diff -u -N /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx --- /tmp/LIVE-021075426/extensions.v1beta1.Deployment.default.nginx 2019-06-09 15:53:54.120907334 +0800 +++ /tmp/MERGED-503027673/extensions.v1beta1.Deployment.default.nginx 2019-06-09 15:53:54.128907426 +0800 @@ -4,7 +4,7 @@ annotations: deployment.kubernetes.io/revision: "8" creationTimestamp: "2019-06-08T04:27:19Z" - generation: 23 + generation: 24 labels: app: nginx name: nginx @@ -14,7 +14,7 @@ uid: b43106be-89a5-11e9-8ec2-080027a62701 spec: progressDeadlineSeconds: 2147483647 - replicas: 1 + replicas: 2 revisionHistoryLimit: 2147483647 selector: matchLabels: @@ -42,6 +42,11 @@ schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 + tolerations: + - effect: NoSchedule + key: role + operator: Equal + value: nginx status: availableReplicas: 1 conditions: exit status 1
再次扩容,查看效果
lab02 kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-859959cc7f-7sx2p 1/1 Running 0 4s 10.244.0.38 worker01 <none> <none> nginx-859959cc7f-8tpw7 1/1 Running 0 4s 10.244.0.39 worker01 <none> <none> nginx-859959cc7f-ffh7v 1/1 Running 0 4s 10.244.1.49 worker02 <none> <none> nginx-859959cc7f-j2xp7 1/1 Running 0 4s 10.244.0.37 worker01 <none> <none> nginx-859959cc7f-lht8b 1/1 Running 0 4s 10.244.1.47 worker02 <none> <none> nginx-859959cc7f-mcth6 1/1 Running 0 17s 10.244.0.36 worker01 <none> <none> nginx-859959cc7f-sx5ln 1/1 Running 0 4s 10.244.1.48 worker02 <none> <none> nginx-859959cc7f-tlxk5 1/1 Running 0 4s 10.244.1.46 worker02 <none> <none> nginx-859959cc7f-xkjtq 1/1 Running 0 4s 10.244.1.45 worker02 <none> <none> nginx-859959cc7f-xltkz 1/1 Running 0 17s 10.244.1.44 worker02 <none> <none>
Affinity
上面通过节点污点的方式,我们可以避免pod被调度到含有污点的节点,同时也可以使某些pod容忍节点的污点,配合下面要说的affinity,可以实现特定节点为特定pod专用的目的
NodeSelector
在pod定义中增加如下:
nodeSelector: kubernetes.io/hostname: worker02
执行查看效果
lab02 kubectl apply -f nginx-deploy-toleration-nodeselector.yaml deployment.extensions/nginx configured lab02 kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-564c745dcd-6dtz7 1/1 Running 0 25s 10.244.1.56 worker02 <none> <none> nginx-564c745dcd-fw8kt 1/1 Running 0 25s 10.244.1.55 worker02 <none> <none> nginx-564c745dcd-l8k7m 1/1 Running 0 22s 10.244.1.58 worker02 <none> <none> nginx-564c745dcd-mvqjd 1/1 Running 0 28s 10.244.1.53 worker02 <none> <none> nginx-564c745dcd-qn6r9 1/1 Running 0 29s 10.244.1.52 worker02 <none> <none> nginx-564c745dcd-rbl57 1/1 Running 0 27s 10.244.1.54 worker02 <none> <none> nginx-564c745dcd-s2jbm 1/1 Running 0 19s 10.244.1.59 worker02 <none> <none> nginx-564c745dcd-wnd45 1/1 Running 0 30s 10.244.1.50 worker02 <none> <none> nginx-564c745dcd-zlnfg 1/1 Running 0 30s 10.244.1.51 worker02 <none> <none> nginx-564c745dcd-zm7qx 1/1 Running 0 22s 10.244.1.57 worker02 <none> <none>
NodeAffinity
NodeAffinity与NodeSelector有相似的作用,但是相比之下有更加灵活的表达语义
please refer: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
云上快速搭建Serverless AI实验室
Serverless Kubernetes和ACK虚拟节点都已基于ECI提供GPU容器实例功能,让用户在云上低成本快速搭建serverless AI实验室,用户无需维护服务器和GPU基础运行环境,极大降低AI平台运维的负担,显著提升整体计算效率。 如何使用GPU容器实例 在pod的annotation中指定所需GPU的类型(P4/P100/V100等),同时在resource.limits中指定GPU的个数即可创建GPU容器实例。每个pod独占GPU,暂不支持vGPU,GPU实例的收费与ECS GPU类型收费一致,不产生额外费用,目前ECI提供多种规格的GPU类型。(请参考https://help.aliyun.com/document_detail/114581.html) 示例 1. 创建Serverless Kubernetes集群
- 下一篇
K8S自己动手系列 - 2.1 - Pod
说在最前 Pod作为Kubernetes的一等公民,是K8S调度的最小单元,也是使用Kubernetes的人打交道最多的K8S模型。既然Pod这么重要,搞清楚Pod的各种功能及操作就非常重要了,理解了Pod以后,各种Pod的控制器组件,例如:Deployment,StatefulSet,DaemonSet, Job,ReplicaSet理解起来才能事半功倍。 正篇 阅读官方文档对Pod的描述,其阐述了Pod在集群中的两种主要使用方式: 一个Pod运行一个容器 一个Pod运行多个需要在一起的容器 由于前面的实验,我们已经使用过Deployment部署简单的nginx容器,这种就属于第一种,一个Pod运行一个容器的模型,所以本篇文章我们来实战一下,一个Pod运行多个相互关联的容器。 实战 场景说明 本文以常用blog应用wordpress+mysql为例,将wordpress与mysql运行在同一个Pod内,并实现同Pod的相互访问。 本文实验所有的源码保存在:https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/l...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7