- 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 '{"spec":{"sessionAffinity":"ClientIP"}}'
四、注意事项
负载均衡器支持:要应用会话亲和性策略,需要确保负载均衡器(如Ingress Controller、Service Mesh等)支持该功能。
策略选择:根据实际场景和需求选择合适的会话亲和性策略类型,以避免会话状态的不一致。
负载均衡效果:会话亲和性策略可能导致负载不均衡,因此需要对集群规模和负载情况进行综合考虑。
容器无状态性:会话亲和性策略适用于有状态的应用程序。对于无状态的应用程序,会话亲和性策略可能无效或不是最佳选择。
综上所述,Kubernetes中的会话亲和性是一种重要的负载均衡策略,它通过确保来自同一用户的请求被转发到同一个后端服务来保持会话状态的一致性。在配置会话亲和性时,需要根据实际场景和需求选择合适的策略类型,并注意负载均衡器的支持和负载均衡效果。
service服务发现: 将内部的Pod暴露到在面,让用户可以去访问
ENDPOINTS就是service关联的pod的ip地址和端口 真正提供业务服务的终点 一个服务对应一个ep,
kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址