污点和容忍 亲和性

  • Taint需要和Toleration配合使用,让Pod避开那些不合适的Node。在 Node上设置一个或多个Taint之后,除非Pod明确声明能够容忍这些污 点,否则无法在这些Node上运行。Toleration是Pod的属性,让Pod能够 (注意,只是能够,而非必须)运行在标注了Taint的Node上
  • 排斥等级 (effect)驱逐策略
  • 污点: 给node打污点 容忍度: pod 去容忍污点节点
    • 污点是配置在节点服务器上 容忍度: 配置pod里的
  • # 设置污点 kubectl taint nodes node1 key=value:effect

# 去除污点 kubectl taint nodes node1 key:effect-  删掉的话不会自动回来 之后的可以调度

# 去除所有污点 kubectl taint nodes node1 key-

kubectl describe node k8s-master-1  |grep -I taint (tolerations)查看

Taints:             node-role.kubernetes.io/master:NoSchedule

用kubeadm搭建的集群,默认就会给master节点添加一个污点标记,所以pod就不会调度到master节点上.

  • kubectl drain命令只是将Pod从指定节点上驱逐,并不会对节点本身进行任何操作。如果需要对节点进行维护或升级,需要在驱逐Pod后手动执行相应的操作。完成节点维护后,可以使用kubectl uncordon命令将节点重新标记为可调度状态。drain 驱逐的是非管理类的pod,daemonset的pod和kube-system里的pod,不会被驱逐 [root@k8s-node-2 ~]# kubectl drain k8s-node-2 --force --ignore-daemonsets

调度优先顺序:定向(noexcute)>定向(nosheduler)>污点容忍度>亲和性(主动 熟悉的)>自动调度

       根据pod调度策略和方法:

       1.deployment:   全自动调度 --》根据每台节点服务器的综合算力(CPU,内存,带宽,已经运行的pod等)

    2.nodename  节点名字

       3.node selector:定向调度-->根据node的标签去调度

       4.nodeaffinity   节点亲和性 --》尽量把不同的pod放到一台node上

       5.podaffinity     pod亲和性--》尽量把相同的pod放到一起

       6.taints和tolerations  污点和容忍度

使用污点容忍的场合:node要关机或者升级,被在这台node节点上的pod全部驱逐到其他pod上

[root@master ~]# kubectl explain pod.spec.tolerations  容忍的配置

......

FIELDS:

key # 对应着要容忍的污点的键,空意味着匹配所有的键

value # 对应着要容忍的污点的值

operator # key-value的运算符,支持Equal和Exists(默认)

effect # 对应污点的effect,空意味着匹配所有影响

tolerationSeconds # 容忍时间, 当effect为NoExecute时生效,表示pod在Node上的停留时间

apiVersion: v1

kind: Pod

metadata:

name: pod-toleration

namespace: dev

spec:

containers:

- name: nginx

image: nginx:1.17.1

tolerations: # 添加容忍

- key: "tag" # 要容忍的污点的key

下面看一下容忍的详细配置:

operator: "Equal" # 操作符

value: "heima" # 容忍的污点的value

effect: "NoExecute" # 添加容忍的规则,这里必须和标记的污点规则相同

创建一个daemonset控制器,启动一个pod(nginx),在master节点也可以运行

[root@k8s-master-1 nginx]# kubectl describe node k8s-master-1|grep -i taints

Taints:             node-role.kubernetes.io/master:NoSchedule

[root@k8s-master-1 nginx]# cat daemonset.yaml

apiVersion: apps/v1

kind: DaemonSet

metadata:

  name: taint-nginx-toleration

  namespace: default

spec:

  selector:

    matchLabels:

      appdaemonset: nginx

  template:

    metadata:

      name: taint-nginx-toleration

      labels:

        appdaemonset: nginx

    spec:

      containers:

      - name: taint-nginx-toleration

        image: nginx:latest

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 80     #是一个数组

      tolerations:

      - key: "node-role.kubernetes.io/master"

        operator: "Exists"

        effect: "NoSchedule"

[root@k8s-master-1 nginx]# kubectl get daemonset -o wide

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE    CONTAINERS               IMAGES         SELECTOR

