Kubernetes デプロイメントが「準備完了」になる前に、進行中/準備中の状態をどのように判断できますか?

Kubernetes デプロイメントが「準備完了」になる前に、進行中/準備中の状態をどのように判断できますか?

私の CI テスト ロジックの一部として、多数の専用ノードごとに Kubernetes デプロイメント ファイルを作成し、それらのノード上の以前のデプロイメントをすべて削除してから、新しいデプロイメントを開始するスクリプトがあります。(重要ではないと思われるため、構成は最後に追加されています。) テストを実行したら、次のテスト実行に備えてシャットダウンします。ノードはデプロイメントのみを実行するため、必要な CPU/メモリ/その他の量を宣言する必要はありません。また、コンテナーがそれらの処理を相互に処理するため、準備スクリプトはありません。IP アドレスを取得したら、ステータス監視サービスと通信するだけで済みます。

通常、それらは 1 分ほどで準備が整い、動作します。私のスクリプトは、何も「false」を報告しなくなるまで次のコマンドの出力を監視します。しかし、時々、許可した時間内に起動しないことがあります。何か問題が発生した場合に、不確定な時間を待ちたくありません。アドレスを収集して下流のプロセスに送り、完了したデプロイメントでテストを設定する必要があります。しかし、Kubernetes が意味のある進行状況や遅い理由の診断を表示できない場合は、不完全なデプロイメントを中止する以上のことはできません。

kubectl get pods -l pod-agent=$AGENT_NAME \
      -o 'jsonpath={range .items[*]}{..status.conditions[?(@.type=="Ready")].status}:{.status.podIP}:{.status.phase}:{.metadata.name} '

コンテナの 1 つがそのホストで以前に使用されたことがなく、各ホストにコピーするのに時間がかかりすぎて、全体的なデプロイメントがスクリプトのタイムアウトを超えた可能性があると考え、これを追加しました (| cat | は無視してください。これは IntelliJ ターミナルのバグの回避策です)

kubectl describe pod $REPLY | cat | sed -n '/Events:/,$p; /emulator.*:/,/Ready:/p'

各ポッドが何をしているかを把握するために、最初のコマンドが毎回「false」を返しますが、一貫性のない結果が得られます。「イベント」セクションではコンテナーがプルされて起動されたと主張していますが、同じコマンドの構造化された出力ではコンテナーが「ContainerCreating」として表示されます。

     1  False::Pending:kubulator-mysh-automation11-dlan-666b96d788-6gfl7
  emulator-5554:
    Container ID:   
    Image:          dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
    Image ID:       
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
  emulator-5556:
    Container ID:   
    Image:          dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
    Image ID:       
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False

..同じことの繰り返し、そして

Events:
  Type    Reason     Age   From                        Message
  ----    ------     ----  ----                        -------
  Normal  Scheduled  23s   default-scheduler           Successfully assigned auto/kubulator-mysh-automation11-dlan-666b96d788-6gfl7 to automation11.dlan
  Normal  Pulling    16s   kubelet, automation11.dlan  Pulling image "dockerio.dlan/auto/ticket-machine"
  Normal  Pulled     16s   kubelet, automation11.dlan  Successfully pulled image "dockerio.dlan/auto/ticket-machine"
  Normal  Created    16s   kubelet, automation11.dlan  Created container ticket-machine
  Normal  Started    16s   kubelet, automation11.dlan  Started container ticket-machine
  Normal  Pulling    16s   kubelet, automation11.dlan  Pulling image "dockerio.dlan/qa/cgi-bin-remote"
  Normal  Created    15s   kubelet, automation11.dlan  Created container cgi-adb-remote
  Normal  Pulled     15s   kubelet, automation11.dlan  Successfully pulled image "dockerio.dlan/qa/cgi-bin-remote"
  Normal  Started    15s   kubelet, automation11.dlan  Started container cgi-adb-remote
  Normal  Pulling    15s   kubelet, automation11.dlan  Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
  Normal  Pulled     15s   kubelet, automation11.dlan  Successfully pulled image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
  Normal  Created    15s   kubelet, automation11.dlan  Created container emulator-5554
  Normal  Started    15s   kubelet, automation11.dlan  Started container emulator-5554
  Normal  Pulled     15s   kubelet, automation11.dlan  Successfully pulled image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
  Normal  Pulling    15s   kubelet, automation11.dlan  Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"
  Normal  Created    14s   kubelet, automation11.dlan  Created container emulator-5556
  Normal  Started    14s   kubelet, automation11.dlan  Started container emulator-5556
  Normal  Pulling    14s   kubelet, automation11.dlan  Pulling image "dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240"

そのため、イベントではコンテナが起動したと主張していますが、構造化データはそれと矛盾しています。イベントを信頼できるものとして使用しますが、サーバーにイベント レート制限構成が設定されていないにもかかわらず、イベントは先頭の 26 エントリで奇妙に切り捨てられています。

最後に、イベントが「開始」したと主張するコンテナーの 1 つについて完全な説明を含めましたが、完全な出力には手がかりが見つかりません。

