将时间戳附加到 kubernetes --watch-only 命令

问题描述 投票:0回答:3

我正在运行 Kubernetes 作业,我想监视状态。我同时运行各种

--watch-only
命令,例如
kubectl get pods --watch-only
,它向我显示了 Pod 的更新状态。但是,我想在输出中附加 timestamp 和一些 string

这个想法是了解状态何时发生变化,并以字符串形式添加附加信息。

我怎样才能实现这个目标?

kubernetes kubectl
3个回答
8
投票

让原发者在评论中发布的问题的潜在解决方案更加可见:

这是我迄今为止发现的工作 kubectl get pods --watch-only |读取行时; do echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") pods $line" ;完成

使用命令:

  • $ kubectl get pods --watch-only | while read line ; do echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N")\t pods\t $line" ; done

解决方案是正确的,但需要从上述命令中进一步提取状态变化(

PENDING
RUNNING
SUCCEEDED/COMPLETED
)(假设有进一步的操作)。


从不同的角度来看,您可以使用官方 Kubernetes API 库来监控 pod 和作业的状态并根据它们采取相应的行动(例如:作业成功时执行某些操作)。


我使用 Kubernetes Python API 库创建了一个 example 应用程序来查看 pod 和作业的状态。

假设:

  • 您有一个已配置的工作 Kubernetes 集群
    kubectl
  • 您已经安装了Python和所需的库:
    • $ pip install kubernetes

使用

Job
的示例:

Kubernetes.io:文档:概念:作业

pod 示例

下面是 Python3 中的示例代码,当 pod 状态设置为

Succeeded
时,它将监视 pod 并打印消息:

from kubernetes import client, config, watch
from datetime import datetime

config.load_kube_config()

v1 = client.CoreV1Api()
w = watch.Watch()
for event in w.stream(v1.list_namespaced_pod, namespace="default", watch=False):
    print("POD_NAME: " + event['object'].metadata.name) # print the name
    print("TIME: " + str(datetime.now())) # print the time 
    print("PHASE: " +  event['object'].status.phase) # print the status of the pod
    print("CUSTOM AMAZING TEXT HERE!")

    if (event['object'].status.phase == "Succeeded") and (event['type'] != "DELETED"): # do below when condition is met 
        print ("----> This pod succeeded, do something here!")
    print("---")

这将产生类似于以下输出的输出:

POD_NAME: pi-pjmm5
TIME: 2020-09-06 15:28:01.541244
PHASE: Pending
CUSTOM AMAZING TEXT HERE!
---
POD_NAME: pi-pjmm5
TIME: 2020-09-06 15:28:03.894063
PHASE: Running
CUSTOM AMAZING TEXT HERE!
---
POD_NAME: pi-pjmm5
TIME: 2020-09-06 15:28:09.044219
PHASE: Succeeded
CUSTOM AMAZING TEXT HERE!
----> This pod succeeded, do something here!
---

工作示例

下面是 Python3 中的示例代码,当作业状态设置为

Succeeded
时,它将监视作业并打印消息:

from kubernetes import client, config, watch
from datetime import datetime

config.load_kube_config()

v1 = client.BatchV1Api()
w = watch.Watch()
for event in w.stream(v1.list_namespaced_job, namespace="default", watch=False):
    print("JOB_NAME: " + event['object'].metadata.name)
    print("TIME: " + str(datetime.now()))
    print("STATUS: " + event['type'])
    print("CUSTOM AMAZING TEXT HERE!")

    if (event['object'].status.succeeded == 1) and (event['type'] != "DELETED"): 
        print ("----> This job succeeded, do something here!")
    print("---")

这将产生类似于以下输出的输出:

JOB_NAME: pi
TIME: 2020-09-06 15:32:49.909096
STATUS: ADDED
CUSTOM AMAZING TEXT HERE!
---
JOB_NAME: pi
TIME: 2020-09-06 15:32:49.936856
STATUS: MODIFIED
CUSTOM AMAZING TEXT HERE!
---
JOB_NAME: pi
TIME: 2020-09-06 15:32:56.998511
STATUS: MODIFIED
CUSTOM AMAZING TEXT HERE!
----> This job succeeded, do something here!
---

0
投票

--timestamps

kubectl logs -f --timestamps ...

0
投票

ts
(来自
moreutils
)或
gnomon
(来自
npm i -g gnomon
)有助于标准时间戳输出:

即:

  • ts
    $ kubectl get po -w | ts -i
    00:00:00 NAME        READY   STATUS    RESTARTS   AGE
    00:00:00 jenkins-0   2/2     Running   1661       55d
    00:00:57 jenkins-0   1/2     OOMKilled   1661       55d
    00:00:15 jenkins-0   1/2     CrashLoopBackOff   1661       55d
    00:04:49 jenkins-0   2/2     Running            1662       55d
    00:02:19 jenkins-0   1/2     OOMKilled          1662       55d
    00:00:15 jenkins-0   1/2     CrashLoopBackOff   1662       55d
    
  • gnomon
    $ kubectl get po -w | gnomon
       0.0234s   NAME        READY   STATUS             RESTARTS   AGE
    287.3296s   jenkins-0   1/2     CrashLoopBackOff   1660       55d
    158.1299s   jenkins-0   2/2     Running            1661       55d
      14.4898s   jenkins-0   1/2     OOMKilled          1661       55d
    130.1794s   jenkins-0   1/2     CrashLoopBackOff   1661       55d
    
© www.soinside.com 2019 - 2024. All rights reserved.