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

相关推荐
格桑阿sir12 分钟前
Kubernetes控制平面组件:Kubelet详解(三):CRI 容器运行时接口层
docker·kubernetes·containerd·kubelet·cri-o·容器运行时·cri
hwj运维之路11 小时前
k8s监控方案实践(三):部署与配置Grafana可视化平台
云原生·kubernetes·grafana
yt9483211 小时前
Docker-基础(数据卷、自定义镜像、Compose)
运维·docker·容器
zizisuo11 小时前
9.3.云原生架构模式
云原生·架构
Hfc.11 小时前
docker-daemon.json
docker·容器·json
和计算机搏斗的每一天11 小时前
k8s之探针
云原生·容器·kubernetes
项目題供诗17 小时前
黑马k8s(四)
云原生·容器·kubernetes
杰克逊的日记17 小时前
大项目k8s集群有多大规模,多少节点,有多少pod
云原生·容器·kubernetes
小张童鞋。17 小时前
k8s之k8s集群部署
云原生·容器·kubernetes
long_214517 小时前
k8s中ingress-nginx介绍
kubernetes·ingress-nginx