Cilium / Kubernetes / 云原生

Cilium介绍并替代kube-proxy教程

浅时光博客 · 12月19日 · 2022年 · 本文5290个字,预计阅读14分钟 6496次已读

一、Cilium介绍


Cilium 是一款开源软件,也是 CNCF 的孵化项目。Cilium 为基于 Kubernetes 的 Linux 容器管理平台上部署的服务,透明地提供服务间的网络和 API 连接及安全。

Cilium 的基础是一种名为 eBPF 的新 Linux 内核技术,它支持在 Linux 本身内动态插入强大的安全可见性和控制逻辑。由于 eBPF 在 Linux 内核中运行,因此可以应用和更新 Cilium 安全策略,而无需对应用程序代码或容器配置进行任何更改。

组件概况

Cilium的部署包括以下组件,运行在容器集群中的每个Linux容器节点上:

  • Cilium Agent (Daemon): 用户空间守护程序,通过插件与容器运行时和编排系统(如Kubernetes)交互,以便为在本地服务器上运行的容器设置网络和安全性。提供用于配置网络安全策略,提取网络可见性数据等的API。
  • Cilium CLI Client: 用于与本地Cilium Agent通信的简单CLI客户端,例如,用于配置网络安全性或可见性策略。
  • Linux Kernel BPF: 集成Linux内核的功能,用于接受内核中在各种钩子/跟踪点运行的已编译字节码。Cilium编译BPF程序,并让内核在网络堆栈的关键点运行它们,以便可以查看和控制进出所有容器中的所有网络流量。
  • 容器平台网络插件: 每个容器平台(例如,Docker,Kubernetes)都有自己的插件模型,用于外部网络平台集成。对于Docker,每个Linux节点都运行一个进程(cilium-docker)来处理每个Docker libnetwork调用,并将数据/请求传递给主要的Cilium Agent。

二、Hubble简介


1、什么是Hubble

Cilium 在 1.7 版本后推出并开源了 Hubble,Hubble 是一个完全分布式的网络和安全可观察性平台。它建立在 Cilium 和 eBPF 之上,能够以完全透明的方式深入了解服务的通信和行为以及网络基础设施。

通过在 Cilium 之上构建,Hubble 可以利用 eBPF 来提高可见性。通过依赖 eBPF,所有可见性都是可编程的,并允许采用动态方法来最大限度地减少开销,同时根据用户的要求提供深入和详细的可见性。哈勃望远镜的创建和专门设计是为了充分利用这些新的 eBPF 功能。

2、Hubbel的特性

服务依赖和通信图

  • 哪些服务相互通信?多频繁?服务依赖图是什么样的?
  • 正在进行什么 HTTP 调用?服务从哪些 Kafka 主题消费或生产到哪些主题?

网络监控和警报

  • 是否有任何网络通信失败?为什么通讯失败?是DNS吗?是应用文章来源(Source):浅时光博客程序问题还是网络问题?第 4 层 (TCP) 或第 7文章来源(Source):浅时光博客 层 (HTTP) 上的通信是否中断?
  • 哪些服务在过去 5 分钟内遇到了 DNS 解析问题?哪些服务最近遇到了 TCP 连接中断或连接超时?未响应的 TCP SYN 请求的比率是多少?

应用监控

  • 特定服务或所有集群的 5xx 或 4xx HTTP 响应代码的比率是多少?
  • 我的集群中 HTTP 请求和响应之间的第 95 个和第 99 个百分位延迟是多少?哪些服务表现最差?两个服务之间的延迟是多少?

安全可观察性

  • 由于网络策略,哪些服务的连接被阻止?从集群外部访问了哪些服务?哪些服务解析了特定的 DNS 名称?

三、host-routing


Cilium 文章来源(Source):https://www.dqzboy.com1.9 中引入了基于 eBPF 的​​ ​host-routing​​,来完全绕过 iptables 和上层主机堆栈,与常规 veth 设备操作相比,实现了更快的网络命名空间切换。 如果您的内核支持,此选项会自动启用。

可以看下面这张图,eBPF host-routing 的优化数据路径:

四、Cilium部署


1、部署Cilium环境要求

K8s版本

  • 新的 Kubernetes 版本提供的向后兼容性。
  • 1.16、1.17、1.18、1.19、1.20、1.21、1.22、1.23、1.24、1.25(目前我使用的版本)

内核版本

Cilium 利用和构建内核 eBPF 功能以及与 eBPF 集成的各种子系统。因此,主机系统需要运行 Linux 内核版本 4.9.17 或更高版本才能运行 Cilium 代理。

如果要使用e文章来源(Source):https://www.dqzboy.comBPF Host-Routing,那么确保linux 内核版本Kernel >= 5.10,不然无法启用 eBPF Host-Routing

  • 为了正确启用 eBPF 功能,必须启用以下内核配置选项。
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_CLS_BPF=y
CONFIG_BPF_JIT=y
CONFIG_NET_CLS_ACT=y
CONFIG_NET_SCH_INGRESS=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_BPF=y

# 通过以下命令检查当前使用的内核配置
egrep "^CONFIG_BPF=|^CONFIG_BPF_SYSCALL=|^CONFIG_NET_CLS_BPF=|^CONFIG_BPF_JIT=|^CONFIG_NET_CLS_ACT=|^CONFIG_NET_SCH_INGRESS=|^CONFIG_CRYPTO_SHA1=|^CONFIG_CRYPTO_USER_API_HASH=|^CONFIG_CGROUPS=|^CONFIG_CGROUP_BPF=" /boot/config-<Your kernel version>

