问题描述
我正在从我的服务器使用 Kubernetes API 创建部署。部署 pod 有两个容器 - 一个是主容器,另一个是 sidecar 容器,用于检查 pod 的健康状况并在健康时调用服务器。
我正在使用 this 端点来获取部署。它具有部署状态属性,其结构如下提及here。
我无法理解字段 availableReplicas
、readyReplicas
、replicas
、unavailableReplicas
和 updatedReplicas
。
我也检查了 Kubernetes 的文档和这些 SO 问题 - What is the difference between current and available pod replicas in kubernetes deployment? 和 Meaning of "available" and "unavailable" in kubectl describe deployment,但无法推断 pod 准备好、正在运行和可用之间的区别。有人可以解释一下这些术语和状态之间的区别吗?
解决方法
部署状态中不同种类的 replicas
可以描述如下:
-
Replicas
- 描述这个部署应该有多少个 pod。它是从规范中复制的。这是异步发生的,因此在很短的时间间隔内,您可以读取spec.replicas
不等于status.replicas
的部署。 -
availableReplicas
- 表示至少在一段时间 (minReadySeconds
) 内准备好的 Pod 数量。这可以防止状态波动。 -
unavailableReplicas
- 应该存在的 Pod 总数减去必须创建的 Pod 数,或者尚不可用的 Pod 数(例如失败或未准备好)minReadySeconds
)。 -
updatedReplicas
- 部署可访问的与规范模板匹配的 pod 数量。 -
readyReplicas
- 从部署到所有副本可访问的 Pod 数量。
让我们使用创建 ReplicaSet 的 Deployment 的 official example 来启动三个 nginx Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
部署创建了三个复制的 Pod,由 .spec.replicas
字段指示。
通过运行以下命令创建部署:
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
运行 kubectl get deployments
以检查是否已创建部署。
如果 Deployment 仍在创建中,则输出类似于以下内容:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/3 0 0 1s
当您检查集群中的部署时,会显示以下字段:
-
NAME
- 列出命名空间中部署的名称。 -
READY
- 显示有多少应用程序副本可供用户使用。它遵循准备/期望的模式。 -
UP-TO-DATE
- 显示已更新以达到所需状态的副本数。 -
AVAILABLE
- 显示有多少应用程序副本可供用户使用。 -
AGE
- 显示应用程序运行的时间。
几秒钟后再次运行 kubectl get deployments
。输出类似于:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 18s
要查看 Deployment 创建的 ReplicaSet (rs
),请运行 kubectl get rs
。输出类似于:
NAME DESIRED CURRENT READY AGE
nginx-deployment-75675f5897 3 3 3 18s
ReplicaSet 输出显示以下字段:
-
NAME
- 列出命名空间中副本集的名称。 -
DESIRED
- 显示您在创建部署时定义的应用程序副本的所需数量。这是理想的状态。 -
CURRENT
- 显示当前正在运行的副本数量。 -
READY
显示有多少应用程序副本可供您的用户使用。 -
AGE
- 显示应用程序运行的时间。
如您所见,availableReplicas
和 readyReplicas
之间没有实际区别,因为这两个字段都显示您的用户可以使用的应用程序副本数量。
当谈到 Pod Lifecycle 时,重要的是要了解 Pod phase、Container states 和 Pod conditions 之间的区别,它们都有不同的含义。我强烈建议您阅读链接的文档,以便深入了解它们。