일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 국제화
- 재갱신
- 파이썬
- 스프링
- 데이터베이스
- githubactions
- 오블완
- yaml-resource-bundle
- AWS
- docker
- 스프링부트
- JIRA
- Spring
- oauth2
- 메시지
- CI/CD
- 토이프로젝트
- 액세스토큰
- 백준
- java
- 리프레시토큰
- 프로그래머스
- springsecurityoauth2client
- 트랜잭션
- 도커
- springsecurity
- 소셜로그인
- 티스토리챌린지
- 스프링시큐리티
- springdataredis
- Today
- Total
땃쥐네
[Kubernetes] 파드(Pod) 디버깅하는 방법 본문
쿠버네티스로 애플리케이션을 운영, 관리하다보면 대부분의 문제는 파드에서 발생한다.
유지/보수 관점에서는 대부분의 시간을 결국 파드에서 발생하는 문제를 해결하는데 써야하는데, 이를 디버깅하는 방법을 알아둘 필요가 있다.
파드(Pod)가 정상적으로 실행되지 않았을 때
보통 파드 관련 문제는
파드 실행 이전, 파드 실행 이후 파드 내부 컨테이너가 죽거나 에러가 발생하는 경우 두 가지로 나뉠 수 있다.
파드 실행 이전 단계에서 문제가 터지면, 파드 자체에 접속하는 것도 불가능하다.
redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- name: redis-container
image: redis:v1234
ports:
- containerPort: 6379
예시로, 위와 같이 매니페스트 파일을 작성하고 파드를 생성해보도록 하겠다.
image의 redis:v1234 는 실제 존재하지 않는 도커 이미지이고, 실제 docker hub 레지스트리에도 존재하지 않는다.
kubectl apply -f redis-pod.yaml
이 명령을 실행하면 redis-pod 파드 생성을 시도한다.
kubectl get pods
1차적으로 파드가 제대로 실행됐는 지 확인하려면
kubectl get pod(또는 pods) 명령을 통해 파드 목록을 조회해보면 된다.
파드 생성에 실패했다면 STATUS 를 통해 간단한 상태 정보를 확인할 수 있다.
여기서 STATUS 를 보면 ErrImagePull 이라고, 이미지 풀링에 실패했다는 메시지가 나타난다. 뭔가 이미지 풀링에 실패했다는 것을 위 메시지만 보고 추측은 할 수 있다.
하지만 이런 정보만 가지고 뭐가 문제인지 알기 힘들 수 있다.
# kubectl describe pods [파드명]
$ kubectl describe pods redis-pod # redis-pod 파드의 세부 정보 조회
더 상세한 정보를 확인하고 싶은 경우 kubectl describe pods 명령을 사용하면 파드의 상세 정보를 조회할 수 있는데, 여기서 Events 쪽에서 좀 더 상세한 로그를 확인할 수 있다.
실행 과정에서 이미지 풀링을 시도했고, 이미지를 찾지 못 했다는 메시지를 출력한다.
redis:v1234 이미지를 찾지 못 했다는 메시지를 볼 수 있다.
이런 메시지를 읽어서, 문제를 해결을 위해 참고할 수 있을 것이다.
파드(Pod)의 로그를 확인하고 싶을 때
파드는 정상적으로 실행됐는데 내부에서 컨테이너를 실행하는 과정에서 문제가 터졌을 수도 있고, 컨테이너가 잘 작동하다가 도중에 예상치 못한 이유로 죽는 경우도 존재한다.
혹은 파드가 지금 잘 작동하는데 파드 내부의 프로세스가 잘 동작하는 지 확인해보고 싶을 수 있다.
일단 파드 내부에서 애플리케이션이 잘 작동하는 지 로그를 확인해보는 법을 알아보자.
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- name: redis-container
image: redis:7.4.2 # 실제 존재하는 태그의 redis 이미지
ports:
- containerPort: 6379
이전에 작성했던 redis-pod.yaml 파일에서, redis 의 태그명을 7.4.2 로 바꿔보았다.
별도로 ImagePullPolicy 를 작성하지 않았고 이미지 태그를 구체적으로 지정했기 때문에 IfNotPresent 이미지 풀 정책이 적용된다.
로컬에서 이미지가 존재하는 지 먼저 확인하고, 존재 하지 않는다면 레지스트리를 통해 이미지를 조회해온다. DockerHub 의 redis 이미지가 가져와지고, 7.4.2 버전이 가져와져서 파드가 실행될 것이다.
kubectl delete pod redis-pod
kubectl apply -f redis-pod.yaml
기존에 잘못 만들었던 redis-pod 를 제거하고, 다시 redis-pod.yaml 파일을 통해 파드를 생성해보자.
kubectl get pod
kubectl get pod 명령을 사용하면, 파드가 잘 실행됐는 지 1차적으로 목록을 통해 확인할 수 있다.
# kubectl logs [파드명]
$ kubectl logs redis-pod
여기서 redis-pod 내부의 로그를 확인하려면 위 명령을 입력하면 된다.
실제 파드 내부에서 출력되는 로그를 확인할 수 있는데, redis 컨테이너의 메시지가 출력되는 것을 볼 수 있다.
파드(Pod)에 접속하고 싶을 때
# kubectl exec -it [파드명] -- bash
$ kubectl exec -it nginx-pod -- bash
# kubectl exec -it [파드명] -- sh
$ kubectl exec -it nginx-pod -- sh
이것은 지난번 글들에서도 몇 번 다뤘던 방식이다.
쿠버네티스 파드에 직접 쉘을 통해 접속하는 방법이다.
컨테이너 사양에 따라 bash/ shell 로 사용할 수 있는 쉘이 다를 수 있다. 어느 한쪽이 안 되면 반대쪽 명령을 입력해서 접속하면 된다.
놓쳤던 맹점 : 사실 위의 명령을 통해 접근한 것들은 파드가 아니라 파드 내부의 컨테이너
그런데 나는 redis-pod 에 bash 명령을 통해 접속했는데, 들어온 창에서 바로 바로 redis-cli 를 통해 레디스 명령줄로 넘어간 것을 알 수 있다.
내가 들어왔다고 생각한 것은 redis-pod 인줄 알았는데, 사실 redis-pod 안에 위치한 redis-container 였던 것이다.
# kubectl exec -it [파드명] -c 컨테이너명 -- bash
# kubectl exec -it [파드명] -c 컨테이너명 -- sh
kubectl exec -it my-pod -c main-container -- bash
이것이 왜 그런지 궁금해서, 쿠버네티스 공식문서의 Get a Shell to a Running Container 문서를 확인했는데, 이 문서에서 말한 바에 따르면 사실 exec -it 명령은 파드의 컨테이너에 접속하는 명령이였던 것이다.
-c 옵션을 제외할 경우 먼저 선언된 컨테이너에 접속하게 된다.
파드 내에 컨테이너가 두 개 이상 존재하는데 원해는 컨테이너에 접속하고 싶은 경우 -c 옵션을 통해 구체적인 컨테이너도 지정해서 접속해야한다.
kubectl logs 명령 역시, 컨테이너 옵션을 생략할 경우 첫번째 컨테이너에 대한 로그를 조회하는 명령이였다.
파드 내에 컨테이너가 두개 이상 있을 경우 'kubectl logs -c 컨테이너명' 을 통해 컨테이너를 지정해야한다.
그런데 파드 내에 컨테이너 두 개를 지정하는 경우는 일반적이지 않은 경우이므로 이 명령을 쓸 일은 그렇게 많지 않을 듯 하다.
[참고자료]
[Inflearn 강의] 비전공자도 이해할 수 있는 쿠버네티스 입문/실전
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] 스프링부트 파드 실행 (+ ImagePullPolicy 주의점) (1) | 2025.03.02 |
---|---|
[Kubernetes] 파드-쿠버네티스 네트워크, 파드 외부에서 접속하기 (0) | 2025.02.27 |
[Kubernetes] 파드(Pod) 생성 및 목록 조회 (0) | 2025.02.26 |
[Kubernetes] 파드(Pod) (0) | 2025.02.26 |
[Kubernetes] Windows 로컬 환경에서 쿠버네티스 설치 (0) | 2025.02.25 |