
私の 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
てください。