企业入门实战--k8s之kubernetes调度

企业入门实战--k8s之kubernetes调度

简介

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。

kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。

在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等

nodeName

nodeName 是节点选择约束的最简单方法,但一般不推荐。如果 nodeName 在 PodSpec 中指定了,则它优先于其他的节点选择方法。

使用 nodeName 来选择节点的一些限制:
如果指定的节点不存在。
如果指定的节点没有资源来容纳 pod,则pod 调度失败。
云环境中的节点名称并非总是可预测或稳定的。

创建工作目录并进入,编写资源清单

mkdir schedu
cd schedu/
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

拉起容器进行查看

kubectl apply -f pod.yaml
kubectl get pod

请添加图片描述
此时的pod正在等待状态因为没有符合的标签 这时给node节点加上对应标签

kubectl label nodes server3 disktype=ssd
kubectl get pod -o wide

请添加图片描述
Node的标签发生变化,导致亲和性策略不能满足,则继续运行当前的Pod。

kubectl label  nodes server3 disktype-
kubectl get pod

请添加图片描述

节点亲和性

vim pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - server3
               - server4
#      preferredDuringSchedulingIgnoredDuringExecution:
#      - weight: 1
#        preference:
#          matchExpressions:
#          - key: disktype
#            operator: In
#            values:
#            - ssd 

先注释掉倾向满足部分
拉起容器发现倾向满足server3

kubectl apply -f pod1.yaml
kubectl get pod -o wide

请添加图片描述
为server3添加标签ssd,删除节点重启拉起容器,服务亲和到server4
vim pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: node-affinity
spec:
  containers:
  - name: nginx
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - server3
               - server4
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd     

为server4打上ssd的标签

kubectl label  nodes server4 disktype=ssd
kubectl apply -f pod1.yaml
kubectl get pod -o wide

这时由于节点亲和性服务运行在了server4上
请添加图片描述

pod亲和性

亲和
server1
将所需的镜像上传至仓库

docker load -i mysql-xtrabackup.tar

docker push reg.westos.org/library/xtrabackup:1.0

请添加图片描述

server2
vim pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
     - name: "MYSQL_ROOT_PASSWORD"
       value: "westos"
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - nginx
        topologyKey: kubernetes.io/hostname

拉起容器

kubectl apply  -f pod2.yaml

kubectl get pod -o wide  看到nginx和mysql在一块运行

请添加图片描述
反亲和
编辑pod2.yaml文件

vim pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
     - name: "MYSQL_ROOT_PASSWORD"
       value: "westos"
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - nginx
        topologyKey: kubernetes.io/hostname
 kubectl delete  pod mysql 
kubectl apply  -f pod2.yaml 
kubectl get pod -o wide  看到nginx和mysql不在一块运行


请添加图片描述

Taints污点与容忍

aints(污点)是Node的一个属性,设置了Taints后,所以Kubernetes是不会将Pod调度到这个Node上的,于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。

kubectl taint nodes node1 key=value:NoSchedule	#创建
kubectl describe nodes  server1 |grep Taints		#查询
kubectl taint nodes node1 key:NoSchedule-		#删除


示例:
server2为k8smaster主机,默认会不加入集群调度,
查看server2污点

kubectl describe nodes server2|grep Taint

请添加图片描述

测试1:Nodename可以无视任何污点
编辑资源清单创建pod,采用nodename指定node节点

vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
#  nodeSelector:
#    disktype: ssd

                  

拉起容器

kubectl apply -f pod.yaml
kubectl get pod

请添加图片描述

查看节点所在node

kubectl get pod -o wide

请添加图片描述

server2作为master且设置了污点,但是nodename可以无视污点。
测试完成删除测试pod

为server2设置标签,使用标签方式测试污点

kubectl label nodes server2 roles=master
kubectl get nodes --show-labels

在这里插入图片描述
编辑资源清单,使用标签方式选择node

[root@server2 schedu]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    roles: master

[root@server2 schedu]# kubectl apply -f pod.yaml 
[root@server2 schedu]# kubectl get pod -o wide

拉起容器,发现pod处于pending,不能成功

在这里插入图片描述
测试证明,标签选择无法覆盖污点。

添加容忍

[root@server2 schedu]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    roles: master
  tolerations:
  - operator: "Exists"
    effect: "NoSchedule"

添加容忍,NoSchedule:POD 不会被调度到标记为 taints 节点。

kubectl taint nodes server3 key=value:NoSchedule

server3上存在污点

kubectl describe nodes server3|grep Taint

在这里插入图片描述
注释容忍,拉起容器,发现容器在server4端运行,说明污点生效。

[root@server2 schedu]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
#  nodeSelector: 
#    roles: master
#  tolerations:
#  - operator: "Exists"
#    effect: "NoSchedule"

在这里插入图片描述
删除pod.yaml后,打开容忍,通过标签选择server3

[root@server2 schedu]# vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd
  tolerations:
  - operator: "Exists"
    effect: "NoSchedule"

在这里插入图片描述
完成后取消NoSchedule的值

kubectl taint node server3 key:NoSchedule-

NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。被驱逐到其他node节点

kubectl taint nodes server3 key=value:NoExecute

在这里插入图片描述

测试完成,取消NoExecute的值

kubectl taint nodes server3 key:NoExecute-

在这里插入图片描述
关闭server3的所有调度

kubectl cordon server3
kubectl get node

在这里插入图片描述

关闭server3的调度,但不关闭部分必要pod

kubectl drain server3
kubectl get node

在这里插入图片描述
关闭server3的调度,但不关闭部分必要pod

kubectl drain server3
kubectl get node

在这里插入图片描述
删除node

kubectl delete node server3

在这里插入图片描述
server3重新加入k8s集群

 systemctl restart kubelet.service 

控制端查看,server3加入集群
在这里插入图片描述
删除node的步骤为:先驱逐pod,再删除node。

拓展
当有新的node想加入k8s集群中,我们就需要生成新的token,注意,每一次生成的token只有24小时有效期

在控制端上生成token
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章介绍docker的前世今生,了 解docker的实现原理,以Django项目为例,教大家如何编写最佳的Dockerfile实现构业务镜像的制作。通过本章的学习,大家会知道docker的概念及基本操作,并学会构建自己的业务镜像,并通过抓包的方式掌握Docker最常用的bridge网络模式的通信。第二章本章学习kubernetes的架构及工作流程,重点介绍如本章学习kubernetes的架构及工作流程,重点介绍如断的滚动更新,通过服务发现来实现集群内部的服务间访问,并通过ingress- -nginx实现外部使用域名访问集群内部的服务。同时介绍基于EFK如何搭建Kubernetes集群的日志收集系统。学完本章,我们的Django demo项目已经可以运行在k8s集群中,同时我们可以使用域名进行服务的访问。第三章本章基于k8s集群部署gitlab、sonarQube、 Jenkins等工具,并把上述工具集成到Jenkins中,以Django项目为例,通过多分支流水线及Jenkinsfle实现项目代码提交到不同的仓库分支,实现自动代码扫描、单元测试、docker容器构建、k8s服务的自动部署。第四章由于公司内部项目众多,大量的项目使用同一套流程做CICD,那么势必会存在大量的重复代码,因此本章主要通过使用groovy实现Jenkins的sharedL ibrary的开发,以提取项目在CICD实践过程中的公共逻辑,提供一系列的流程的接口供公司内各项目调用,开发完成后,还是以Django的demo项目为例,进行Jenkinsfle的改造,最后仅需通过简单的Jenkinsfle的配置,即可优雅的完成CICD流程的整个过程,此方式已在大型企业内部落地应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值