kubernetes

[따배쿠] Pod

bbiyak2da 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 내 여러 개의 컨테이너들은, 같은 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 형태 중 하나
  • 기본 컨테이너와 함께 실행되는 보조 컨테이너
  • 기본 컨테이너에는 원래 목적의 기능에만 충실하고, 다른 부가적인 공통 기능은 사이드가 컨테이너를 추가하여 사용
  • 사용 사례
    1. 로그 수집: 애플리케이션 로그를 수집하여 문제를 디버깅하고 클러스터 활동을 모니터링
    2. 프록시 서버: 기본 컨테이너와 외부 서비스 간의 통신을 중개하는 역할을 수행
  • 예시) 웹 서버 컨테이너와 로그 수집 컨테이너로 구분
    • 웹 서버 컨테이너는 웹 서버로의 역할을 수행하고, 로그 수집 컨테이너는 파일시스템에 쌓이는 로그를 수집해서 외부의 로그 수집 시스템을 보내는 역할을 수행
    • 웹 서버 컨테이너만 다른 역할을 수행하는 컨테이너로 변경하고, 로그  수집 컨테이너는 그대로 사용 가능 (공통 역할을 하는 컨테이너의 재사용성 향상)

 

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