목차
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/CHANGELOG/CHANGELOG-1.31.md at master · kubernetes/kubernetes
Production-Grade Container Scheduling and Management - kubernetes/kubernetes
github.com
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 |
---|