为什么状态已完成的Pod仍显示在Kubctl get Pod中?

时间:2018-07-08 17:20:04

标签: kubernetes

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

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

  • 何时将完成的作业容器从kubectl get pods的输出中删除,为什么在容器中的所有容器都装完之后不是这样?
  • 豆荚完成时是否会消耗任何资源,例如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调用,这些调用是从书本样本中剪切和粘贴的。

使用工作队列运行pod

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

将吊舱作为服务公开,以便工作吊舱可以使用它。

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

2 个答案:

答案 0 :(得分:7)

docs说得很好:

  

任务完成后,将不再创建其他Pod,但不会创建Pod   删除了。保持它们周围,您仍然可以查看日志   完成的吊舱的数量,以检查是否有错误,警告或其他诊断信息   输出。作业对象在完成后也会保留下来,以便您   可以查看其状态。由用户决定是否删除旧作业   注意他们的地位。使用kubectl删除作业(例如,kubectl delete   jobs / pi或kubectl delete -f ./job.yaml)。删除作业时   使用kubectl,它创建的所有吊舱也将被删除。

答案 1 :(得分:0)

它实际终止时显示已完成状态。如果您设置 restartPloicy:Never(不想再运行一次,则一次),那么它将进入此状态。

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

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