kubernetes第七天

1.影响pod调度的因素

nodeName 节点名

resources 资源限制

hostNetwork 宿主机网络

污点

污点容忍

Pod亲和性

Pod反亲和性

节点亲和性

2.污点

通常是作用于worker节点上,其可以影响pod的调度

语法:key[=value]:effect

effect:[ɪˈfekt]

effect必须是NoSchedule、PreferNoSchedule或NoExecute。

NoSchedule: [noʊ,ˈskedʒuːl]

该节点不再接收新的Pod调度,但不会驱赶已经调度到该节点的Pod。

PreferNoSchedule: [prɪˈfɜːr,noʊ,ˈskedʒuː]
该节点可以接受调度,但会尽可能将Pod调度到其他节点,换句话说,让该节点的调度优先级降低啦。

NoExecute:[ˈnoʊ,eksɪkjuːt]
该节点不再接收新的Pod调度,与此同时,会立刻驱逐已经调度到该节点的Pod。

1.查看节点污点

kubectl describe nodes

2.创建10个pod,发现pod调度在232和233节点上

3.给k8s232打上污点

kubectl taint node k8s232 wudianmingzi=wudian:NoExecute

4.查看污点kubectl describe nodes|grep Taints,发现此时已经有污点

5.查看pod信息,发现此时所有pod都调度到k8s233上

6.移除污点:kubectl taint node k8s232 wudianmingzi-

7.移除污点,从新创建pod之后,pod能重新调度到pod上

命令总结:

复制代码
查看污点:
kubectl describe nodes|grep Taints
制造污点帮助信息
kubectl taint --help
制造污点
kubectl taint node 节点名 key=value:NoExecute
value可省略
移除污点
kubectl taint node k8s232 key-

NoExecute  移除现在节点所有的pod
NoSchedule 不移除,但是不会有新的pod
PreferNoSchedule  优先级降低

3.污点容忍

pod.spec.tolerations

复制代码
spec:
      # 配置Pod的污点容忍
      tolerations:
        # 指定污点的key
        # 若不指定key,则operator的值必须为Exists,表示匹配所有的key
      - key: qq
        # 指定污点的value
        value: ww
        # 指定污点的effect,有效值为: NoSchedule, PreferNoSchedule,NoExecute
        # 若不指定则匹配所有的影响度。
        effect: NoExecute
        # 表示key和value的关系,有效值为Exists, Equal。
        #    Exists:
        #      表示存在指定的key即可,若配置,则要求value字段为空。
        #    Equal:
        #      默认值,表示key=value。
        operator: Equal
      - key: web
        operator: Exists
      - key: node-role.kubernetes.io/master
        operator: Exists
      # 如果不指定key,value,effect,仅配置"operator: Exists"表示无视任何污点!
      #- operator: Exists

例1:匹配所有key为web,value值为空,effect为NoExecute的污点

复制代码
tolerations:
- key: "web"
  operator: "Exists"  # 当value为空时,使用Exists表示key存在即可
  effect: "NoExecute"

例2:匹配所有key为test,值为version1,effect为所有的污点

复制代码
tolerations:
- key: "test"
  operator: "Equal"  # 当指定了具体的value时,使用Equal进行匹配
  value: "version1"
  effect: "*"  # "*"表示匹配所有可能的effect值

例3:忽视所有污点

复制代码
tolerations:
- operator: "Exists"  # 使用Exists且不指定key和effect,表示容忍所有污点

补充:实现pod调度到特定两个pod上

给节点打标签:

kubectl label nodes k8s231 key=value

选择调度的节点(所有节点忽视所有污点,如上例三配置)

复制代码
spec:
  nodeSelector:
     key=value
     ...
注意:节点必须包含所有这里的标签,才会被选上

所有节点删除标签

kubectl label nodes --all key-

但是这样子当两个节点,比如节点a,key=value1,key2=value2,此时无法满足,所有引入了亲和性。

4.节点亲和性

查看相关信息

三种类型:节点亲和性,pod亲和性,pod反亲和性

节点亲和性:

节点亲和性会匹配各个节点的标签,如果匹配成功则会调度到这个节点,如下代码,pod会调度到标签为eat=shaokao或者eat=longxia的节点上

复制代码
affinity:
        # 定义节点的亲和性
        nodeAffinity:
          # 定义硬限制
          requiredDuringSchedulingIgnoredDuringExecution:
            # 定义节点的匹配条件
            nodeSelectorTerms:
              # 基于节点的标签进行匹配
              - matchExpressions:
                # 指定标签的key
                - key: eat
                  # 指定标签的value
                  values:
                    - shaokao
                    - longxia
                  # 指定key和value之间的对应关系
                  operator: In



# 指定key和value之间的对应关系,有效值如下:
                #   In:
                #     key的值必须在vlaues内。要求values不能为空。
                #   NotIn:
                #     和In相反。要求values不能为空。
                #   Exists:
                #     只要存在指定key即可,vlaues的值必须为空。
                #   DoesNotExist:
                #     只要不存在指定key即可,vlaues的值必须为空。
                #   Gt:
                #     表示大于的意思,values的值会被解释为整数。
                #   Lt:
                #     表示小于的意思,values的值会被解释为整数。

