Cilium准备都要把Istio干翻了,还是值得研究下。那么根据官方文档来踩下坑,记录下,方便下次折腾。

注意: 由于CiliumeBPF功能在较高内核中才有,建议使用Ubuntu LTS版本,Ubuntu内核版本较CentOS一般都要新。况且CentOS8以后都不维护了,建议早换Ubuntu。测试使用的是Ubuntu 20.04 LTS

kubeadm安装Cilium替换掉kube-proxy

kubeadm初始化集群

1
2
3
4
5
6
7
8
9
# 用于单Master测试用的
kubeadm init  --skip-phases=addon/kube-proxy \
              --apiserver-advertise-address=128.0.255.31 \ 
              --image-repository=registry.aliyuncs.com/google_containers \
              --kubernetes-version=v1.21.3 \
              --service-cidr=10.96.0.0/12 \
              --v=5
            
# 主要参数就是-skip-phases=addon/kube-proxy

详情可以参考之前的文章

安装Helm

因为官方只给了Helm包,所以需要安装Helm,Ubuntu可以直接安装

1
2
3
4
5
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

安装Cilium

因为没有安装kube-proxy,所以默认的内部的svc地址是不可达的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 使用DR模式以及maglev一致性哈希,启用HubbleUI
helm repo add cilium https://helm.cilium.io/
SEED=$(head -c12 /dev/urandom | base64 -w0)
helm install cilium cilium/cilium --version 1.11.0 \
                                  --namespace kube-system \
                                  --set kubeProxyReplacement=strict \
                                  --set loadBalancer.algorithm=maglev \
                                  --set maglev.tableSize=16381 \
                                  --set maglev.hashSeed=${SEED} \
                                  --set tunnel=disabled \
                                  --set autoDirectNodeRoutes=true \
                                  --set loadBalancer.mode=dsr \
                                  --set k8sServiceHost=128.0.255.31 \
                                  --set hubble.relay.enabled=true \
                                  --set hubble.ui.enabled=true \
                                  --set k8sServicePort=6443

以上步骤执行完,还有一个坑要填下

1
2
3
4
kubectl edit cm/cilium-config -n kube-system

# 增加一行,指定内部主机网络的CIDR
ipv4-native-routing-cidr: 128.0.255.0/24

验证

1
2
3
4
5
6
7
kubectl get pods -n kube-system -o wide

# Ping检测下Pod IP是不是通的先
ping PodIP

# 显示Cilium详细信息
kubectl exec -it -n kube-system cilium-fmh8d -- cilium status --verbose

暴露Hubble服务

1
2
3
kubectl edit svc/hubble-ui -n kube-system
# type 修改为NodePort
kubectl get svc -n kube-system

高级特性

  • Maglev一致性哈希算法

    启用需要更多内存

    以下是引用原文此算法的好处

    This improves resiliency in case of failures as well as better load balancing properties since nodes added to the cluster will make the same

    aglev.tableSize为质数,单们是M。这是算法决定的。它的值根据你的deployment预计的后端来定义 比如预计某个服务最大Pod120,则size就是Pod * 100 = 12000,再取一个质数。当前支持的质数有 251 502 1021 2039 4093 8191 16381 32749 65521 131071, 则取16381

  • DSR

    类似LVSDR模式,后端直接响应客户端,减少SNAT的转换,但不能工作在Tunnel模式下,需要Native-Routing模式。如果集群所有主机都在一个LAN下,肯定支持。