ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Pod
    kubernetes 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

     

Designed by Tistory.