Cilium
准备都要把Istio
干翻了,还是值得研究下。那么根据官方文档来踩下坑,记录下,方便下次折腾。
注意: 由于Cilium
的eBPF
功能在较高内核中才有,建议使用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预计的后端来定义
比如预计某个服务最大Pod
是120
,则size
就是Pod * 100 = 12000
,再取一个质数。当前支持的质数有
251 502 1021 2039 4093 8191 16381 32749 65521 131071
, 则取16381
-
DSR
类似LVS
的DR
模式,后端直接响应客户端,减少SNAT
的转换,但不能工作在Tunnel
模式下,需要Native-Routing
模式。如果集群所有主机都在一个LAN
下,肯定支持。