我有这个部署对象:
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 对象。
答案 0 :(得分:4)
注意:您不应创建标签与此匹配的其他 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 个副本。