TIL

10_2.k8s Pod와 Deployment 관리 실습

꿀승 2025. 2. 27. 10:31
728x90
반응형
SMALL

학습내용

  1. kubectl
  2. Kubernetes의 구조와 관리
  3. Pod 및 Deployment 실습
  4. 부록 k8s 용어

학습정리

1. kubctl

  • kubectl은 Kubernetes 클러스터를 관리하는 명령줄 인터페이스(CLI) 도구
  • 주요기능
    • 리소스 생성, 조회, 수정, 삭제
      • Kubernetes 리소스(Pod, Deployment, Service 등)를 생성하고 관리
      • kubectl apply -f <파일명>.yaml을 통해 YAML 파일 기반 배포
      • kubectl delete <리소스 유형> <리소스 이름>으로 리소스 삭제
    • 클러스터 및 리소스 모니터링
      • 실행 중인 리소스를 조회 (kubectl get pods, kubectl get deployments)
      • 리소스의 상태와 이벤트 확인 (kubectl describe <리소스> <이름>)
      • CPU 및 메모리 사용량 확인 (kubectl top pods, kubectl top nodes)
    • 디버깅 및 문제 해결
      • 컨테이너 로그 조회 (kubectl logs <pod 이름>)
      • 실행 중인 컨테이너 내부 접근 (kubectl exec -it -- /bin/sh)
      • 문제 발생 시 이벤트 확인 (kubectl get events)
    • 네트워크 및 포트 관리
      • Kubernetes 내부 네트워크를 통한 접근 및 트러블슈팅 (kubectl port-forward, kubectl proxy)
      • 서비스 및 네임스페이스 관리
    • 컨테이너 배포 및 롤백
      • 애플리케이션 업데이트 및 롤백 (kubectl rollout undo deployment/)
      • 블루-그린 배포 및 카나리 배포와 같은 배포 전략 관리
  • 중요성
    1. 운영 효율성 증대
      • Kubernetes API를 직접 호출할 필요 없이 직관적인 명령어로 클러스터 관리 가능
      • YAML 설정 파일을 사용한 일관된 리소스 배포 및 변경
    2. Kubernetes 리소스 최적화 및 안정성 유지
      • 리소스 사용량을 실시간으로 모니터링하여 클러스터를 최적화
      • 컨테이너 장애 발생 시 빠르게 대응하여 애플리케이션 가용성 유지
    3. CI/CD 및 자동화와의 연계
      • kubectl 명령을 CI/CD 파이프라인과 통합하여 자동화된 배포 구현 가능
      • GitOps, ArgoCD, Flux 등의 Kubernetes 기반 배포 자동화 도구와 연계
    4. 디버깅 및 트러블슈팅의 핵심 도구
      • 클러스터 내에서 발생하는 오류를 빠르게 식별하고 해결
      • kubectl logs, kubectl describe, kubectl exec을 활용한 실시간 디버깅

