kube-proxy의 ipvs 모드 해독
12368 단어 ipvsadmk8skubernetes
IPVS
이 글은 주로 다음과 같습니다.
IPVS란 무엇입니까?
IPVS(IP 가상 서버)는 전송층의 부하 균형을 실현하는데 통상적으로 4층 LAN 교환이라고 불리며 리눅스 코어의 일부분이다.
IPVS는 호스트에서 실행되며 실제 서버 클러스터 앞에서 로드 밸런싱을 수행합니다.IPVS는 TCP 및 UDP 기반 서비스에 대한 요청을 실제 서버로 지정하고 실제 서버의 서비스를 단일 IP 주소에 가상 서비스로 표시할 수 있습니다.
IPVS vs. IPTABLES
IPVS 모드는 Kubernetes v1.8에서 도입되었고 v1.9에서 베타에 들어갔다.IPTABLES 모드는 v1.1에 추가되며 v1.2 이후의 기본 작업 모드가 됩니다.IPVS 및 IPTABLES는 모두 netfilter를 기반으로 합니다.IPVS 모드와 IPTABLES 모드의 차이점은 다음과 같습니다.
언제 ipvs가 iptables로 강등됩니까
IPVSproxier는 iptables를 사용하여 패키지 필터, SNAT, NodePort 형식을 지원하는 서비스 등 몇 가지 장면에서 사용할 것입니다.구체적으로 ipvsproxier는 다음 네 장면에서 iptables로 돌아온다.
kube-proxy 시작 항목 설정 – masquerade-all=true
만약kube-proxy가 --masquerade-all =true로 시작하면 ipvsproxier는 서비스 군집 IP에 접근하는 모든 데이터를 위장합니다. 그 행위는 iptablesproxier와 같습니다.만약에 군집 IP 10.244.5.1과 포트 8080의 서비스가 있다면 ipvsproxier가 설치한 iptables는 다음과 같이 해야 한다.
# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */
Chain KUBE-POSTROUTING (1 references)
target prot opt source destination
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
Chain KUBE-MARK-DROP (0 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000
Chain KUBE-MARK-MASQ (6 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- 0.0.0.0/0 10.244.5.1 /* default/foo:http cluster IP */ tcp dpt:8080
kube-proxy 시작 시 클러스터 CIDR 지정
만약kube-proxy가 --cluster-cidr =로 시작하면 ipvsproxier는 서비스 군집 IP에 접근하는 군집 외부 유량을 위장합니다. 그 행위는 iptablesproxier와 같습니다.만약kube-proxy가 집단cidr10.244.16.0/24에 따라 제공된다고 가정하면 서비스 집단 IP는 10.244.5.1이고 포트는 8080이다. ipvsproxier가 설치한 iptables는 다음과 같다.
# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */
Chain KUBE-POSTROUTING (1 references)
target prot opt source destination
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
Chain KUBE-MARK-DROP (0 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000
Chain KUBE-MARK-MASQ (6 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- !10.244.16.0/24 10.244.5.1 /* default/foo:http cluster IP */ tcp dpt:8080
LB 유형 서비스에 Load Balancer Source Ranges 지정
서비스의 Load Balancer Status.ingress.IP가 비어 있지 않고 서비스의LoadBalancerSourceRanges를 지정하면 ipvsproxier는 iptables를 설치합니다. 아래와 같습니다.서비스의 LoadBalancerStatus를 가정합니다.ingress.IP는 10.96.1.2이고 서비스의 LoadBalancerSourceRanges는 10.120.2.0/24입니다.
# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */
Chain KUBE-POSTROUTING (1 references)
target prot opt source destination
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
Chain KUBE-MARK-DROP (0 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x8000
Chain KUBE-MARK-MASQ (6 references)
target prot opt source destination
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK or 0x4000
Chain KUBE-SERVICES (2 references)
target prot opt source destination
ACCEPT tcp -- 10.120.2.0/24 10.96.1.2 /* default/foo:http loadbalancer IP */ tcp dpt:8080
DROP tcp -- 0.0.0.0/0 10.96.1.2 /* default/foo:http loadbalancer IP */ tcp dpt:8080
NodePort type 서비스 지원
NodePort 형식의 서비스를 지원하기 위해 ipvs는 iptablesproxier에서 기존의 실현을 계속합니다.예를 들어,
# kubectl describe svc nginx-service
Name: nginx-service
...
Type: NodePort
IP: 10.101.28.148
Port: http 3080/TCP
NodePort: http 31604/TCP
Endpoints: 172.17.0.2:80
Session Affinity: None
# iptables -t nat -nL
[root@100-106-179-225 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service portals */
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- !172.16.0.0/16 10.101.28.148 /* default/nginx-service:http cluster IP */ tcp dpt:3080
KUBE-SVC-6IM33IEVEEV7U3GP tcp -- 0.0.0.0/0 10.101.28.148 /* default/nginx-service:http cluster IP */ tcp dpt:3080
KUBE-NODEPORTS all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp dpt:31604
KUBE-SVC-6IM33IEVEEV7U3GP tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp dpt:31604
Chain KUBE-SVC-6IM33IEVEEV7U3GP (2 references)
target prot opt source destination
KUBE-SEP-Q3UCPZ54E6Q2R4UT all -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */
Chain KUBE-SEP-Q3UCPZ54E6Q2R4UT (1 references)
target prot opt source destination
KUBE-MARK-MASQ all -- 172.17.0.2 0.0.0.0/0 /* default/nginx-service:http */
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service:http */ tcp to:172.17.0.2:80
ipvs 모드로kube-proxy 실행
전제 조건
IPVS에 코어 모듈 필요
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
grep -e ipvs -e nf_conntrack_ipv4 /lib/modules/$(uname -r)/modules.builtin
만약 내핵으로 번역된다면 다음과 같은 결과를 얻을 수 있다.
kernel/net/ipv4/netfilter/nf_conntrack_ipv4.ko
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_fo.ko
kernel/net/netfilter/ipvs/ip_vs_ovf.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
# load module
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# to check loaded modules, use
lsmod | grep -e ipvs -e nf_conntrack_ipv4
# or
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
IPVS 모드를 사용하기 전에 노드에 IPset 등 패키지를 설치해야 한다.
이러한 요구 사항이 충족되지 않으면 Kube-proxy는 IPTABLES 모드로 반환됩니다.
kubeadm 설치된 그룹
기본적으로 Kube-proxy는kubeadm에 배치된 그룹에서 iptables 모드로 실행됩니다.
kubeadm를 프로필과 함께 사용하면 kubeProxy 필드에서 ipvs 모드를 지정하고 SupportIPVSProxyMode:true를 추가할 수 있습니다.
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
kubeProxy:
config:
featureGates: SupportIPVSProxyMode=true
mode: ipvs
...
Kubernetes v1.8을 사용하는 경우 kubeadm init 명령에 플래그를 추가할 수 있습니다. --feature-gates = SupportIPVSProxyMode =true(v1.9부터 권장하지 않음)
kubeadm init --feature-gates=SupportIPVSProxyMode=true
PS
ipvs 모드를 성공적으로 사용하면 ipvs 프록시 규칙 (ipvsadm 사용) 을 볼 수 있습니다. 예를 들어
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:443 rr persistent 10800
-> 192.168.0.1:6443 Masq 1 1 0
로컬 클러스터가 실행될 때 kube-proxy 로그에 유사한 로그가 나타납니다. 예를 들어 로컬 클러스터의/tmp/kube-proxy.log):
Using ipvs Proxier.
그러나 ipvs 프록시 규칙이 없거나 다음 로그가 있으면 kube-proxy에서 ipvs 모드를 사용할 수 없습니다.
Can't use ipvs proxier, trying iptables proxier
Using iptables Proxier.
디버깅 및 디버깅
ipvs 프록시 규칙 검사
사용자는 ipvsadm 도구를 사용하여 kube-proxy가 IPVS 규칙을 올바르게 유지하는지 확인할 수 있습니다.예를 들어, 클러스터에 다음과 같은 서비스가 있습니다.
# kubectl get svc --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.0.0.1 443/TCP 1d
kube-system kube-dns ClusterIP 10.0.0.10 53/UDP,53/TCP 1d
우리는 다음과 같은 규칙을 볼 수 있을 것이다.
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:443 rr persistent 10800
-> 192.168.0.1:6443 Masq 1 1 0
TCP 10.0.0.10:53 rr
-> 172.17.0.2:53 Masq 1 0 0
UDP 10.0.0.10:53 rr
-> 172.17.0.2:53 Masq 1 0 0
왜 kube-proxy는 ipvs 모드로 시작할 수 없습니까
Kubernetes v1.10 이상 버전의 경우 기능 문 SupportIPVSProxyMode는 기본적으로true로 설정됩니다.단, v1.10 이전에 Kubernetes에 --feature-gates = SupportIPVSProxyMode =true를 명확하게 설정해야 합니다.
kube-proxy 모드가 ipvs로 설정되었는지 확인하기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LVS 설정 Iptables 방화벽 및 고장 해결부하 균형 이라는 단 어 는 모두 가 잘 알 고 있 을 것 이 라 고 믿 습 니 다. 흔히 볼 수 있 는 부하 균형 은 하드웨어 가 있 습 니 다. 예 를 들 어 F5, 인터넷 업 체 H3C, Cisco 는 모두 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.