Development/Infrastructure

Kubernetes 1.31 업데이트: 알아둬야 할 주요 변화!

Danny Seo 2024. 8. 19. 17:16

목차

    반응형

    쿠버네티스 1.31 업데이트

     

    Kubernetes는 트래픽 분배, 리소스 관리, 보안을 크게 향상시키기 위한 다양한 혁신적인 기능을 도입했습니다.

    이번 업데이트로 사용자들은 더욱 안정적이고 효율적인 Kubernetes 환경을 경험할 수 있습니다.

    주요 기능

    보안 강화

    • AppArmor 지원: Pod와 컨테이너에 보안 프로필을 적용해 앱을 잠재적인 취약점으로부터 보호할 수 있습니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app-image
        securityContext:
          apparmorProfile: "restricted"  # 또는 커스텀 프로필 이름
    • PodDisruptionBudget (PDB) 및 비정상적인 Pod 제거 정책: 리소스가 부족한 상황에서도 안정적인 Pod가 제거되지 않도록 해 시스템의 혼란을 최소화합니다.
    apiVersion: policy/v1beta1
    kind: PodDisruptionBudget
    metadata:
      name: my-pdb
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          app: my-app
      unhealthyPodEvictionPolicy: "Condition"  # 1.31에서 추가됨

     

    리소스 관리

    Pod 레벨 리소스 제한: 특정 Pod에 대해 리소스 사용 한도를 설정하여 리소스 분배를 더욱 정밀하게 제어할 수 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: my-image
        resources:
          limits:
            cpu: "2"
            memory: "2Gi"
      limits:
        cpu: "4"
        memory: "4Gi"

    위 예시에서는 my-container에 대한 리소스 제한이 컨테이너 레벨에서 정의되어 있으며, Pod 전체에도 추가적인 리소스 제한이 있습니다. Pod의 총 리소스 사용량은 각 컨테이너의 사용량에 관계없이 지정된 한도를 초과할 수 없습니다.

    트래픽 관리

    다중 서비스 CIDR: 더 넓은 IP 주소 범위에서 로드 밸런싱을 가능하게 하기 위해 여러 CIDR 블록을 서비스에 할당할 수 있습니다. 새로운 서비스 필드를 사용해 여러 백엔드 간의 트래픽 분배를 설정하거나 고급 라우팅 전략을 구현할 수 있습니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      clusterIP: None  # 로드 밸런서 모드
      loadBalancerIP: 10.0.0.1  # 선택적 고정 IP
      serviceCidrBlock: "10.10.0.0/16,10.20.0.0/16"  # 1.31에서 추가됨

     

    Service 트래픽 분배 필드

    Kubernetes 1.31에서 Service API 객체의 trafficDistribution 필드가 베타 버전으로 업그레이드되었습니다. 이 필드를 통해 각 서비스 엔드포인트에 할당될 트래픽 비율을 설정할 수 있습니다. 캐나리 배포나 블루-그린 배포와 같은 전략을 사용할 때 유용합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      trafficPolicy: Local
      trafficDistribution:
        # 라벨 "version: v1"을 가진 엔드포인트에 80%의 트래픽을 라우팅
        - metadata:
            labels:
              version: v1
          weight: 80
        # 라벨 "version: v2"을 가진 엔드포인트에 20%의 트래픽을 라우팅
        - metadata:  
            labels:
              version: v2
          weight: 20

     

    VolumeRestriction 플러그인 스케줄링 힌트

    VolumeRestriction 플러그인을 사용하여 Pod에서 사용할 수 있는 볼륨 유형을 제한할 수 있습니다. Kubernetes 1.31에서는 스케줄링 힌트를 설정할 수 있는 기능이 추가되어, Pod가 필요한 볼륨 유형이 있는 노드에 배치되도록 스케줄러가 노력합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      schedulerName: default-scheduler
      volumeSchedulingHints:
      - type: PersistentVolumeClaim

     

    랜덤화된 Pod 선택 알고리즘

    이전 버전의 Kubernetes에서는 ReplicaSets가 다운스케일링 시 제거할 Pod를 선택하는 데 결정론적 방법을 사용했습니다. 이로 인해 특정 노드에서 불균형적인 Pod 분포 문제가 발생할 수 있었습니다. Kubernetes 1.31에서는 Pod 선택 과정에 랜덤 요소를 추가하여 이러한 문제를 해결하고 전체 클러스터의 자원 사용 효율을 높였습니다.

    import random
    def random_pod_selection(pods):
      """리스트에서 종료할 Pod를 무작위로 선택합니다.
      Args:
        pods: Pod 객체의 리스트
      Returns:
        선택된 Pod
      """
      if not pods:
        return None
      return random.choice(pods)

     

    영구 볼륨 재활용 정책

    PVC가 삭제된 후 PV의 처리 방식을 결정하는 재활용 정책이 Kubernetes 1.31에서 개선되었습니다. 지원되는 재활용 정책은 다음과 같습니다:

    • 유지: PVC가 삭제된 후에도 PV가 유지됩니다.
    • 재활용: PV는 다시 사용되기 전에 정리되고 재활용됩니다.
    • 삭제: PVC 삭제 후 PV도 삭제됩니다.

    Kubernetes 1.31에서는 다음과 같은 기능이 추가되었습니다:

    • 파이널라이저: 파이널라이저를 PV에 추가하여 특정 조건이 충족될 때까지 삭제를 방지합니다.
    • 재활용 정책 검증: 오류를 방지하기 위해 재활용 정책에 대한 검증이 강화되었습니다.
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      nfs:
        path: /export/path
        server: 192.168.1.10
    • 영구 볼륨의 마지막 상태 전환 시간: 디버깅 및 라이프사이클 관리를 돕기 위해 영구 볼륨이 마지막 상태에서 머문 시간을 추적합니다.
    • 재시도 가능 및 불가능한 Pod 실패를 구분하는 작업: 작업에서 복구 가능한 Pod 실패와 재시도 불가능한 Pod 실패를 구분하여 보다 스마트한 작업 관리를 지원합니다.
    • 탄력적인 인덱스 작업: 탄력적인 인덱스 작업을 통해 외부 인덱스에 따라 작업을 동적으로 확장하거나 축소할 수 있습니다.
    • 향상된 Ingress 연결성: Kube-Proxy를 통해 Ingress 연결성의 신뢰성을 높입니다.
    • 종료될 수 있는 Pod 배포 고려: 배포에 새로운 어노테이션이 추가되어 스케일에 따라 Pod가 종료될 가능성을 표시할 수 있습니다.
    • 선언적인 노드 유지 관리: 노드 객체를 사용해 계획된 노드 유지 관리를 선언적으로 관리해 프로세스를 단순화할 수 있습니다.

    폐기 예정 기능

    KubeProxy 요구 사항

    Kubernetes 1.31부터 kube-proxy가 작동하려면 커널 5.13 이상 및 nft 버전 1.0.1 이상이 필요합니다. kube-proxy는 네트워크 트래픽 관리를 위해 nft 명령어를 사용해 Netfilter를 설정합니다. 커널 5.13에서 추가된 몇 가지 새로운 기능이 필요하므로 해당 커널이 필수적입니다. Kubernetes 1.31을 설치하기 전에 커널 또는 kube-proxy의 지원 버전으로 업데이트해야 합니다.

    # nft 명령어 도구 업데이트
    apt-get update && apt-get install nft -y
    
    # 커널 업데이트
    uname -r # 현재 커널 버전 확인
    # 최신 커널 이미지 다운로드 및 설치
    wget https://cdn.kernel.org/v5.13/linux-5.13.19.tar.xz
    tar -xvf linux-5.13.19.tar.xz
    cd linux-5.13.19
    make install
    # 새로운 커널로 부팅하기 위해 grub 업데이트
    update-grub

     

    버전 필드: Kubernetes v1.31에서 .status.nodeInfo.kubeProxyVersion 필드가 사용 중단되었습니다. 이 필드의 값이 정확하지 않으며, 이후 버전에서 제거될 예정입니다. v1.31부터는 kubelet이 관련 노드의 status.kubeProxyVersion 필드를 설정하려고 시도하지 않으며, DisableNodeKubeProxyVersion 기능 게이트가 기본적으로 활성화됩니다.

    내장형 클라우드 제공자 코드 제거

    Kubernetes 1.31에서 가장 큰 변화 중 하나는 내장형 클라우드 제공자 코드의 제거였습니다. 이 변경의 목적은 외부 클라우드 제공자의 성장을 촉진하고 Kubernetes를 공급 업체 중립적으로 만드는 것입니다.

    apiVersion: cloudprovider.k8s.io/v1beta1
    kind: CloudConfig
    metadata:
      name: config
    spec:
      controllerManagerConfig:
        aws:
          region: us-west-2
    • 사용 중단된 API를 식별합니다.
    • Kubernetes 문서에서 권장하는 대체 API를 찾습니다.
    • 대체 API를 사용하도록 코드를 업데이트합니다.
    • 변경 사항을 철저히 테스트합니다.

    더 자세한 내용은 Kubernetes 사용 중단 가이드를 참조하세요.

    결론

    이 블로그 글은 Kubernetes 1.31의 변경 로그를 탐색하는 출발점으로만 사용해야 합니다. 이번 릴리스의 모든 변경 사항에 대해 더 알고 싶다면 전체 변경 로그를 읽어보는 것을 강력히 추천합니다. 더 많은 정보를 얻고자 한다면 다음 링크를 방문해 보세요:

    Kubernetes 1.31 Changelog

     

    kubernetes/CHANGELOG/CHANGELOG-1.31.md at master · kubernetes/kubernetes

    Production-Grade Container Scheduling and Management - kubernetes/kubernetes

    github.com

     

    Kubernetes Deprecation Policy

     

    Kubernetes Deprecation Policy

    This document details the deprecation policy for various facets of the system. Kubernetes is a large system with many components and many contributors. As with any such software, the feature set naturally evolves over time, and sometimes a feature may need

    kubernetes.io

     

    읽어주셔서 감사합니다! 😊
    개발 관련 궁금증이나 고민이 있으신가요?
    아래 링크를 통해 저에게 바로 문의해 주세요! 쉽고 빠르게 도움 드리겠습니다.

    '개발자서동우' 프로필 보기

    반응형

    'Development > Infrastructure' 카테고리의 다른 글

    [Redis] Node.js를 사용한 Redis 캐시 구현  (0) 2023.05.26