我已经执行了"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 ...