systemd cgroup

确认自己系统当前使用的cgroup版本,如果当前使用的系统发行版使用的是Cgroup v2,那么你使用的容器运行时跟kubelet也必须配置使用Cgroup v2版本。相关配置K8s官方文档都有教程步骤,可自行根据自己的系统版本进行替换修改!

# stat -fc %T /sys/fs/cgroup/

对于 cgroup v2,输出为 cgroup2fs
对于 cgroup v1,输出为 tmpfs

Systemd245+版本连接问题

Systemd 245 及更高版本会覆盖Cilium 网络接口的设置。这会引入连接问题(有关详细信息,请参阅GitHub 问题 10645)。为避免这种情况, 请使用以下命令在 systemd 中进行配置:

echo 'net.ipv4.conf.lxc*.rp_filter = 0' > /etc/sysctl.d/99-override_cilium_rp_filter.conf
systemctl restart systemd-sysctl

挂载 eBPF文件系统

一些发行版会自动挂载 bpf 文件系统。通过运行命令检查是否安装了 b文章来源(Source):https://www.dqzboy.compf 文件系统。

~]# mount | grep /sys/fs/bpf
/sys/fs/bpf on /sys/fs/bpf type bpf (rw,relatime)

# 如果没有挂载,请执行下面的命令手动挂载
mount bpffs /sys/fs/bpf -t bpf
echo 'bpffs      /sys/fs/bpf           bpf     defaults 0 0' >> /etc/fstab

2、停用kube-proxy

2.1:停用kube-proxy

注意:停用kube-proxy,现有的服务连接会断开,以及与服务相关的流量,直到 Cilium 部署运行正常之后,服务流量才可恢复正常。所以该操作请确保在不影响业务的情况下执行;或者将该步骤放到Cilium部署完成之后再执行也是可以的。

# 二进制部署的kube-proxy 执行下面的命令
systemctl disable kube-proxy && systemctl stop kube-proxy && systemctl status kube-proxy | grep Active

# kube-proxy以Pod方式运行(kubeadm)安装的方式
kubectl -n kube-system delete ds kube-proxy
kubectl -n kube-system delete cm kube-proxy

2.2:删除iptables规则

  • 删除 kube-proxy在每台节点生成的 iptables 配置
iptables-save | grep -v KUBE | iptables-restore

3、安装部署Cilium CLI

# 下载Cilium CLI工具
[root@k8s-master1 ~]# curl -LO https://ghproxy.com/https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz

# 将可执行文件解压
[root@k8s-master1 ~]# tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin

4、安装部署Cilium

[root@k8s-master1 ~]# helm repo add cilium https://helm.cilium.io/
[root@k8s-master1 ~]# helm search repo cilium
[root@k8s-master1 ~]# helm pull cilium/cilium
[root@k8s-master1 ~]# tar -xf cilium-1.12.3.tgz -C /opt/k8s/work/

# 自定义部署参数
[root@k8s-master1 ~]# cd /opt/k8s/work/cilium/
[root@k8s-master1 cilium]# cp values.yaml{,_bak}
[root@k8s-master1 cilium]# vim values.yaml
k8sServiceHost: xx.xx.xx.xx   # 指定API Server的IP,在禁用kube-proxy的情况下需显式指定
k8sServicePort: 6443            # 指定API Server的端口,在禁用kube-proxy的情况下需显式指定
clusterPoolIPv4PodCIDR: "10.68.0.0/16"    # 与kube-controller-manager配置文件中的--cluster-cidr参数配置保持一致
kubeProxyReplacement: "strict"   #配置kubeProxyReplacement模式,strict表示完全取代kube-proxy

kubeProxyReplacement说明

  • strict完全取代kube-proxy,cilium将负责处理ClusterIPNodePortLoadBalancer类型的service,以及带有externalIPsHostPort的服务。如果内核版本不满足,cilium启动就会报错。
  • partial混合配置。cilium替换和优化部分的kube-proxy功能。该选项要求用户手动指定应该使用哪些组件用于eBPF库-代理替换。需要确保将enableHealthCheckNodeport也设置为false,以便cilium代理不启动NodePort健康检查服务器。
  • disabled默认选项。完全依赖kube-proxy处理外部服务,仅启用ClusterIP类型的集群内负载均衡。
[root@k8s-master1 cilium]# helm install cilium -f values.yaml . --namespace kube-system --set hubble.relay.enabled=true --set hubble.ui.enabled=true
  • 检查Cilium Pod资源创建状态
[root@k8s-master1 cilium]# kubectl get po -n kube-system

5、查看集群状态

[root@k8s-master1 ~]# cilium status --wait

6、确认是否取代kube-proxy

[root@k8s-master1 cilium]# kubectl exec -it -n kube-system ds/cilium -- cilium status | grep KubeProxyReplacement
  • Cilium 取代 kube-proxy 之后,通过 service NodePort 暴露的端口在 node 服务器上用 netstat -lntp 命令查看不到,要通过 cilium 命令查看
[root@k8s-master1 cilium]# kubectl exec -it -n kube-system daemonset/cilium -- cilium service list
  • 测试 NodePort 是否可以连上
[root@k8s-master2 ~]# telnet 192.168.66.62:30081

以上就是本次文章所有知识点,如果文章对你有帮助就动动你那发财的小手,点个赞留个言,给本站加点热度。谢谢支持!


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/12467.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以超链接形式标明文章原始出处和作者信息
免责声明:本站发布的内容(图片、视频和文字)以及一切破解补丁、注册激活和软件解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。访问和下载本站内容,说明您已同意上述条款!


0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!