いくつかの比較を行うためにkubernetesスタイルの時間を秒に変換する方法

いくつかの比較を行うためにkubernetesスタイルの時間を秒に変換する方法

~から

kubectl get pods -o wide

出力は次のようになります。

some-pod-name-with-numbers-123             1/1     Running   0          6d4h      192.168.0.23   node-name-abcdeft-host.domain   <none>           <none>
some-pod-name-with-numbers-1234            1/1     Running   0          4h38m      192.168.0.24   node-name-abcdeft-host.domain   <none>           <none>
some-pod-name-with-numbers-1235            1/1     Running   0          2m38s      192.168.0.25   node-name-abcdeft-host.domain   <none>           <none>

Podの経過時間は4d3h15m3s形式で表示されます(最大2つの連続単位(日時、時、分、分、秒)のように見えますが、これは保証できません。

Podの寿命が特定のしきい値Xを超えていることを確認する必要があります。

kubectlを介してそのフィールドを秒単位で抽出する方法を見つけようとしていますが、運がありません。インターネットでプレインストールされたソリューションを検索しましたが、見つかりませんでした。

私はawkを使用して文字列を数秒に変換して$ Xより大きいかどうかを比較できると思いました。この値は設定可能です。

答え1

ほんの数秒でKubernetesランタイムを取得するために外部プロセスを分岐する必要はありません。以下のGNU awkコードにはfx()変換を実行するカスタム関数があり、ここで比較目的で使用できます。

kubectl get pods -o wide |
awk '
BEGIN {
    a["d"] = 24*(\
    a["h"] = 60*(\
    a["m"] = 60*(\
    a["s"] = 1)));
  }
  {
    print fx($5); # kubernetes time elapsed in seconds 
  }
  function fx(ktym,    f,u,n,t,i) {
    n = split(ktym, f, /[dhms]/, u)
    t = 0
    for (i=1; i<n; i++) {
      t += f[i] * a[u[i]] 
    }
    return t
  }
'

Bashでカスタム関数を使用するには、次のようにします。 kubernetes形式の経過時間である1つのパラメータを使用して時間を秒単位で出力する関数fx()があります。

fx() {
echo "$1" |
sed -Ee '
  s/[1-9][0-9]*[dhms]/&+ /g
  :a;s/[+]([^+].*)/\1+/;ta
  s/.$//
  :loop
    s/d/ 24h*/
    s/h/ 60m*/
    s/m/ 60s*/
    s/s//
  t loop
  s/.*/echo "&" | dc -e "?p"/e
'
}

私たちはLinuxユーティリティのコードを動的に生成しています。直流またはデスクトップ電卓RPN(逆ポーランド表記).

答え2

私のようなPython関数を探している人がいるなら、

def kubctle_dur_to_secs(kubectl_time:str) -> int:
    total_time = 0
    for t_char, sec_in_t in zip( ('d', 'h', 'm', 's'), (86400, 3600, 60, 1) ):
        if t_char in kubectl_time:
            t_index = kubectl_time.find(t_char)
            total_time += int(kubectl_time[:t_index])*sec_in_t
            kubectl_time = kubectl_time[t_index+1:]
    return total_time

答え3

少し時間を費やした後、最速の方法はsed置換を使用して時間を表示することです。

sed -e 's/\([smhd]\)/\1 /g' | awk '{ b=0; for(i=1; i<=NF; ++i) { s=substr($i,1,length($i)-1); u=substr($i,length($i)); if (u=="s") b+=s; else if (u=="m") b+=s*60; else if (u=="h") b+=s*60*60; else if (u=="d") b+=s*60*60*24; else u=""; } if (b>1) printf "%d", b}'

これまで、私は100日より古いポッドについても、この領域でd、h、m、s単位が使用されることを観察しました。

sed コマンドはデフォルトで各セルをスペースで区切ります。
その後、awkはフィールドを繰り返し、文字列を単位(u)と数値文字列(s)に分割します。
連結されたif-elseif-elseステートメントは、単に単位に応じて値を秒に変換し、それを秒単位で保持される合計時間に追加します。

このコマンドを "kube_elapsed_to_seconds" スクリプトに配置し、このフィールドに別の awk およびシステムコマンドを使用してこのスクリプトを外部で実行する予定です。

kubectl get pods -o wide | awk '{ system("echo " $5 " | kube_elapased_to_seconds"); print $0 }'

私は、このコマンドを読みやすくしたり、存在する可能性のあるポッド名やステータスなど、時間に関連しない他のフィールドとより効果的にやり取りする方法についての提案を歓迎します。

答え4

これを理解するためのコマンドについては、4d3h15m3sdateutilsを参照してくださいdadd

$ TZ=UTC0 dateutils.dadd -f%s 1970-01-01T00:00:00 4d3h15m3s
357303

これにより、Unix epoch時間の先頭に期間が追加され、結果がUnix epoch時間(UTCから0にオフセットされた時間帯)に出力されます。

関連情報