首页 > 解决方案 > 尽管我有相同的选择器标签,但现有的 pod 不符合部署对象的条件

问题描述

我刚开始学习 Kubernetes。请帮帮我。

根据我的假设,当部署对象将基于选择器创建副本集时,如果部署中使用的具有相同选择器标签的任何现有运行 pod 必须由调度程序使用,但在我的以下情况下不是。如果错了,请纠正我,否则请帮助我解决哪里出错了。

pod.yml
apiVersion: v1
kind: Pod
metadata: 
 name: web
 labels:
  type: frontend
spec:
 containers:
  - name: nginx-container
    image: nginx

deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: web-deployment
spec:
 template:
  metadata: 
   name: web
   labels:
    type: frontend
  spec:
    containers:
     - name: nginx-container
       image: nginx
 selector:
  matchLabels:
   type: frontend
 replicas: 2

我首先创建了一个 pod,然后我尝试部署相同的 pod 类型。

kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
web                              1/1     Running   0          22m
web-deployment-89d6bf94f-5dqxj   1/1     Running   0          13m
web-deployment-89d6bf94f-xrngx   1/1     Running   0          21m

标签: kubernetes

解决方案


如果您查看由部署创建的其中一个 pod(例如kubectl describe pod web-deployment-89d6bf94f-5dqxj)的描述,您会发现它具有附加标签pod-template-hash,该标签由部署控制器添加到其底层副本集。这是文档中关于如何以及为什么设置此标签的一小段:

此标签确保 Deployment 的子 ReplicaSet 不会重叠。它是通过对 ReplicaSet 的 PodTemplate 进行散列并使用生成的散列作为添加到 ReplicaSet 选择器、Pod 模板标签以及 ReplicaSet 可能具有的任何现有 Pod 中的标签值来生成的。

因此,基本上,在部署之外创建的 pod 不属于此部署的副本集。


推荐阅读