[kubernetes] 내 kubernetes 포드가 “CrashLoopBackOff”로 계속 충돌하지만 로그를 찾을 수 없습니다.

이것이 내가 계속 얻는 것입니다.

[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


답변

부트 스트랩 속도가 느린 애플리케이션이있는 경우 준비 상태 / 활성 상태 프로브의 초기 값과 관련이있을 수 있습니다. initialDelaySecondsSpringBoot응용 프로그램이 많은 초기화를 처리 하므로 값 을 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에 의해 제공됩니다 .

상태 또는 준비 상태 확인 알고리즘은 다음과 같이 작동합니다.

  1. 기다립니다 initialDelaySeconds
  2. 확인을 수행하고 timeoutSeconds연속 성공 횟수가 successThreshold반환 성공 보다 큰 경우 시간 초과를 기다립니다.
  3. 연속 실패 수가 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" ]
...

나를 위해 작동합니다.