[따배쿠] Pod
Pod
- 컨테이너를 실행하는 쿠버네티스 API의 최소 단위
- 쿠버네티스는 컨테이너로 된 응용프로그램을 pod로 배포한다.
- 한 Pod는 애플리케이션의 단일 인스턴스이다.
- Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있다.
- 일반적으로, 한 Pod는 일반적으로 한 컨테이너와 1:1로 연결된다.
- scale up 하기 위해서 새로운 pod를 생성하고, scale down 하기 위해서 기존 pod를 삭제한다.
Pod 생성하기
#방법 1. kubectl run 명령으로 생성 (CLI)
root@master:~# kubectl run webserver --image=nginx:1.14
#방법 2. pod yaml을 통해 생성
root@master:~# vi pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- name: nginx-container
image: nginx:1.14
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
root@master:~# kubectl create -f pod-nginx.yaml
multi-container pod
- 한 Pod 내에서 여러 개의 컨테이너 구동
- 보통, 한 pod 내에 같은 종류의 컨테이너들을 가질 수 없다.
- ex) 한 pod 내에 2개의 nginx 컨테이너들을 소유하는건 권장되지 않는다.
- 한 pod 내에 다른 종류의 컨테이너들을 가질 수 있다.
- 보통, 한 pod 내에 같은 종류의 컨테이너들을 가질 수 없다.
- 한 Pod 내 여러 개의 컨테이너들은, 같은 IP를 가지며 포트 번호만 다를 뿐이다.
Multi-container pod 생성
- 한 pod 내에 container 2개 (nginx container, centOS container)
root@master:~# vi pod-multi.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"
root@master:~# kubectl create -f pod-multi.yaml
pod/multipod created
root@master:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
multipod 2/2 Running 0 35s 192.168.166.141 node1 <none> <none>
예시
1. multi-container 중, nginx container의 index.html 변경
# nginx container로 접속
root@master:~# kubectl exec multipod -c nginx-container -it -- /bin/bash
# nginx container의 index.html 내용 변경 후 확인
root@multipod:/usr/share/nginx/html# echo "Test web" > index.html
root@multipod:/usr/share/nginx/html# cat index.html
Test web
# pod 내 multi-container에서 container 간 IP는 동일하다.
ex) multipod의 ip가 192.168.166.141인 경우 그 안에 있는 nginx-container, centOS-container도 동일 IP를 가짐
root@master:~# kubectl get pods multipod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
multipod 2/2 Running 0 14m 192.168.166.141 node1 <none> <none>
root@master:~# kubectl describe pods multipod
Name: multipod
Namespace: default
Priority: 0
Service Account: default
Node: node1/10.100.0.101
Start Time: Sun, 10 Nov 2024 05:57:49 +0000
Labels: <none>
Annotations: cni.projectcalico.org/containerID: 79c1598f9d7a77822befa863ccb1ec27ea6a65644e845ee79dd25e3f8b9b1efb
cni.projectcalico.org/podIP: 192.168.166.141/32
cni.projectcalico.org/podIPs: 192.168.166.141/32
Status: Running
IP: 192.168.166.141
IPs:
IP: 192.168.166.141
Containers:
nginx-container:
Container ID: containerd://e4fc2a2447f34993dcd581517a547c182ab62d0f26bc142681446a07e2294e1b
Image: nginx:1.14
Image ID: docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 10 Nov 2024 05:57:49 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-4rfl4 (ro)
centos-container:
Container ID: containerd://10d59ff83609cc5ed5455b0ca846e4cddd45f20a166856b1506bc80e644fee45
Image: centos:7
Image ID: docker.io/library/centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Port: <none>
Host Port: <none>
Command:
sleep
10000
State: Running
Started: Sun, 10 Nov 2024 05:57:59 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-4rfl4 (ro)
Conditions:
Type Status
PodReadyToStartContainers True
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-4rfl4:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 17m default-scheduler Successfully assigned default/multipod to node1
Normal Pulled 17m kubelet Container image "nginx:1.14" already present on machine
Normal Created 17m kubelet Created container nginx-container
Normal Started 17m kubelet Started container nginx-container
Normal Pulling 17m kubelet Pulling image "centos:7"
Normal Pulled 17m kubelet Successfully pulled image "centos:7" in 9.661s (9.661s including waiting). Image size: 76101639 bytes.
Normal Created 17m kubelet Created container centos-container
Normal Started 17m kubelet Started container centos-container
기타. pod 내 container의 log 출력
kubectl logs [pod명] -c [container명]
[예시]
kubectl logs multipod -c nginx-container #multi-container의 경우 컨테이너 명을 지정
kubectl logs web1 #단일 container의 경우 pod 이름만 지정
Side-car Container
- Multi-container pod 형태 중 하나
- 기본 컨테이너와 함께 실행되는 보조 컨테이너
- 기본 컨테이너에는 원래 목적의 기능에만 충실하고, 다른 부가적인 공통 기능은 사이드가 컨테이너를 추가하여 사용
- 사용 사례
- 로그 수집: 애플리케이션 로그를 수집하여 문제를 디버깅하고 클러스터 활동을 모니터링
- 프록시 서버: 기본 컨테이너와 외부 서비스 간의 통신을 중개하는 역할을 수행
- 예시) 웹 서버 컨테이너와 로그 수집 컨테이너로 구분
- 웹 서버 컨테이너는 웹 서버로의 역할을 수행하고, 로그 수집 컨테이너는 파일시스템에 쌓이는 로그를 수집해서 외부의 로그 수집 시스템을 보내는 역할을 수행
- 웹 서버 컨테이너만 다른 역할을 수행하는 컨테이너로 변경하고, 로그 수집 컨테이너는 그대로 사용 가능 (공통 역할을 하는 컨테이너의 재사용성 향상)
Pod 관련 Command
1. Pod 정보 확인
kubectl get pods
kubectl get pods -o wide
kubectl get pods -o yaml
kubectl get pods -o json
kubectl get pods [pod 이름] -o json | grep -i podip
watch kubectl get pods -o wide #watch 명령어는 해당 뒤 명령어를 2초마다 한 번씩 실행
kubectl describe pod [pod명]
2. Pod에 접속해서 결과 보기
curl <pod's ip>
3. 동작중인 pod 수정
kubectl edit pod webserver
4. 동작중인 pod 삭제
kubectl delete pod webserver
kubectl delete pod --all
참고 영상
https://www.youtube.com/watch?v=0rYt3PcggzA&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=10
https://www.youtube.com/watch?v=nvBKnFfiy7M&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=11
참고 문서
https://arisu1000.tistory.com/27863
쿠버네티스 pod 구성 패턴
사이드카 패턴(Sidecar) 사이드카 패턴은 원래 사용하려고 했던 기본컨테이너의 기능을 확장하거나 강화하는 용도의 컨테이너를 추가하는 패턴입니다. 기본 컨테이너에는 원래 목적의 기능에만
arisu1000.tistory.com