taint-nginx-toleration   3         3         3       3            3           <none>          100s   taint-nginx-toleration   nginx:latest   appdaemonset=nginx

cordon        标记 node 为 unschedulable   警戒

uncordon      标记 node 为 schedulable

kubectl  drain :The given node will be marked unschedulable to prevent new pods from arriving.

[root@k8s-node-2 ~]# kubectl  drain k8s-node-2 --force --ignore-daemonsets

node/k8s-node-2 already cordoned

WARNING: ignoring DaemonSet-managed Pods: default/taint-nginx-toleration-gxx6m, kube-system/calico-node-6pxcb, kube-system/fluentd-elasticsearch-5fkj2, kube-system/kube-proxy-lzjkx

node/k8s-node-2 drained

[root@k8s-master-1 nginx]# kubectl get nodes --show-labels  查看

亲和性affinity

nodeaffinity配置项

在Kubernetes(K8s)中,会话亲和性(Session Affinity)是一种用于负载均衡的重要概念,它确保了来自同一用户的请求被转发到同一个后端服务,从而保持会话状态的一致性。以下是关于K8s会话亲和性的详细解释:
一、会话亲和性的定义
在分布式系统中,会话亲和性是指将用户请求路由到同一个后端服务器,以确保会话状态的一致性。在Kubernetes集群中,由于存在多个后端服务实例,且这些实例可能会因为负载均衡机制而接收来自不同用户的请求,因此需要通过会话亲和性策略来确保来自同一用户的请求始终被转发到同一个后端服务。

二、会话亲和性的类型
Kubernetes提供了两种常见的会话亲和性策略:
ClientIP:基于客户端的IP地址,将具有相同IP地址的请求路由到同一个后端服务。这种策略适用于相同IP地址下的请求通常表示来自同一个用户的场景。然而,需要注意的是,在存在IP地址共享的情况(如代理服务器、负载均衡器等)时,这种策略可能会导致会话状态不一致。
ClientIP绑定:基于客户端的IP地址和端口号的绑定,将具有相同IP和端口号的请求路由到同一后端服务。相对于ClientIP策略,ClientIP绑定策略更加精细,可以有效应对IP地址共享的情况,确保会话状态的一致性。
三、会话亲和性的配置
在Kubernetes中,可以通过在Service资源的配置中添加sessionAffinity字段来设置会话亲和性策略。例如,要将Service的会话亲和性策略设置为ClientIP,可以在Service的YAML配置文件中添加如下内容:
yaml
apiVersion: v1  
kind: Service  
metadata:  
  name: my-service  
spec:  
  selector:  
    app: my-app  
  ports:  
  - port: 80  
    targetPort: 80  
  sessionAffinity: ClientIP
此外,也可以通过Kubernetes命令行工具kubectl来修改现有Service的会话亲和性策略。例如,使用kubectl patch命令将my-service的会话亲和性策略更改为ClientIP:

bash
kubectl patch svc my-service -p &apos;{"spec":{"sessionAffinity":"ClientIP"}}&apos;
四、注意事项
负载均衡器支持:要应用会话亲和性策略,需要确保负载均衡器(如Ingress Controller、Service Mesh等)支持该功能。
策略选择:根据实际场景和需求选择合适的会话亲和性策略类型,以避免会话状态的不一致。
负载均衡效果:会话亲和性策略可能导致负载不均衡,因此需要对集群规模和负载情况进行综合考虑。
容器无状态性:会话亲和性策略适用于有状态的应用程序。对于无状态的应用程序,会话亲和性策略可能无效或不是最佳选择。
综上所述,Kubernetes中的会话亲和性是一种重要的负载均衡策略,它通过确保来自同一用户的请求被转发到同一个后端服务来保持会话状态的一致性。在配置会话亲和性时,需要根据实际场景和需求选择合适的策略类型,并注意负载均衡器的支持和负载均衡效果。

service服务发现: 将内部的Pod暴露到在面,让用户可以去访问

ENDPOINTS就是service关联的pod的ip地址和端口 真正提供业务服务的终点 一个服务对应一个ep,

kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值