본문 바로가기

개발하자

GKE(Kubernetes)에 Dango 앱을 배포할 때 발생한 충돌 루프 백오프 오류

반응형

GKE(Kubernetes)에 Dango 앱을 배포할 때 발생한 충돌 루프 백오프 오류

여러분,

지금도 계속되는 문제: 이제 에밀 기가 제안한 대로 도커 파일 실행 명령을 수정하여 코드가 크래시루프백오프에 걸리는 것을 넘어섰지만 외부 IP가 내 포드 라이브러리 앱 서버로 전달되지 않습니다

상황

  • Docker 파일에서 포트를 8080으로 고정하고 포트가 일관성이 있는지 확인
  • 시작 후 즉시 종료되지 않도록 도커 파일에 적절한 명령이 있는지 확인하십시오. 이것이 충돌 루프백의 원인이었습니다
  • 문제는 여전히 내가 클릭하는 로드 밸런서 외부 IP에서 "이 사이트에 연결할 수 없습니다. 34.93.141.11 연결 거부"라는 오류가 발생한다는 것입니다

원래 질문:

이 크래시 루프 백 오프를 해결하려면 어떻게 해야 합니까? 나는 많은 문서들을 보고 디버깅을 시도했지만 무엇이 이것을 야기하는지 확실하지 않다? 앱은 로컬 모드에서 완벽하게 실행되고 앱 엔진 표준에 원활하게 배포되지만 GKE는 아니다. 이것을 디버그하기 위한 어떤 조언도 더 감사하다. cloudsql 프록시 컨테이너가 실행 중이지만 라이브러리-앱 컨테이너에 CrashLoopBackOff 오류가 발생하고 있습니다. 포드가 노드에 할당되어 이미지를 당기기 시작하고 이미지를 시작한 다음 이 BackOff 상태로 전환됩니다.

 $ kubectl get pods
NAME                       READY   STATUS             RESTARTS   AGE
library-7699b84747-9skst   1/2     CrashLoopBackOff   28         121m

$ kubectl logs library-7699b84747-9skst 
Error from server (BadRequest): a container name must be specified for pod library-7699b84747-9skst, choose one of: [library-app cloudsql-proxy]

​$ kubectl describe pods library-7699b84747-9skst
Name:               library-7699b84747-9skst
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               gke-library-default-pool-35b5943a-ps5v/10.160.0.13
Start Time:         Fri, 06 Dec 2019 09:34:11 +0530
Labels:             app=library
                    pod-template-hash=7699b84747
Annotations:        kubernetes.io/limit-ranger: LimitRanger plugin set: cpu request for container library-app; cpu request for container cloudsql-proxy
Status:             Running
IP:                 10.16.0.10
Controlled By:      ReplicaSet/library-7699b84747
Containers:
  library-app:
    Container ID:   docker://e7d8aac3dff318de34f750c3f1856cd754aa96a7203772de748b3e397441a609
    Image:          gcr.io/library-259506/library
    Image ID:       docker-pullable://gcr.io/library-259506/library@sha256:07f54e055621ab6ddcbb49666984501cf98c95133bcf7405ca076322fb0e4108
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Fri, 06 Dec 2019 09:35:07 +0530
      Finished:     Fri, 06 Dec 2019 09:35:07 +0530
    Ready:          False
    Restart Count:  2
    Requests:
      cpu:  100m
    Environment:
      DATABASE_USER:      <set to the key 'username' in secret 'cloudsql'>  Optional: false
      DATABASE_PASSWORD:  <set to the key 'password' in secret 'cloudsql'>  Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-kj497 (ro)
  cloudsql-proxy:
    Container ID:  docker://352284231e7f02011dd1ab6999bf9a283b334590435278442e9a04d4d0684405
    Image:         gcr.io/cloudsql-docker/gce-proxy:1.16
    Image ID:      docker-pullable://gcr.io/cloudsql-docker/gce-proxy@sha256:7d302c849bebee8a3fc90a2705c02409c44c91c813991d6e8072f092769645cf
    Port:          <none>
    Host Port:     <none>
    Command:
      /cloud_sql_proxy
      --dir=/cloudsql
      -instances=library-259506:asia-south1:library=tcp:3306
      -credential_file=/secrets/cloudsql/credentials.json
    State:          Running
      Started:      Fri, 06 Dec 2019 09:34:51 +0530
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        100m
    Environment:  <none>
    Mounts:
      /cloudsql from cloudsql (rw)
      /etc/ssl/certs from ssl-certs (rw)
      /secrets/cloudsql from cloudsql-oauth-credentials (ro)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-kj497 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  cloudsql-oauth-credentials:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cloudsql-oauth-credentials
    Optional:    false
  ssl-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/ssl/certs
    HostPathType:  
  cloudsql:
    Type:    EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:  
  default-token-kj497:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-kj497
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age               From                                             Message
  ----     ------     ----              ----                                             -------
  Normal   Scheduled  86s               default-scheduler                                Successfully assigned default/library-7699b84747-9skst to gke-library-default-pool-35b5943a-ps5v
  Normal   Pulling    50s               kubelet, gke-library-default-pool-35b5943a-ps5v  pulling image "gcr.io/cloudsql-docker/gce-proxy:1.16"
  Normal   Pulled     47s               kubelet, gke-library-default-pool-35b5943a-ps5v  Successfully pulled image "gcr.io/cloudsql-docker/gce-proxy:1.16"
  Normal   Created    46s               kubelet, gke-library-default-pool-35b5943a-ps5v  Created container
  Normal   Started    46s               kubelet, gke-library-default-pool-35b5943a-ps5v  Started container
  Normal   Pulling    2s (x4 over 85s)  kubelet, gke-library-default-pool-35b5943a-ps5v  pulling image "gcr.io/library-259506/library"
  Normal   Created    1s (x4 over 50s)  kubelet, gke-library-default-pool-35b5943a-ps5v  Created container
  Normal   Started    1s (x4 over 50s)  kubelet, gke-library-default-pool-35b5943a-ps5v  Started container
  Normal   Pulled     1s (x4 over 52s)  kubelet, gke-library-default-pool-35b5943a-ps5v  Successfully pulled image "gcr.io/library-259506/library"
  Warning  BackOff    1s (x5 over 43s)  kubelet, gke-library-default-pool-35b5943a-ps5v  Back-off restarting failed container​

