기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
IP Virtual Server(IPVS) 모드의 EKS는 레거시 iptables 모드에서 실행되는 kube-proxy가 있는 1,000개 이상의 서비스를 사용하여 대규모 클러스터를 실행할 때 자주 발생하는 네트워크 지연 시간 문제를kube-proxy
를 구성할 수 있습니다.
개요
Kubernetes 버전 1.11
IPVS는 트래픽을 백엔드 포드에 분산하기 위한 몇 가지 옵션을 제공합니다. 각 옵션에 대한 자세한 내용은 공식 Kubernetes 설명서
- rr (Round Robin) - wrr (Weighted Round Robin) - lc (Least Connections) - wlc (Weighted Least Connections) - lblc (Locality Based Least Connections) - lblcr (Locality Based Least Connections with Replication) - sh (Source Hashing) - dh (Destination Hashing) - sed (Shortest Expected Delay) - nq (Never Queue)
구현
EKS 클러스터에서 IPVS를 활성화하려면 몇 단계만 필요합니다. 먼저 EKS 작업자 노드 이미지에 Linux 가상 서버 관리 ipvsadm
패키지가 설치되어 있는지 확인해야 합니다. Amazon Linux 2023과 같은 Fedora 기반 이미지에이 패키지를 설치하려면 작업자 노드 인스턴스에서 다음 명령을 실행할 수 있습니다.
sudo dnf install -y ipvsadm
Ubuntu와 같은 Debian 기반 이미지에서 설치 명령은 다음과 같습니다.
sudo apt-get install ipvsadm
그런 다음 위에 나열된 IPVS 구성 옵션에 대한 커널 모듈을 로드해야 합니다. 이러한 모듈은 재부팅 후에도 유지되도록 /etc/modules-load.d/
디렉터리 내부의 파일에 쓰는 것이 좋습니다.
sudo sh -c 'cat << EOF > /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_wlc
ip_vs_lblc
ip_vs_lblcr
ip_vs_sh
ip_vs_dh
ip_vs_sed
ip_vs_nq
nf_conntrack
EOF'
다음 명령을 실행하여 이미 실행 중인 시스템에 이러한 모듈을 로드할 수 있습니다.
sudo modprobe ip_vs sudo modprobe ip_vs_rr sudo modprobe ip_vs_wrr sudo modprobe ip_vs_lc sudo modprobe ip_vs_wlc sudo modprobe ip_vs_lblc sudo modprobe ip_vs_lblcr sudo modprobe ip_vs_sh sudo modprobe ip_vs_dh sudo modprobe ip_vs_sed sudo modprobe ip_vs_nq sudo modprobe nf_conntrack
참고
사용자 데이터 스크립트를 통해 또는 사용자 지정 작업자 노드 AMI를 빌드하기 위해 실행된 빌드 스크립트에서 작업자 노드의 부트스트래핑 프로세스의 일부로 이러한 작업자 노드 단계를 실행하는 것이 좋습니다.
다음으로 IPVS 모드에서 실행되도록 클러스터의 kube-proxy
DaemonSet를 구성합니다. 이는를 kube-proxy
mode
로 ipvs
설정하고 ipvs scheduler
를 위에 나열된 로드 밸런싱 옵션 중 하나로 설정하여 수행됩니다. 예를 들어, 라운드 로빈rr
의 경우 입니다.
주의
이는 방해가 되는 변경이며 업무 외 시간에 수행해야 합니다. 영향을 최소화하려면 초기 EKS 클러스터 생성 중에 이러한 변경을 수행하는 것이 좋습니다.
kube-proxy
EKS 추가 기능을 업데이트하여 AWS CLI 명령을 실행하여 IPVS를 활성화할 수 있습니다.
aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \
--configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
--resolve-conflicts OVERWRITE
또는 클러스터에서 kube-proxy-config
ConfigMap을 수정하여이 작업을 수행할 수 있습니다.
kubectl -n kube-system edit cm kube-proxy-config
아래에서 scheduler
설정을 찾아 값을 위에 나열된 ipvs 로드 밸런싱 옵션 중 하나로 ipvs
설정합니다. 예를 들어, rr
for Round Robin. 기본값이 인 mode
설정을 찾아 값을 로 iptables
변경합니다ipvs
. 두 옵션의 결과는 아래 구성과 비슷해야 합니다.
iptables:
masqueradeAll: false
masqueradeBit: 14
minSyncPeriod: 0s
syncPeriod: 30s
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: "rr"
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 0.0.0.0:10249
mode: "ipvs"
nodePortAddresses: null
oomScoreAdj: -998
portRange: ""
udpIdleTimeout: 250ms
이러한 변경을 수행하기 전에 작업자 노드가 클러스터에 조인된 경우 kube-proxy DaemonSet를 다시 시작해야 합니다.
kubectl -n kube-system rollout restart ds kube-proxy
검증
작업자 노드 중 하나에서 다음 명령을 실행하여 클러스터 및 작업자 노드가 IPVS 모드에서 실행 중인지 확인할 수 있습니다.
sudo ipvsadm -L
최소한 아래 결과와 비슷한 결과가 표시되어야 하며,의 Kubernetes API Server 서비스 10.100.0.1
및의 CoreDNS 서비스에 대한 항목이 표시됩니다10.100.0.10
.
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP ip-10-100-0-1.us-east-1. rr -> ip-192-168-113-81.us-eas Masq 1 0 0 -> ip-192-168-162-166.us-ea Masq 1 1 0 TCP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0 UDP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0
참고
이 예제 출력은 서비스 IP 주소 범위가 인 EKS 클러스터에서 가져옵니다10.100.0.0/16
.