如图

5.pod亲和性与反亲和性

pod的亲和性,当拓扑域topologyKey匹配的节点标签的key匹配成功,则所有pod都往节点标签是这个key的节点调度,比方说在广州,深圳,佛山三地都有服务器,想让所有pod都调度到其中一地 。如何实现:

1.给不同地址的节点打标签

kubectl label node k8s231 place=guangzhou

kubectl label node k8s232 place=shenzhun

kubectl label node k8s233 place=foshan

如图所示,通过设置节点亲和性,拓扑域topologyKey,设为标签的key(这里为place),即可完成上述需求。

此时所有pod都会调度到其中一地。

反亲和性:将podAddinity改为podAntiAffinity,其他不变,此时每个topologyKey标签只能调度一个pod。若没有足够的节点(每个节点的标签place的值应该与其他不同),则剩下的pod将会处于penging状态。

6.DaemonSet

DaemonSet概述:

DaemonSet确保全部worker节点上运行一个Pod的副本。

DaemonSet的一些典型用法:

(1)在每个节点上运行集群守护进程(flannel等)

(2)在每个节点上运行日志收集守护进程(flume,filebeat,fluentd等)

(3)在每个节点上运行监控守护进程(zabbix agent,node_exportor等)

温馨提示:

(1)当有新节点加入集群时,也会为新节点新增一个Pod;

(2)当有节点从集群移除时,这些Pod也会被回收;

(3)删除DaemonSet将会删除它创建的所有Pod;

(4)如果节点被打了污点的话,且DaemonSet中未定义污点容忍,则Pod并不会被调度到该节点上;("flannel案例")

7.pod的驱逐与节点退出集群

应用场景:node因为硬件故障或者其他原因要下线。

1.驱逐Pod并打SchedulingDisable标签,但不会驱逐ds资源调度的pod

kubectl drain k8s233 --ignore-daemonsets

2.配置污点,将ds资源进行立即驱逐Pod。

kubectl taint nodes k8s233.oldboyedu.com classroom=jiaoshi05:NoExecute

3.登录要下线的节点并重置kubeadm集群环境,执行以下命令

kubeadm reset -f

rm -rf /etc/cni/net.d && iptables -F && iptables-save

systemctl disable kubelet

4.删除要下线的节点

kubectl delete nodes k8s233

5.该node节点关机

8.kubeadm快速将节点加入集群

1.安装必要组件

1.1配置软件源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF

kubernetes

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=0

repo_gpgcheck=0

EOF

1.2安装kubeadm,kubelet,kubectl软件包

yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

1.3 启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!)

systemctl enable --now kubelet

systemctl status kubelet

2.在master组件创建token

2.1 创建一个永不过期的token,并打印加入集群的命令

kubeadm token create --print-join-command wdsuik.hjkrtvcioawsdfgh --ttl 0

2.2查看现有的token

kubeadm token list

3.worker节点加入集群

3.1在work节点执行2.1打印出来的加入集群的命令

3.2删除token:kubeadm token delete wdsuik

4.查看节点

kubectl get nodes

9.

(1)所有worker节点安装ipvs相关组件

yum -y install conntrack-tools ipvsadm.x86_64

(2)编写加载ipvs的配置文件

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

(3)加载ipvs相关模块并查看

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

4.1仅需修改工作模式("mode")为ipvs即可。

kubectl -n kube-system edit cm kube-proxy

4.2 验证是否修改成功:kubectl -n kube-system describe cm kube-proxy | grep mode

(5)删除旧的kube-proxy,最好逐个删除pod

kubectl get pods -A | grep kube-proxy | awk '{print $2}' | xargs kubectl -n kube-system delete pods

(6)验证kube-proxy组件工作模式是否生效

kubectl get pods -A | grep kube-proxy

kubectl logs kube-proxy-k6mrc -n kube-system

ipvsadm -ln | grep 10.200.100.200 -A 3

相关推荐
❀͜͡傀儡师1 小时前
Docker部署搜索引擎SearXNG
运维·docker·容器·searxng
泡沫冰@1 小时前
K8S集群管理(3)
云原生·容器·kubernetes
麦兜*2 小时前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
LQ深蹲不写BUG3 小时前
微服务事务管理利器:Seata 核心原理与实践指南
微服务·云原生·架构
nathan05294 小时前
Kubernetes 实战练习指南
云原生·容器·kubernetes
無名之輩4 小时前
Nvidia Device Plugin入门二之envvar策略
kubernetes
云和数据.ChenGuang6 小时前
微服务技术栈
微服务·云原生·架构
syty20206 小时前
K8s是什么
容器·kubernetes·dubbo
江团1io07 小时前
微服务雪崩问题与系统性防御方案
微服务·云原生·架构
Evan Wang8 小时前
使用Terraform管理阿里云基础设施
阿里云·云原生·terraform