2. Kubernetes의 구조와 관리

  • Pods

    • 개념

      • Pod은 Kubernetes에서 배포할 수 있는 가장 작은 단위이자, 클러스터에서 스케줄링되는 기본적인 빌딩 블록
      • 하나의 Pod는 하나 이상의 컨테이너를 포함할 수 있으며, 이 컨테이너들은 저장소, 네트워크, 그리고 운영 체제의 일부 설정을 공유합니다.
      • Pod 내의 컨테이너들은 항상 함께 위치하고, 함께 스케줄되며, 동일한 노드에서 함께 실행됩니다.
    • 구조와 특성

      • 공유 리소스
        • Pod 내의 컨테이너들은 IP 주소와 포트 번호를 공유하며, 로컬로 연결된다는 개념을 사용하여 서로 통신할 수 있습니다. 또한 볼륨을 공유하여 데이터를 교환하고 저장할 수 있습니다.
      • 라이프사이클
        • 일반적으로 Pod는 한 번에 하나의 메인 컨테이너를 실행하는데 사용됩니다. Pod의 컨테이너는 함께 생성되고, 함께 종료됩니다. 이는 Pod가 한 개의 애플리케이션 인스턴스를 구성하는 것으로 취급되어야 함을 의미합니다.
      • 임시성 (Ephemeral nature)
        • Pod는 일시적입니다. 즉, Pod는 불변이 아니며, 주로 재시작할 때는 새 IP 주소를 받게 됩니다. 이러한 특성 때문에, Pod는 스토리지와 같은 지속적인 리소스와 결합하여 사용되는 경우가 많습니다.
    • 생명주기

      kubectl describe pods {POD_NAME}
      • Pending
      • Running : 파드내에 하나의 컨테이너라도 실행된 상태
      • Succeeded : 모든 컨테이너가 성공적으로 실행마치고 종료
      • Failed : 실패하여 종료
      • CrashLoopBackOff : 컨테이너가 반복적으로 시작되었다가 실패하는 상태
      • Unknown : 파드의 상태를 알 수 없는 상태
  • Deployments

    • 개념

      • Deployment는 Kubernetes에서 애플리케이션의 선언적 업데이트를 제공하는 API 객체입니다.
      • Deployment를 사용하면 상태를 안정적으로 유지하면서 애플리케이션 또는 서비스의 원하는 상태를 설명하고, Kubernetes가 목표 상태를 현재 상태에 맞추도록 할 수 있습니다.
      • Deployment는 주로 상태가 없는 (stateless) 애플리케이션을 관리하는데 적합합니다.
    • 구조와 특성

      • 롤아웃과 롤백
        • Deployment는 애플리케이션을 배포할 때 선언적 업데이트를 사용합니다.
          • 예를 들어, 새 버전의 컨테이너 이미지로 업데이트를 진행할 때 롤아웃을 자동으로 진행하며, 문제가 발생하면 이전 버전으로 롤백할 수 있습니다.
      • 스케일링
        • Deployment를 통해 애플리케이션의 인스턴스 수를 쉽게 늘리거나 줄일 수 있습니다. 이는 리플리카셋(ReplicaSet)을 자동으로 업데이트하여 관리합니다.
      • 자동 복구
        • Deployment는 노드 오류나 기타 이유로 인해 실패한 Pod를 자동으로 대체합니다. 이는 애플리케이션의 가용성을 보장합니다.
      • 버전 관리와 추적
        • Deployment는 애플리케이션의 버전을 추적하고, 언제든지 이전 상태로 돌아갈 수 있는 옵션을 제공하여, CI/CD 파이프라인과 통합하기에 적합합니다.
    • deployment 명령어

      # 디플로이먼트 조회
      kubectl get deployment
         or
      kubectl get deploy
      
      #NAME : 클러스터에 배포한 디플로이먼트 이름
      #READY : 사용자가 최종 배포한 pod 개수와 디플로이먼트를 이용해 
              현재 클러스터에 실제로 동작시킨 pod 개수를 1/1 형태로 표시합니다.
      #UP-TO-DATE : 디플로이먼트 설정에 정의한 대로 동작 중인 신규 pod 개수입니다.
      # AVAILABLE : 서비스 가등한 pod 수,pod를 실행한 후 설정된 헬스 체크로 
                     서비스 가능한 상태라고 판단하면 AVAILABLE 항목의 pod 개수에 포함
      # AGE : 디플로이먼트 생성한 후 지난 시간 표시
      $ kubectl get deployment
      NAME         READY   UP-TO-DATE   AVAILABLE   AGE
      nginx-apop   1/1     1            1           31m
      nginx-app    1/1     1            1           20s
      
      # 디플로이먼트 삭제
      kubectl delete deployment {DEPLOYMENT_NAME}
              or
      kubectl delete deploy nginx-app

      3. Pod 및 Deployment 실습

  • Namespace 설정

    kubectl create namespace k8s-practice
  • Pod 관리

    • nginx-pod.yaml

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx-pod
        namespace: k8s-practice
      spec:
        containers:
        - name: nginx
          image: nginx:latest
          ports:
          - containerPort: 80
    • 실행

      # 실행
      kubectl apply -f nginx-pod.yaml
      
      # 해당 네임스페이스 파드 조회 및 상세정보
      kubectl get pods -n k8s-practice
      kubectl describe pod nginx-pod -n k8s-practice
      # 해당 네임스페이스의 파드 로그 조회
      kubectl logs nginx-pod -n k8s-practice
      # Pod 내부 접속
      kubectl exec -it nginx-pod -n k8s-practice -- /bin/bash
      # Pod 삭제
      kubectl delete pod nginx-pod -n k8s-practice
  • Deployment 생성 및 스케일링

    • nginx-deployment.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: k8s-practice
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:latest
              ports:
              - containerPort: 80
    • 실행

      #실행
      kubectl apply -f nginx-deployment.yaml
      
      #Deployment 상태확인
      kubectl get deployments -n k8s-practice
      kubectl describe deployment nginx-deployment -n k8s-practice
      
      # Replica 수 조정
      kubectl scale deployment nginx-deployment --replicas=4 -n k8s-practice
      
      # 이미지 업데이트 
      kubectl set image deployment/nginx-deployment nginx=nginx:1.19.0 -n k8s-practice
      
      # 업데이트 상태 확인
      kubectl rollout status deployment/nginx-deployment  -n k8s-practice
      
      # 롤백 
      kubectl rollout undo deployment nginx-deployment -n k8s-practice
      
      #삭제
      kubectl delete deployment nginx-deployment -n k8s-practice
      

