K8s Deployment控制器能否管控非自身创建的匹配标签的Pod?
操作场景
你首先使用如下Pod YAML创建了独立Pod:
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.1
执行命令:kubectl apply -f pod.yaml
之后使用如下Deployment YAML创建Deployment资源:
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80
执行命令:kubectl apply -f deployment.yaml
问题原因
核心原因:ReplicaSet的从属关系校验规则
Deployment本身不直接管控Pod实例,它是通过创建并管理ReplicaSet(RS)来实现副本期望状态的维持。RS在统计自己管理的有效副本数时,不是仅匹配标签规则,还会校验Pod的从属关系:只有同时满足以下两个条件的Pod,才会被RS计入有效副本数:
- Pod标签完全匹配RS的
selector规则 - Pod的
metadata.ownerReferences字段中存在指向当前RS的引用,证明该Pod是由当前RS创建的
你提前手动创建的独立Pod没有对应的ownerReference指向Deployment生成的RS,因此RS会完全无视这个Pod的存在,按照replicas: 3的配置直接创建3个符合要求的Pod。
即使你手动创建的Pod和Deployment的Pod模板配置完全一致,只要没有对应的ownerReference,RS依然不会将其纳入计数,还是会创建3个新Pod。
补充:模板不匹配的额外影响
在当前场景中,你手动创建的Pod还不符合Deployment定义的Pod模板规范:
- 手动Pod使用镜像
nginx:1.19.1,Deployment模板指定镜像为nginx:1.17.1 - 手动Pod未配置容器端口,Deployment模板配置了
containerPort: 80
即使跳过ownerReference校验,RS也会识别到该Pod不符合期望模板,不会将其计入有效副本,甚至会尝试将其作为异常资源删除,保证所有副本都符合定义的规范。
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

