이것이 내가 계속 얻는 것입니다.
[root@centos-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-server-h6nw8 1/1 Running 0 1h
nfs-web-07rxz 0/1 CrashLoopBackOff 8 16m
nfs-web-fdr9h 0/1 CrashLoopBackOff 8 16m
아래는 “describe pods” kubectl describe pods의 출력입니다.
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
16m 16m 1 {default-scheduler } Normal Scheduled Successfully assigned nfs-web-fdr9h to centos-minion-2
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id d56f34ae4e8f
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id d56f34ae4e8f
16m 16m 2 {kubelet centos-minion-2} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "web" with CrashLoopBackOff: "Back-off 10s restarting failed container=web pod=nfs-web-fdr9h_default(461c937d-d870-11e6-98de-005056040cc2)"
nfs-web-07rxz, nfs-web-fdr9h라는 두 개의 포드가 있지만 “kubectl logs nfs-web-07rxz”를 수행하거나 “-p”옵션을 사용하면 두 포드 모두에 로그가 표시되지 않습니다.
[root@centos-master ~]# kubectl logs nfs-web-07rxz -p
[root@centos-master ~]# kubectl logs nfs-web-07rxz
이것은 내 replicationController yaml 파일입니다.
replicationController yaml 파일
apiVersion: v1 kind: ReplicationController metadata: name: nfs-web spec: replicas: 2 selector:
role: web-frontend template:
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: eso-cmbu-docker.artifactory.eng.vmware.com/demo-container:demo-version3.0
ports:
- name: web
containerPort: 80
securityContext:
privileged: true
내 Docker 이미지는 다음과 같은 간단한 Docker 파일로 만들어졌습니다.
FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y nfs-common
CentOs-1611, kube 버전에서 kubernetes 클러스터를 실행하고 있습니다.
[root@centos-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/amd64"}
“docker run”으로 도커 이미지를 실행하면 문제없이 이미지를 실행할 수 있었지만 kubernetes를 통해서만 충돌이 발생했습니다.
누군가 나를 도울 수 있습니까? 로그를 보지 않고 어떻게 디버깅 할 수 있습니까?
답변
@Sukumar가 언급했듯이 Dockerfile 에 실행할 명령 이 있거나 ReplicationController가 명령을 지정하도록해야합니다.
포드가 시작된 후 즉시 종료되기 때문에 충돌이 발생하므로 Kubernetes가 다시 시작되고주기가 계속됩니다.
답변
kubectl -n <namespace-name> describe pod <pod name>
kubectl -n <namespace-name> logs -p <pod name>
답변
후속 kubectl exec 호출을 위해 포드를 계속 실행할 필요가 있었고 위의 설명에서 지적했듯이 모든 작업 실행을 완료했기 때문에 내 포드가 내 k8s 클러스터에 의해 죽임을당했습니다. 다음과 같이 자동으로 중지되지 않는 명령으로 포드를 걷어차 서 포드를 계속 실행했습니다.
kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null
답변
부트 스트랩 속도가 느린 애플리케이션이있는 경우 준비 상태 / 활성 상태 프로브의 초기 값과 관련이있을 수 있습니다. initialDelaySeconds
내 SpringBoot
응용 프로그램이 많은 초기화를 처리 하므로 값 을 120s로 늘려 문제를 해결했습니다 . 문서에는 기본값 0 ( https://kubernetes.io/docs/api-reference/v1.9/#probe-v1-core )이 언급되어 있지 않습니다.
service:
livenessProbe:
httpGet:
path: /health/local
scheme: HTTP
port: 8888
initialDelaySeconds: 120
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
readinessProbe:
httpGet:
path: /admin/health
scheme: HTTP
port: 8642
initialDelaySeconds: 150
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
이러한 값에 대한 아주 좋은 설명은 What is the default value of initialDelaySeconds에 의해 제공됩니다 .
상태 또는 준비 상태 확인 알고리즘은 다음과 같이 작동합니다.
- 기다립니다
initialDelaySeconds
- 확인을 수행하고
timeoutSeconds
연속 성공 횟수가successThreshold
반환 성공 보다 큰 경우 시간 초과를 기다립니다.- 연속 실패 수가
failureThreshold
리턴 실패 보다 큰 경우 그렇지 않으면 대기periodSeconds
하고 새 검사를 시작하십시오.
제 경우에는 애플리케이션이 이제 매우 명확한 방식으로 부트 스트랩 할 수 있으므로 때때로 해당 속도의 한계에 도달하기 때문에주기적인 충돌 루프백 오프가 발생하지 않는다는 것을 알 수 있습니다.
답변
에서 이 페이지 의 모든 명령이 종료하기 때문에, 컨테이너 제대로 모든 것을 실행 한 후 다이하지만 충돌합니다. 서비스를 포 그라운드에서 실행하거나 연결 유지 스크립트를 만듭니다. 이렇게하면 Kubernetes는 애플리케이션이 실행 중임을 보여줍니다. 우리는에주의해야 할 Docker
환경이 문제가 발생하지 않습니다. 실행중인 앱을 원하는 것은 Kubernetes뿐입니다.
업데이트 (예) :
Netshoot 컨테이너를 시작할 때 CrashLoopBackOff 를 피하는 방법은 다음과 같습니다 .
kubectl run netshoot --image nicolaka/netshoot -- sleep infinity
답변
내 포드가 계속 충돌했고 원인을 찾을 수 없었습니다. 다행히도 kubernetes가 내 포드가 충돌하기 전에 발생한 모든 이벤트를 저장하는 공간이 있습니다.
(타임 스탬프별로 정렬 된 #List Events)
이러한 이벤트를 보려면 다음 명령을 실행하십시오.
kubectl get events --sort-by=.metadata.creationTimestamp
--namespace mynamespace
필요한 경우 명령에 인수 를 추가하십시오.
명령 출력에 표시된 이벤트는 내 포드가 계속 충돌하는 이유를 보여줍니다.
답변
yaml 파일에서 명령 및 인수 줄을 추가합니다.
...
containers:
- name: api
image: localhost:5000/image-name
command: [ "sleep" ]
args: [ "infinity" ]
...
나를 위해 작동합니다.