デプロイメントが開始されると (つまり、最初の行に「true」が表示されると)、すべてのコンテナーが突然「実行中」として表示されます。

describe podしたがって、私の基本的な質問は、明らかに信頼性が低く、不完全である場合に、失敗したときにデプロイメントがどこで停止したのか、なぜ停止したのかを理解するために、デプロイメントの実際の状態(明らかに「イベント」によって表される)をどのように判断できるかということです。

「kubectl get pods」以外に、実際の状態を確認するために使用できるものはありますか? (できれば、サーバーに ssh で接続して生のログをスニッフィングするような面倒なことは避けてください。)

ありがとう。

kubectl version クライアントバージョン: version.Info{メジャー:"1", マイナー:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11:23:11Z", GoVersion:"go1.12.12", コンパイラ:"gc", プラットフォーム:"linux/amd64"} サーバーバージョン: version.Info{メジャー:"1", マイナー:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean",ビルド日:"2019-08-19T11:05:50Z", Goバージョン:"go1.12.9", コンパイラ:"gc", プラットフォーム:"linux/amd64"}


私のデプロイメントファイル:

apiVersion: v1
kind: Service
metadata:
  name: kubulator-mysh-automation11-dlan
  labels:
    run: kubulator-mysh-automation11-dlan
    pod-agent: mysh
spec:
  type: ClusterIP
  clusterIP: None
  ports:
    - name: http
      protocol: TCP
      port: 8088
      targetPort: 8088
    - name: adb-remote
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: adb
      protocol: TCP
      port: 9100
      targetPort: 9100
  selector:
    run: kubulator-mysh-automation11-dlan
    kubernetes.io/hostname: automation11.dlan
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubulator-mysh-automation11-dlan
  labels:
    pod-agent: mysh
spec:
  selector:
    matchLabels:
      run: kubulator-mysh-automation11-dlan
      pod-agent: mysh
  replicas: 1
  template:
    metadata:
      labels:
        run: kubulator-mysh-automation11-dlan
        pod-agent: mysh
    spec:
      nodeSelector:
        kubernetes.io/hostname: automation11.dlan
      volumes:
        - name: dev-kvm
          hostPath:
            path: /dev/kvm
            type: CharDevice
        - name: logs
          emptyDir: {}
      containers:
- name: ticket-machine
  image: dockerio.dlan/auto/ticket-machine
  args: ['--', '--count', '20']  # --adb /local/adb-....
  imagePullPolicy: Always
  volumeMounts:
    - mountPath: /logs
      name: logs
  ports:
    - containerPort: 8088
  env:
    - name: ANDROID_ADB_SERVER_PORT
      value: "9100"
    - name: ANDROID_ADB_SERVER
      value: host
- name: cgi-adb-remote
  image: dockerio.dlan/qa/cgi-bin-remote
  args: ['/root/git/CgiAdbRemote/CgiAdbRemote.pl', '-foreground', '-port=8080', "-adb=/root/adb-8aug-usbbus-maxemu-v39"]
  imagePullPolicy: Always
  ports:
    - containerPort: 8080
  env:
    - name: ADB_SERVER_SOCKET
      value: "tcp:localhost:9100"
    - name: ANDROID_ADB_SERVER
      value: host
- name: emulator-5554
  image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
  imagePullPolicy: Always
  securityContext:
    privileged: true
  volumeMounts:
    - mountPath: /logs
      name: logs
    - mountPath: /dev/kvm
      name: dev-kvm
  env:
    - name: ANDROID_ADB_VERSION
      value: v39
    - name: ANDROID_ADB_SERVER_PORT
      value: '9100'
    - name: EMULATOR_PORT
      value: '5554'
    - name: EMULATOR_MAX_SECS
      value: '2400'
    - name: ANDROID_ADB_SERVER
      value: host
    - name: EMU_WINDOW
      value: '2'
- name: emulator-5556
  image: dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
... etc - several more of these emulator containers.

イベントによって「開始」と宣言されたコンテナの完全な「説明」は次のとおりです。

  emulator-5554:
    Container ID:   
    Image:          dockerio.dlan/auto/android-avd-10a29v8-emu29_0_11_kuber-snapshot-skin_name-540x1060-hw_lcd_density-240
    Image ID:       
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:
      ANDROID_ADB_VERSION:      v39
      ANDROID_ADB_SERVER_PORT:  9100
      EMULATOR_PORT:            5554
      EMULATOR_MAX_SECS:        2400
      ANDROID_ADB_SERVER:       host
      EMU_WINDOW:               2
    Mounts:
      /dev/kvm from dev-kvm (rw)
      /logs from logs (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2jrv5 (ro)

答え1

使用できますkubectl 待機ポッドがReadyステータスになるまでテスト実行を一時停止します。

アプリに準備状況プローブを使用しない場合、ポッドがステータスにあることはアプリが実際にトラフィックを受け入れる準備ができていることを意味しないため、テストが不安定になる可能性があることに注意しReadyてください。

関連情報