为什么具有已完成状态的 Pod 仍然显示在 kubctl get pods 中?



我已经执行了"Kubernetes Up and Running"一书中的示例,其中运行了一个带有工作队列的 pod,然后创建一个 k8s 作业 5 个 pod 来消耗队列上的所有工作。我在下面复制了 yaml api 对象。

我的期望是,一旦 k8s 作业完成,它的 pod 就会被删除,但kubectl get pods -o wide显示 pod 仍然存在,即使它报告 0/1 个容器准备就绪并且它们似乎仍然分配了 IP 地址,请参见下面的输出。

  • 何时会从kubectl get pods的输出中删除已完成的作业 Pod,为什么在 Pod 中的所有容器完成后不这样做?
  • Pod 在完成时是否像 IP 地址一样消耗任何资源,或者信息是否被打印出来是历史的?

在所有 pod 消耗完所有消息后,kubectl 的输出。

kubectl get pods -o wide
NAME              READY     STATUS      RESTARTS   AGE       IP           NODE
consumers-bws9f   0/1       Completed   0          6m        10.32.0.35   gke-cluster1-default-pool-3796b2ee-rtcr
consumers-d25cs   0/1       Completed   0          6m        10.32.0.33   gke-cluster1-default-pool-3796b2ee-rtcr
consumers-jcwr8   0/1       Completed   0          6m        10.32.2.26   gke-cluster1-default-pool-3796b2ee-tpml
consumers-l9rkf   0/1       Completed   0          6m        10.32.0.34   gke-cluster1-default-pool-3796b2ee-rtcr
consumers-mbd5c   0/1       Completed   0          6m        10.32.2.27   gke-cluster1-default-pool-3796b2ee-tpml
queue-wlf8v       1/1       Running     0          22m       10.32.0.32   gke-cluster1-default-pool-3796b2ee-rtcr

执行了以下三个 k8s api 调用,这些调用是从书籍示例中剪切和粘贴的。

使用工作队列运行容器

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
labels:
app: work-queue
component: queue
chapter: jobs
name: queue
spec:
replicas: 1
template:
metadata:
labels:
app: work-queue
component: queue
chapter: jobs
spec:
containers:
- name: queue
image: "gcr.io/kuar-demo/kuard-amd64:1"
imagePullPolicy: Always

将 Pod 公开为服务,以便工作线程 Pod 可以访问它。

apiVersion: v1
kind: Service
metadata:
labels:
app: work-queue
component: queue
chapter: jobs
name: queue
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: work-queue
component: queue

将 100 个项目发布到队列,然后运行一个并行执行 5 个 Pod 的作业,直到队列为空。

apiVersion: batch/v1
kind: Job
metadata:
labels:
app: message-queue
component: consumer
chapter: jobs
name: consumers
spec:
parallelism: 5
template:
metadata:
labels:
app: message-queue
component: consumer
chapter: jobs
spec:
containers:
- name: worker
image: "gcr.io/kuar-demo/kuard-amd64:1"
imagePullPolicy: Always
args:
- "--keygen-enable"
- "--keygen-exit-on-complete"
- "--keygen-memq-server=http://queue:8080/memq/server"
- "--keygen-memq-queue=keygen"
restartPolicy: OnFailure

文档说得很好:

作业完成后,不会再创建 Pod,但不会创建 Pod。 删除了。保留它们可以让您仍然可以查看日志 已完成的 Pod 数,以检查错误、警告或其他诊断 输出。作业对象在完成后也会保留,以便您 可以查看其状态。之后由用户删除旧作业 注意到他们的地位。使用 kubectl 删除作业(例如 kubectl 删除 jobs/pi 或 kubectl delete -f ./job.yaml(。删除作业时 使用 kubectl,它创建的所有 pod 也会被删除。

它在实际终止时显示已完成状态。如果您设置了 restartPolicy:从不(当您不想运行多次时(,那么它将进入此状态。

已终止:表示容器已完成执行并已停止运行。当容器成功完成执行或由于某种原因失败时,容器会进入此状态。无论如何,都会显示原因和退出代码,以及容器的开始和结束时间。在容器进入终止之前,将执行 preStop 挂钩(如果有(。

。 状态:已终止 原因:已完成退出代码:0 开始: 周三, 30 一月 2019 11:45:26 +0530 完成时间:2019 年 1 月 30 日星期三 11:45:26 +0530 ...

最新更新