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단계를 배포하기 위한 모든 단계를 문서화했습니다
이것에 대한 더 많은 정보: 내가 추천하는 몇 가지 일들이 있다.
로컬 이미지를 모두 삭제합니다:
sudo docker images sudo docker stop $(sudo docker ps -aq) sudo docker rmi -f $(sudo docker images -aq)
다음 코드에 오류가 있는지 확인하십시오
docker build -f ./docker/rest-api/Dockerfile .
만약 그것이 깨끗하게 나온다면, 당신의 장고 코드를 시험해 보세요. 구문 오류로 인해 오류가 발생하는 것을 발견했습니다.
'개발하자' 카테고리의 다른 글
Azure DevOps 파이프라인 - Python - sys.path.append() 또는 PYSTONPATH를 설정했음에도 불구하고 Module NotFound 오류가 발생했습니다 (0) | 2023.08.01 |
---|---|
Python에서 문자열을 Enum으로 변환 (0) | 2023.07.31 |
테라폼 오류: 잠금 상태 오류: 상태 잠금을 획득하는 동안 오류가 발생했습니다. 2개의 오류가 발생했습니다: (0) | 2023.07.30 |
도커 데스크톱에서 새로운 쿠버네티스 클러스터를 만드는 방법은 무엇인가요? (0) | 2023.07.29 |
유니코드(자체)와 자체의 차이점은 무엇인가요.파이썬 클래스의 __유니코드__()? (1) | 2023.07.29 |