4. 부록 k8s 용어집

1. Pod (파드)

  • 파드는 Kubernetes에서 스케줄링 가능한 가장 작은 단위입니다. 하나 이상의 컨테이너를 포함할 수 있으며, 이 컨테이너들은 스토리지, 네트워크를 공유하고, 어떻게 실행될지에 대한 방식을 지정합니다.
  • 2*. Node (노드)
  • 노드는 파드가 배포되는 물리적 또는 가상의 기계입니다. 각 노드는 마스터에 의해 관리되며, 파드의 운영을 지원하기 위한 리소스(스케줄링, 실행, 모니터링 등)를 제공합니다.
  • 3.* Service (서비스)
  • 서비스는 일련의 동적 파드에 대한 지속적인 접근을 제공하는 추상적인 개념으로, 로드 밸런싱, 서비스 디스커버리, 고정 IP 주소를 포함합니다.
  • 4.* Deployment (디플로이먼트)
  • 디플로이먼트는 파드와 레플리카셋의 선언적 업데이트를 관리합니다. 이를 통해 사용자는 애플리케이션을 롤아웃, 업데이트 및 롤백할 수 있습니다.
  • 5.* ReplicaSet (레플리카셋)
  • 레플리카셋은 한 개 이상의 파드 복사본을 유지하도록 보장합니다. 이는 파드의 가용성을 유지하는 데 중요합니다.
  • 6*. ConfigMap (컨피그맵)
  • 컨피그맵은 구성 데이터를 키-값 쌍으로 저장하여 애플리케이션 코드의 구성 정보를 파드에서 분리할 수 있게 해줍니다. 이를 통해 애플리케이션을 재배포하지 않고도 설정을 변경할 수 있습니다.
  • 7.* Secret (시크릿)
  • 시크릿은 비밀번호, OAuth 토큰, SSH 키와 같은 민감한 정보를 저장하는데 사용됩니다. 이 정보들은 시크릿을 사용하여 안전하게 파드에 주입될 수 있습니다.
  • 8* Volume (볼륨)
  • 볼륨은 파드가 존재하는 동안 데이터를 유지할 수 있는 디렉토리입니다. 다양한 유형의 볼륨이 지원되며, 파드 내의 컨테이너 간, 또는 파드의 인스턴스 간에 데이터를 공유할 때 사용됩니다.
728x90
반응형
LIST