kube-router之負載均衡器

Kube-router是基于Kubernetes網絡設計的一個集負載均衡器、防火墻和容器網絡的綜合方案。

主要功能

1. 基于IPVS/LVS的負載均衡器 | --run-service-proxy

kube-router采用Linux內核的IPVS模塊為K8s提供Service的代理。

更多的詳情可以參考:

2. 容器網絡 | --run-router

kube-router利用BGP協議和Go的GoBGP庫和為容器網絡提供直連的方案。因為用了原生的Kubernetes API去構建容器網絡,意味著在使用kube-router時,不需要在你的集群里面引入其他依賴。

同樣的,kube-router在引入容器CNI時也沒有其它的依賴,官方的“bridge”插件就能滿足kube-rouetr的需求。

更多關于BGP協議在Kubernetes中的使用可以參考:

3. 網絡策略管理 | --run-firewall

采用了kube-router的Kubernetes很容易通過添加標簽到kube-router的方式使用網路策略功能。kube-router使用了ipset操作iptables,以保證防火墻的規(guī)則對系統(tǒng)性能有較低的影響。

Kube-router支持networking.k8s.io/NetworkPolicy的API或者其他基于網絡策略的V1/GA語義。

更多關于kube-router防火墻的功能可以參考:

負載均衡器

kube-router的負載均衡器功能,會在物理機上創(chuàng)建一個虛擬的kube-dummy-if網卡,然后利用k8s的watch APi實時更新svc和ep的信息。svc的cluster_ip會綁定在kube-dummy-if網卡上,作為lvs的virtual server的地址。realserver的ip則通過ep獲取到容器的IP地址。

一個單純的負載均衡器部署如下:

kubw-router.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-router-cfg
  namespace: kube-system
  labels:
    tier: node
    k8s-app: kube-router
data:
  cni-conf.json: |
    {
      "name":"kubernetes",
      "type":"bridge",
      "bridge":"kube-bridge",
      "isDefaultGateway":true,
      "ipam": {
        "type":"host-local"
      }
    }
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: kube-router
  namespace: kube-system
  labels:
    k8s-app: kube-router
spec:
  template:
    metadata:
      labels:
        k8s-app: kube-router
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      containers:
      - name: kube-router
        image: cloudnativelabs/kube-router
        args: ["--run-router=false", "--run-firewall=false", "--run-service-proxy=true", "--kubeconfig=/var/lib/kube-router/kubeconfig", "--masquerade-all", "--ipvs-sync-period=5s", "--iptables-sync-period=10s"]
        securityContext:
          privileged: true
        imagePullPolicy: Always
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        volumeMounts:
        - name: lib-modules
          mountPath: /lib/modules
          readOnly: true
        - name: cni-conf-dir
          mountPath: /etc/kubernetes/cni/net.d
        - name: kubeconfig
          mountPath: /var/lib/kube-router/kubeconfig
          readOnly: true
        - name: cert
          mountPath: /etc/kubernetes/ssl
      initContainers:
      - name: install-cni
        image: busybox
        imagePullPolicy: Always
        command:
        - /bin/sh
        - -c
        - set -e -x;
          if [ ! -f /etc/kubernetes/cni/net.d/10-kuberouter.conf ]; then
            TMP=/etc/kubernetes/cni/net.d/.tmp-kuberouter-cfg;
            cp /etc/kube-router/cni-conf.json ${TMP};
            mv ${TMP} /etc/kubernetes/cni/net.d/10-kuberouter.conf;
          fi
        volumeMounts:
        - name: cni-conf-dir
          mountPath: /etc/kubernetes/cni/net.d
        - name: kube-router-cfg
          mountPath: /etc/kube-router
      hostNetwork: true
      nodeSelector:
        kube: router
      volumes:
      - name: lib-modules
        hostPath:
          path: /lib/modules
      - name: cni-conf-dir
        hostPath:
          path: /etc/kubernetes/cni/net.d
      - name: kube-router-cfg
        configMap:
          name: kube-router-cfg
      - name: kubeconfig
        hostPath:
          path: /var/lib/kube-router/kubeconfig
      - name: cert
        hostPath:
          path: /etc/kubernetes/ssl

調整負載均衡的策略支持以下4種方式:

  • 最少連接數
kubectl annotate service my-service "kube-router.io/service.scheduler=lc"
  • 輪詢
kubectl annotate service my-service "kube-router.io/service.scheduler=rr"
  • 源地址哈希
kubectl annotate service my-service "kube-router.io/service.scheduler=sh"
  • 目的地址哈希
kubectl annotate service my-service "kube-router.io/service.scheduler=dh"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容