- Pod 개념(복습) 및 사용 ← 오늘 볼 내용
- livenessProbe를 사용한 self-healing Pod
- init container
- infra container(pause) 이해
- static pod 만들기
- Pod에 resource 할당
- 환경변수를 이용해 컨테이너에 데이터 전달
- pod 구성 패턴의 종류
1. Pod 개념(복습) 및 사용
Pod : 컨테이너를 표현하는 k8s API의 최소 단위로 하나 이상의 컨테이너를 포함할 수 있다.
파드를 생성하는 두가지 방법
- kubectl run을 이용하여 직접 실행
- yaml파일을 이용하여 파드 생성
유용한 활용법 - 현재 namespace의 파드 정보확인
- kubectl get pod : 파드의 정보 간단하게 표시
- kubectl get pod -o wide : 파드의 상세정보 표시
- kubectl describe pod : 매우 상세하게 파드 정보 표시
- kubectl get pod -o yaml : 파드를 yaml코드 형식으로 표시
- kubectl get pod -o json : 파드를 json코드 형식으로 표시
- watch kubectl get pods -o wide : 파드의 상세정보를 2초마다 업데이트
- kubectl get pods -o wide --watch : 파드의 동작이 변경될 때마다 라인을 누적하여 표시
- kubectl get pod -o json | grep -i podip : 파드의 json코드 형식에서 파드 IP만 추출해서 표시
유용한 활용법 - 파드 수정
- kubectl edit pod : 실행중인 파드 수정
유용한 활용법 - 파드 삭제
- kubectl delete pod : 파드 삭제
- kubectl delete pod --all : 현재 namespace의 모든 파드 삭제
Multi-container Pod 생성
파드는 앞서 하나 이상의 컨테이너를 포함한다고 하였다.
실제로 두개의 컨테이너가 포함된 파드를 만들어보자.
# multi-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multipod
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
- name: centos-container
image: centos:7
command:
- sleep
- "10000"
파드에 nginx컨테이너와 centos7컨테이너를 하나의 파드에 생성하는 yaml코드다.
centos7의 경우는 추가적으로 커맨드를 넣어서 10000초 동안 대기하도록 한다.
# 멀티 파드 생성
kubectl create -f multi-pod.yaml
# 확인
kubectl get pods
멀티 컨테이너 파드와 단일 컨테이너 파드의 차이를 볼 수 있다.
READY 필드에 단일 컨테이너인 경우는 1/1로 표시되어 있고 멀티 컨테이너의 경우 2/2로 표시되어 있다.
파드 내에 몇개의 컨테이너가 실행 중인지 표시된다.
그리고 멀티 컨테이너 파드는 IP를 보면 1개만 표시가 된다.
쿠버네티스에서는 파드당 IP를 하나씩 부여하는데 컨테이너가 파드안에 몇개가 들어가든 항상 IP는 1개다.
즉, 동일 파드 내의 모든 컨테이너는 같은 IP를 가지고 연결되어 있음을 이해할 수 있다.
실제로 그런가?
우리는 yaml파일을 통해 nginx컨테이너를 하나 배포했기에 80포트로 접속하는 모든 사용자에게 웹페이지를 표시할 것이다.
반면에 centos의 경우는 웹서버가 존재하지 않기 때문에 80포트로 접속해도 아무런 동작을 하지 않을 것이다.
마스터 노드에서 curl 명령으로 multipod의 IP를 입력하면 웹페이지가 표시될 것인데 이는 nginx의 웹페이지다.
일단 알기 쉽게 nginx컨테이너의 index.html파일의 내용을 수정하고
# nginx 컨테이너의 내부로 접속하여 index.html파일 수정
kubectl exec multipod -it -c nginx-container -- /bin/bash
cd /usr/share/nginx/html/
echo "TEST web" > index.html
exit
참고로 파드에 접속하는 명령은 'kubectl exec' 며 우리는 멀티 컨테이너 파드로 생성했기 때문에 '-c' 를 붙여서 컨테이너의 이름도 함께 기재를 해주어야 파드 내 특정 컨테이너로 접속이 가능하다.
index.html파일의 내용을 TEST web으로 바꿨다.
이번에는 centos컨테이너로 접속해보자.
# centos 컨테이너에 접속
kubectl exec multipod -it -c centos-container -- /bin/bash
모처럼 centos로 들어왔으니 ps 명령으로 실행 중인 프로세스를 확인하면 nginx는 실행되지 않은 상태임을 확인 가능하다.
그럼 아까처럼 curl 명령으로 자기자신 컨테이너를 가리켜서 확인해보자.
분명 nginx는 프로세스에서 실행 중이 아님에도 불구하고 TEST web이라는 문구가 표시된다.
이는 동일 IP를 사용하는 컨테이너로서 80포트로 접속하면 nginx컨테이너의 내용이 표시됨을 알 수 있다.
하지만 동일 IP를 사용한다고 해서 모든 데이터가 공유되는 것은 아니며 각 컨테이너는 독립적인 파일시스템과 프로세스 공간을 갖기에 고립된 환경을 갖고 서로 격리되어있다.
kubectl logs로 컨테이너의 로그 확인하기
우리는 위 내용에서 파드 내 두 컨테이너 모두 접속을 시도했다.
로그는 관리자든 외부 사용자든 모든 사용자에 대해서 접속하거나 접근을 시도한 내용을 기록한 것이다.
멀티 컨테이너 파드의 내부 컨테이너 중 하나의 로그를 확인하기 위해서 '-c' 옵션을 사용한다.
# nginx컨테이너 로그 확인
kubectl logs multipod -c nginx-container
위 캡처와 같이 접속 및 접근을 시도한 모든 내용에 대해 언제, 어떻게, 무엇을 했는지 기록을 남긴다.
파드의 동작 flow
우리가 지난 포스트에서 쿠버네티스 동작원리에 대해서도 다뤘다.
파드가 생성되는 과정을 보면서 상태를 확인해보자.
1. kubectl create pod web --image=nginx 같은 명령을 입력하면 이 명령이 문법적으로 올바른지 권한이 존재하는지 검증 후 etcd 저장소에 있는 상태 정보를 확인한다.
2. web이라는 파드 이름이 중복이 있는지 검증 후 없는 것을 확인하면 API가 scheduler 요청을 보낸다.
3. scheduler는 etcd에 저장된 상태 정보를 기반으로 여러 node들 중에서 어디가 가장 좋은지 판단한다.
4. 만약 node2가 좋다고 판단되면 scheduler가 API에게 알려주고 API는 해당 노드로 접속하여 해당 노드의 kubelet에게 요청한다.
이 과정이 진행되기까지 파드는 pending 상태에 머물게 된다.
5. kubelet은 컨테이너를 실행하기 위해 런타임과 통신을 수행하며 런타임이 nginx 서비스에 대한 버전이 있는지 확인하고 있으면 컨테이너 이미지를 가져와서 실행시킨다.
이 과정이 진행되면 파드는 ContainerCreating 상태가 된다.
6. 파드가 정상적으로 실행된다.
모든 과정이 끝나면 파드는 Running 상태가 된다.
만약 어떤 과정에서든 문제가 발생하면 파드 생성을 중단하고 Failed 가 상태가 된다. (ErrImagePull, CrashLoopBackOff 등)
아래 공식문서에서 더 자세하게 나와있으니 궁금하면 확인해보자.
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/
아래 영상을 참고했습니다.
https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - Pod(4) (0) | 2023.12.07 |
---|---|
Kubernetes 기초 - Pod(3) (0) | 2023.12.07 |
Kubernetes 기초 - Pod(1) (0) | 2023.12.06 |
Kubernetes 기초 - 동작 원리 (0) | 2023.12.06 |
23.9.7(목) 쿠버네티스 9일차 (0) | 2023.09.07 |