kube-proxy의 ipvs 모드 해독

12368 단어 ipvsadmk8skubernetes

IPVS


이 글은 주로 다음과 같습니다.
  • IPVS란 무엇입니까?
  • IPVS 및 IPTABLES 차이점
  • kube-proxy를 어떻게 설정하여 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는 대규모 클러스터에 보다 뛰어난 확장성과 성능을 제공합니다.
  • IPVS는 iptables보다 복잡한 부하 균형 알고리즘(최소 부하, 최소 연결, 위치, 가중치 등)을 지원한다.
  • IPVS는 서버 상태 점검 및 접속 재시도 등을 지원합니다.

  • 언제 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 모드로 시작할 수 없습니까

  • Enable IPVS feature gateway

  • Kubernetes v1.10 이상 버전의 경우 기능 문 SupportIPVSProxyMode는 기본적으로true로 설정됩니다.단, v1.10 이전에 Kubernetes에 --feature-gates = SupportIPVSProxyMode =true를 명확하게 설정해야 합니다.
  • proxy-mode=ipvs
  • 지정
    kube-proxy 모드가 ipvs로 설정되었는지 확인하기
  • 설치에 필요한 코어 모듈 및 패키지
  • ipvs에 필요한 핵 모듈을 핵과 소프트웨어 패키지로 컴파일했는지 확인하십시오.(전제조건 참조)

    좋은 웹페이지 즐겨찾기