-
[따배쿠] Podkubernetes 2024. 11. 10. 15:22
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
'kubernetes' 카테고리의 다른 글
[따배쿠] Pod - init container & infra container (1) 2024.12.01 [따배쿠] Pod - liveness Probe를 이용해서 Self-healing Pod 만들기 (1) 2024.12.01 [따배쿠] namespace (1) 2024.11.10 [따배쿠] 쿠버네티스 컨테이너 동작 Flow (0) 2024.11.09 [따배쿠] kubectl command (0) 2024.11.09