Node亲和性:POD调度到哪个Node上
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了
pod亲和性:pod和pod亲密性
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了
pod反亲和:
软策略 尽量满足,如果不满足也行
硬策略 必须满足,不满足就调度不了
查看文档
查看node标签
kubectl get node --show-labels
创建一个 Deployment资源类型的pod
cat >node-affinity.yml << 'EOF'
apiVersion: apps/v1 #接口版本号
kind: Deployment #资源类型为 Deployment
metadata: # Deployment类型的元数据
name: node-affinity # Deployment类型元数据名称
labels: # Deployment类型元数据的标签
app: node-affinity # Deployment类型元数据标签为 app: node-affinity
spec: #定义pod的具体运行配置
replicas: 4 #pod的副本数为4个
selector: #pod选择器
matchLabels: #pod匹配的标签
app: node-affinity #匹配pod具体标签app: node-affinity
template: #创建pod具体的配置模板
metadata: #创建pod的元数据
labels: #创建pod的标签
app: node-affinity #创建pod的具体标签app: node-affinity
spec: #定义容器运行的配置
containers: #容器参数
- name: nginx #容器名称为nginx
image: nginx:1.14.0 #容器下载镜像
ports: #容器暴露的端口
- containerPort: 80 #容器暴露的具体端口
name: nginx-dp #暴露端口定义一个名称
affinity: #定义亲和性
nodeAffinity: #node亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬策略
nodeSelectorTerms: #node选择器
- matchExpressions: #匹配规则
- key: kubernetes.io/hostname #node节点标签
operator: NotIn #匹配操作符notin即label不在里面
values: #标签值
- master
preferredDuringSchedulingIgnoredDuringExecution: #软策略
- weight: 1 #增加权重
preference: #偏好
matchExpressions: #匹配表达
- key: disktype #值为disktype
operator: In #匹配操作符在里面
values: #标签值
- SSD #SSD
EOF
给node2添加标签
kubectl label nodes node2 disktype=ssd
清除node2标签
kubectl label nodes node2 disktype-
pod亲和性实验
cat >nginx-pod-affinity.yaml <<'EOF'
apiVersion: apps/v1 #接口版本
kind: Deployment #资源类型为depolyment
metadata: #dp资源类型的元数据
name: nginx-dp #dp资源类型的名字
labels: #dp资源的标签
app: nginx-dp #dp资源的具体标签
spec: #定义pod具体运行的配置
replicas: 5 #定义pod运行的具体副本数为5
selector: #定义pod运行选择器
matchLabels: #pod运行匹配标签
app: nginx-dp #pod具体标签为app:nginx-dp
template: #创建pod具体运行模板
metadata: #创建的pod元数据
labels: #创建的pod的标签
app: nginx-dp #创建pod的具体标签为app:nginx-dp
spec: #定义容器运行的具体配置
containers: #定义容器
- name: nginx-dp #定义容器名为nginx-dp
imagePullPolicy: IfNotPresent #容器镜像下载方式
image: nginx #下载镜像的名称nginx
ports: #定义pod暴露的端口
- name: http #定义暴露的端口的名字为http
containerPort: 80 #定义容器暴露的端口为80
affinity: #亲和性
podAffinity: #pod亲和
requiredDuringSchedulingIgnoredDuringExecution: #亲和硬策略
- labelSelector: #标签选择
matchExpressions: #匹配方式
- key: app #值为app
operator: In #操作方式in要存在
values: #值
- redis #值为redis
topologyKey: kubernetes.io/hostname #拓扑域值
EOF
topology 拓扑拓扑结构意思
pod亲和性调度需要各个相关的pod对象运行于"同一位置", 而反亲和性调度则要求他们不能运行于"同一位置",
这里指定“同一位置” 是通过 topologyKey 来定义的,topologyKey 对应的值是 node 上的一个标签名称,比如各别节点zone=A标签,各别节点有zone=B标签,pod affinity topologyKey定义为zone,那么调度pod的时候就会围绕着A拓扑,B拓扑来调度,而相同拓扑下的node就为“同一位置”。
如果基于各个节点kubernetes.io/hostname标签作为评判标准,那么很明显“同一位置”意味着同一节点,不同节点既为不同位置
注意:拓扑域就是匹配一个公共的node节点标签,kubernetes.io/hostname在这个范围找,用其他也行
反亲和实验:
反亲和文档
注意:只有pod反亲和,没有node
安全删除节点
驱逐节点的流程
1)首先设置新的POD创建任务不可被调度到需要维护的节点
2)给需要维护的节点打上驱逐标签,这个时候维护节点上的POD都会被赶走
3)清空节点
4)k8s安全删除节点
具体操作:
1.设置不可被调度
kubectl cordon node2
2.给node2打驱逐标签
kubectl taint nodes node2 fuckoff=node2:NoExecute
3.清空节点
kubectl drain node2
此时会报错
node/node2 already cordoned
error: unable to drain node "node2", aborting command...
There are pending nodes to be drained:
node2
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/kube-proxy-ggvl4
忽略daemonsets类型的pod
kubectl drain node2 --ignore-daemonsets
4.k8s安全删除节点
kubectl delete nodes node2
节点被删除后重新添加到集群的步骤
已经被删除的节点想重新加回来咋办?
需要清理的地方:kubeadm安装的情况
1)kubeadm重置
kubeadm reset
2)清理防火墙规则
iptables -F
iptables -Z
iptables -X
iptables -F -t nat
iptables -Z -t nat
iptables -X -t nat
ipvsadm --clear
3)清理网卡及网络信息
rm -rf /etc/cni/net.d
rm -rf /var/run/flannel/
ifconfig cni0 down
ip link delete cni0
4)重启docker和kubelet
systemctl restart docker
5)master节点重新生成token
kubeadm token create --print-join-command
6)重新加入集群
kubeadm join 10.0.0.10:6443 --token 9qnr65.e6nxrx9z4nahewgp --discovery-token-ca-cert-hash sha256:b53c91fc32f932f01428e6d145f845e2c12ade4f0999df150281ab3e07b94d1a
7)给节点打标签
kubectl label nodes node2 node-role.kubernetes.io/node=
8)创建POD测试
驱逐节点
驱逐节点的流程
1)首先设置新的POD创建任务不可被调度到需要维护的节点
2)给需要维护的节点打上驱逐标签,这个时候维护节点上的POD都会被赶走
3)安全下线节点进行维护
4)维护完成后,将节点的驱逐污点删除
5)恢复可以被调度
具体操作:
1.设置不可被调度
kubectl cordon node2
cordon 警戒的意思
2.给node2打驱逐标签
kubectl taint nodes node2 fuckoff=node2:NoExecute
NoExecute 不执行
node节点上已经有运行pod,就会让pod驱逐掉
而NoSchedule,创建pod的时候,就不会被调度过来
3.安全下线节点进行维护
4.维护完成后,将节点的驱逐污点删除
kubectl taint nodes node2 fuckoff-
5.恢复可以被调度
kubectl uncordon node2
污点和容忍
注意:node也有反亲和,但是不能这样叫,只能被称为污点
查看node节点的taints污点信息
查看master污点情况
kubectl describe nodes master
解释:Taints: node-role.kubernetes.io/master:NoSchedule
拥有这个节点node-role.kubernetes.io/master标签的,不要被调度过来
查看node1污点情况
node1是没有污点的
1.添加污点写法
kubectl taint nodes 节点名称 污点名字=值:效果
1.给node2打污点
kubectl taint nodes node2 test=node2:NoSchedule
2.查看效果
kubectl describe nodes node2|grep Taints
清除node2节点上的污点
kubectl taint nodes node2 test-
3.创建没有容忍的pod
cat >nginx-dp.yml<<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dp
labels:
app: nginx-dp
spec:
replicas: 2
selector:
matchLabels:
app: nginx-dp
template:
metadata:
name: nginx-dp
labels:
app: nginx-dp
spec:
containers:
- name: nginx
image: nginx:1.14.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
EOF
4.查看效果
kubectl get pod -o wide
6.创建有容忍的POD
Pod的Toleration⽣命的key和effect需要和Taint的设置保持⼀致,并且满⾜以下条件之⼀。
如果operator的值是Exists,则value的属性可以省略。
如果operator的值是Equal,则表示其key和value之间的关系是等于。
如果不指定operator的属性,则默认为Equal。
cat >nginx-taint-dp.yml<<'EOF'
apiVersion: apps/v1 #接口版本
kind: Deployment #资源类型为deployment
metadata: #dp资源的元数据
name: nginx-dp #dp资源名字为nginx-dp
labels: #dp资源的标签
app: nginx-dp #dp资源具体标签为app: nginx-dp
spec: #定义pod的运行配置
replicas: 2 #pod副本数为2
selector: #定义pod选择器
matchLabels: #定义pod的匹配标签
app: nginx-dp #定义pod的具体标签为app: nginx-dp
template: #创建pod的运行配置
metadata: #创建pod运行配置的模板
name: nginx-dp #创建pod的名称
labels: #创建pod的标签
app: nginx-dp #创建pod 的具体标签
spec: #创建容器的具体配置
containers: #创建容器
- name: nginx #创建容器名
image: nginx:1.14.0 #创建容器下载镜像
imagePullPolicy: IfNotPresent #下载镜像方式
ports: #容器暴露的端口
- name: http #给暴露端口起一个名字
containerPort: 80 #暴露容器具体的端口为80
#tolerations: #容忍度
#- key: "test" #键值为test,kubectl taint nodes node2 test=node2:NoSchedule
# operator: "Equal" #操作员其key和value之间的关系是等于
# value: "node2" #值为node2
# effect: "NoSchedule" #effect就是容忍的意思,容忍NoSchedule这个操作
tolerations:
- key: "test"
operator: "Exists"
effect: "NoSchedule"
EOF
toleration 容忍度
effect 效果影响
5.查看效果
kubectl get pod -o wide
6.容忍字段解释
第一种写法:精确匹配到污点的键值,再容忍
tolerations:
- key: "test"
operator: "Equal"
value: "node2"
effect: "NoSchedule"
第二种写法:只要存在这个污点,无论value是什么,都容忍
tolerations:
- key: "test"
operator: "Exists"
effect: "NoSchedule"
注意:打污点可以驱逐节点上面的pod