部署选择器未选择 Pod

时间:2021-02-13 20:10:55

标签: kubernetes google-kubernetes-engine kubernetes-pod kubernetes-deployment

我有这个部署对象:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-webserver-nginx
  annotations:
    description: This is a demo deployment for nginx webserver 
  labels:
    app: deployment-webserver-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deployment-webserver-pods
  template:
    metadata:
      labels:
        app: deployment-webserver-pods
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

我对这个 Deployment 对象的理解是,任何带有 app:deployment-webserver-pods 标签的 Pod 都会被选中。当然,这个 Deployment 对象是创建了 3 个副本,但是我想像这样显式地再添加一个 Pod,所以我创建了一个 Pod 对象并将它的标签设为 app:deployment-webserver-pods,下面是它的 Pod 定义:

apiVersion: v1
kind: Pod
metadata:
  name: deployment-webserver-nginx-extra-pod
  labels:
    app: deployment-webserver-pods
spec:
  containers:
  - name: nginx-alpine-container-1
    image: nginx:alpine
    ports:
      - containerPort: 81

我的期望是持续运行的 Deployment Controller 会选择这个新 Pod,当我执行 kubectl get deploy 时,我会看到 4 个 Pod 正在运行。但这并没有发生。

我什至尝试先用这个标签创建这个 pod,然后创建我的 Deployment 并认为现在可能会选择这个显式的 Pod,但仍然没有发生。

标签和选择器不是这样工作的吗? 我知道我可以通过部署扩展到 4 个副本,但我试图了解如何使用标签和选择器选择 Pod/其他 Kubernetes 对象。

4 个答案:

答案 0 :(得分:4)

来自official docs

<块引用>

注意:您不应创建标签与此匹配的其他 Pod 选择器,可以直接创建另一个部署,也可以通过 创建另一个控制器,例如 ReplicaSet 或 复制控制器。如果这样做,第一个 Deployment 会认为 它创建了这些其他 Pod。 Kubernetes 不会阻止你做 这个。

如文档中进一步描述的,不建议使用上述方法扩展部署的副本。


从文档的同一部分要注意的另一个要点: <块引用>

如果您有多个具有重叠选择器的控制器,则 控制器会互相争斗,并且行为不正确。

答案 1 :(得分:2)

<块引用>

我的期望是持续运行的 Deployment Controller 会选择这个新的 Pod,当我执行 kubectl get deploy 时,我会看到 4 个 Pod 正在运行。但这并没有发生。

部署控制器不是这样工作的,它监听 Deployment-resources 并将它们“驱动”到所需状态。这通常意味着,如果 template: 部分发生任何变化,则会创建一个具有副本数量的新 ReplicaSet。除了更改 replicas: 之外,您不能以其他方式将 Pod 添加到部署中 - 每个实例都从相同的 Pod 模板创建并且是相同的。

<块引用>

标签和选择器不是这样工作的吗?

<块引用>

...但我想了解如何使用标签和选择器选择 Pod/其他 Kubernetes 对象。

是的,标签和选择器在 Kubernetes 中用于许多事情,但并非用于所有事情。当您创建一个带有标签的 Deployment 和一个带有相同标签的 Pod,最后创建一个带有选择器的 Service 时 - 那么发送到该服务的流量会将流量分配到您的 Deployment 实例以及额外的豆荚。

示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: deployment-webserver-pods
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Labels and Selector 在使用时对管理也很有用,例如kubectl。您可以为团队或例如添加标签应用程序,然后您可以选择属于该团队或应用程序的所有部署或 Pod(例如,如果应用程序由应用程序部署和缓存部署组成),例如:

kubectl get pods -l team=myteam,app=customerservice

答案 2 :(得分:1)

<块引用>

我的期望是持续运行部署控制器 将选择这个新 Pod,当我执行 kubectl get deploy 时,我会 看到 4 个 pod 正在运行。但这并没有发生。

Kubernetes 是一个以“声明式”而非“强制”运行的系统,这意味着您通常通过 YAML 文件写下集群中应用程序的所需状态,这些声明的所需状态定义了应用程序的所有部分。

如果要像您期望的那样强制配置集群,则很难理解和复制集群是如何处于该状态的。

答案 3 :(得分:0)

在上面的解释中补充一下,如果我们尝试手动创建 pod 并进行管理,那么在 K8s 中设置控制器的目的是什么。

<块引用>

我的期望是持续运行部署控制器 将选择这个新 Pod,当我执行 kubectl get deploy 时,我会 看到 4 个 pod 正在运行。但这并没有发生。

根据您的 yaml replicas:3 已经设置,因此部署不会将新 pod 作为第 4 个副本。