和节点亲和性类似,Pod亲和性主要用于限制调度器工作,顾名思义,Pod亲和性是参考pod运行来调度的
而不是像节点亲和性那样根据节点来控制调度
在 Kubernetes 节点亲和性 中我们创建了nginx的deploy
可以看到 nginx全部 运行在 129 上
这里我们尝试让 nginx2 跟随 nginx 调度在同一个节点上
使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hello-deployment2
namespace: lizhe
labels:
app: nginx-hello2
spec:
replicas: 2
selector:
matchLabels:
app: nginx-hello2
template:
metadata:
labels:
app: nginx-hello2
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx-hello
topologyKey: numberCores
containers:
- name: nginx-hello2
image: nginx
ports:
- containerPort: 80
结果发现 nginx2 不仅被调度在了 129 上,还被调度在了 139 上
这就不得不说一说 topologyKey 了,由于我们的3个node都指定了 numberCores=6
也就是说,
- 运行了 pod app=nginx-hello 的 node上,带有numberCores, 且值为 6
- 则 只要是带有 numberCores 为 6 的 node,都可以运行 nginx2
我们把numberCores在 129 上改为 7 ,这样就只有 129的 numberCores 是 7 ,其余node 都是 6
这样,nginx2 为了跟随 nginx的7,只能被调度在 129上
由于亲和性配置在 已经创建的 pod 上不能重新生效(因为已经被调度完成了)
所以这里我们删除原 dep 重新创建
这一次可以看到,因为只有 129带有7,所以nginx 被全部调度在了 129 上
那如果你想要让 pod A 只被调度在已经运行了 pod B 的节点上,只需要把
topologyKey 写成 kubernetes.io/hostname
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hello-deployment2
namespace: lizhe
labels:
app: nginx-hello2
spec:
replicas: 2
selector:
matchLabels:
app: nginx-hello2
template:
metadata:
labels:
app: nginx-hello2
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx-hello
topologyKey: kubernetes.io/hostname
containers:
- name: nginx-hello2
image: nginx
ports:
- containerPort: 80