
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"