
CI 테스트 논리의 일부로 각 전용 노드에 대한 Kubernetes 배포 파일을 생성하고 이전 배포를 삭제한 다음 새 배포를 시작하는 스크립트가 있습니다. (구성은 중요하지 않기 때문에 맨 아래에 추가되었습니다.) 일단 테스트를 실행하고 나면 다음 테스트 실행을 위해 종료될 준비가 됩니다. 노드는 배포만 실행하므로 CPU/메모리/필요한 항목을 선언하는 데 신경 쓰지 않고 컨테이너가 자체적으로 작업을 수행하므로 준비 스크립트가 없으며 대화만 하면 됩니다. IP 주소가 있으면 상태 모니터링 서비스로 이동합니다.
일반적으로 그들은 준비가 되어 1분 정도 내에 작동합니다. 내 스크립트는 아무것도 'false'라고 보고하지 않을 때까지 다음 명령의 출력을 모니터링합니다. 그러나 가끔은 내가 허용하는 시간 내에 시작되지 않는 경우가 많습니다. 문제가 발생하더라도 무한정 기다리기를 원하지 않습니다. 주소를 수집하여 다운스트림 프로세스에 공급하고 DID가 완료된 배포로 테스트를 설정해야 합니다. 하지만 kubernetes가 의미 있는 진행 상황을 표시할 수 없거나 속도가 느린 이유를 진단하려면 불완전한 배포를 중단하는 것 외에는 할 수 있는 일이 없습니다.
kubectl get pods -l pod-agent=$AGENT_NAME \
-o 'jsonpath={range .items[*]}{..status.conditions[?(@.type=="Ready")].status}:{.status.podIP}:{.status.phase}:{.metadata.name} '
컨테이너 중 하나가 이전에 해당 호스트에서 사용되지 않았을 수도 있고 각 호스트에 복사하는 데 너무 오랜 시간이 걸려 전체 배포가 내 스크립트의 시간 초과를 초과했을 수도 있다는 이론을 세웠습니다. 그래서 다음을 추가했습니다(무시) | 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개의 선행(!) 항목에서 다소 이상하게 잘렸습니다.
이벤트 클레임이 '시작'된 컨테이너 중 하나에 대한 전체 설명을 마지막에 포함했지만 전체 출력에는 어떤 단서도 표시되지 않습니다.
배포가 시작되면 첫 번째 줄에 'true'가 표시되고 모든 컨테이너가 갑자기 '실행 중'으로 표시됩니다.
describe pod
따라서 내 근본적인 질문은 내 배포의 실제 상태('이벤트'로 표시되는 것으로 보임)를 어떻게 확인하여 배포가 실패할 때 배포가 명백히 신뢰할 수 없거나 불완전한 경우 왜 그리고 어디서 멈추는지 이해하는 것입니다.
실제 플레이 상태를 찾는 데 사용할 수 있는 'kubectl get pods' 외에 다른 것이 있나요? (서버에 SSH로 접속하여 원시 로그를 스니핑하는 것과 같은 악의적인 작업은 바람직하지 않습니다.)
감사해요.
kubectl 버전 클라이언트 버전: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-13T11: 23:11Z", GoVersion:"go1.12.12", 컴파일러:"gc", 플랫폼:"linux/amd64"} 서버 버전: version.Info{Major:"1", Minor:"15", GitVersion:"v1 .15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"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 잠깐만요Pod가 Ready
상태가 될 때까지 테스트 실행을 일시 중지합니다.
앱에 대한 준비 상태 검사를 사용하지 않는 경우 Pod가 상태에 있다고 해서 Ready
앱이 실제로 트래픽을 받아들일 준비가 되었다는 의미는 아니므로 테스트가 불안정해질 수 있습니다.