yaml文件如下:
--- #单独起一个名称空间
apiVersion: v1 #指定api组
kind: Namespace #指定api类型
metadata: #元数据
name: test-affinity #定义名称空间名字
--- #启动一个deployment
apiVersion: apps/v1 #指定api组
kind: Deployment #指定api类型
metadata: #元数据
name: test-affinity #定义deploy名字
namespace: test-affinity #指定名称空间,这个名称空间必须要与想要匹配的pod在同一名称空间
spec: #指定对象规约
replicas: 19 #定义副本集
selector: #定义标签选择器
matchLabels: #定义匹配标签
app: busybox #指定匹配的标签
template: #定义模板
metadata: #元数据
labels: #标签
app: busybox #指定标签
spec: #指定对象规约
affinity: #亲和性配置
podAffinity: #配置Pod亲和性
requiredDuringSchedulingIgnoredDuringExecution: #指定在调度期间必须满足的条件
- labelSelector: #定义标签选择条件
matchExpressions: #定义节点选择条件表达式
- key: lnmp.home.com/name #匹配标签的键
operator: In #定义匹配的操作符
values: #值列表
- nginx #值
topologyKey: topology.kubernetes.io/zone #指定了用于确定节点拓扑区域的键
containers: #定义容器
- name: busybox #定义容器名字
image: harbor.placjh.com/busybox/busybox:1.36 #指定镜像和版本
command: #pod启动命令
- "/bin/sh"
- "-c"
- "sleep 3600"
imagePullPolicy: IfNotPresent #定义镜像拉取策略
查看pod状态如下
[root@k8s-master01 ~]# kubectl get pod -n test-affinity -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-affinity-5fb8dc464d-tbbvd 0/1 Pending 0 4s <none> <none> <none> <none>
报错如下:
[root@k8s-master01 ~]# kubectl describe po test-affinity-5fb8dc464d-g5wrc -n test-affinity
......
Warning FailedScheduling 20s default-scheduler 0/6 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }, 2 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 3 node(s) didn't match pod affinity rules. preemption: 0/6 nodes are available: 6 Preemption is not helpful for scheduling
我的yaml文件中关于亲和性配置部分是使用的官方文档复制下来后进行修改的,出现报错之后多次对比发现并无问题
我原本的想法是去匹配lnmp名称空间下的pod标签,然后在对应节点的test-affinity名称空间下新建pod
经过大约两个小时的测试,发现新建的pod与匹配的标签必须在同一名称空间下,否则无法匹配到