여기 도서관이야. yaml 파일을 가지고 가야 해.

# [START kubernetes_deployment]
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: library
  labels:
    app: library
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: library
    spec:
      containers:
      - name: library-app
        # Replace  with your project ID or use `make template`
        image: gcr.io/library-259506/library
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        env:
            # [START cloudsql_secrets]
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: password
            # [END cloudsql_secrets]
        ports:
        - containerPort: 8080

      # [START proxy_container]
      - image: gcr.io/cloudsql-docker/gce-proxy:1.16
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql", 
                  "-instances=library-259506:asia-south1:library=tcp:3306",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      # [END proxy_container] 
      # [START volumes]
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir:
      # [END volumes]        
# [END kubernetes_deployment]

---
    # [START service]
    # The library-svc service provides a load-balancing proxy over the polls app
    # pods. By specifying the type as a 'LoadBalancer', Container Engine will
    # create an external HTTP load balancer.
    # The service directs traffic to the deployment by matching the service's selector to the deployment's label
    #
    # For more information about external HTTP load balancing see:
    # https://cloud.google.com/container-engine/docs/load-balancer
    apiVersion: v1
    kind: Service
    metadata:
      name: library-svc
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: library

    # [END service]

더 많은 오류 상태

Container 'library-app' keeps crashing.
CrashLoopBackOff
Reason  
Container 'library-app' keeps crashing.
Check Pod's logs to see more details. Learn more
Source  
library-7699b84747-9skst

Conditions  
Initialized: True Ready: False ContainersReady: False PodScheduled: True

 - lastProbeTime: null
    lastTransitionTime: "2019-12-06T06:03:43Z"
    message: 'containers with unready status: [library-app]'
    reason: ContainersNotReady
    status: "False"
    type: ContainersReady

주요 이벤트

백오프 재시작 실패 컨테이너 백오프 2019년 12월 6일 오전 9:34:54, 2019년 12월 6일 오후 12:24:26 PM 779 풀링 이미지

"gcr.io/library-259506/library " 2019년 12월 6일 오전 9:34:12 2019년 12월 6일 오전 11:59:26 34

도커 파일은 다음과 같습니다(이것은 충돌 루프를 수정했습니다):

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

# Server
EXPOSE 8080
STOPSIGNAL SIGINT
ENTRYPOINT ["python", "manage.py"]
CMD ["runserver", "0.0.0.0:8080"]



많은 것들이 함께 모인 것 같아요

  • 나는 DB에 대한 비밀번호에 따옴표 안에 넣어야 하는 특수한 문자가 있다는 것을 발견하고 포트 #을 도커 파일, 라이브러리.yaml 파일 전반에 걸쳐 정확하게 보장했다. 이것은 비밀이 실제로 작동하는 것을 보장했고, 나는 로그에서 비밀번호 불일치 문제를 발견했다.
  • 중요: 명령줄은 내 도커 파일이 빨리 종료되지 않도록 에밀 G를 수정하므로 CMD가 실제로 작동하고 서버를 실행하는지 확인하십시오.
  • 중요: 마침내 서버에 연결되지 않는 외부 IP에 대한 해결책을 찾았습니다. 무엇이 잘못되었는지 설명하는 이 스레드를 참조하십시오. 기본적으로 root로 실행되지 않도록 실행A를 수정해야 하는 보안 컨텍스트가 필요했습니다:
  • 또한 1-15단계를 배포하기 위한 모든 단계를 문서화했습니다



이것에 대한 더 많은 정보: 내가 추천하는 몇 가지 일들이 있다.

  1. 로컬 이미지를 모두 삭제합니다:

    sudo docker images
    sudo docker stop $(sudo docker ps -aq)
    sudo docker rmi -f $(sudo docker images -aq) 
    
  2. 다음 코드에 오류가 있는지 확인하십시오

    docker build -f ./docker/rest-api/Dockerfile .
    
  3. 만약 그것이 깨끗하게 나온다면, 당신의 장고 코드를 시험해 보세요. 구문 오류로 인해 오류가 발생하는 것을 발견했습니다.


반응형