Cilium使用 (Cilium 3)

简介: Cilium使用 (Cilium 3)

目录

使用k3s测试Cilium,安装步骤可以参见官方文档

Cilium安装使用

docker安装

使用如下命令安装最新版本的docker

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
yum-config-manager \
--add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io

启动docker

service docker start

内核更新

Cilium要求的内核版本比较高,需要对内核进行升级,否则会运行失败。错误日志如minimal supported kernel version is 4.8.0; kernel version that is running is: 3.10.0"

1、导入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2、安装elrepo的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
3、安装内核
在yum的ELRepo源中,有mainline颁布的,可以这样安装:
yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml -y

为了让新安装的内核成为默认启动选项,需要如下修改 GRUB 配置,打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核

# cat /etc/default/grub
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rhgb quiet net.ifnames=0 console=tty0 console=ttyS0,11520                                                  0n8 noibrs"
GRUB_DISABLE_RECOVERY="true"

接下来运行下面的命令来重新创建内核配置.

# grub2-mkconfig -o /boot/grub2/grub.cfg

重启机器并查看内核版本

# uname -a
Linux iZt4n3pfp2quf7ld2pln01Z 5.6.5-1.el7.elrepo.x86_64 #1 SMP Thu Apr 16 14:02:22 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux

安装k3s

安装master
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--flannel-backend=none --no-flannel' sh -
安装node(可选)
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC='--no-flannel' K3S_URL='https://${MASTER_IP}:6443' K3S_TOKEN=${NODE_TOKEN}
挂载BPF文件系统
sudo mount bpffs -t bpf /sys/fs/bpf
安装Cilium
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/1.7.2/install/kubernetes/quick-install.yaml
查看安装结果
# kubectl -n kube-system get pods --watch
NAME                                      READY   STATUS      RESTARTS   AGE
cilium-operator-774d8f6d67-8mht6          1/1     Running     0          2m24s
metrics-server-6d684c7b5-qjmd5            1/1     Running     0          2m55s
local-path-provisioner-58fb86bdfd-xmx2r   1/1     Running     0          2m55s
helm-install-traefik-wx88l                0/1     Completed   0          2m55s
cilium-md26c                              1/1     Running     0          2m24s
svclb-traefik-g4mq5                       2/2     Running     0          55s
coredns-6c6bb68b64-gtqm5                  1/1     Running     0          2m55s
traefik-7b8b884c8-79v79                   1/1     Running     0          55s

部署连接测试

该步骤部署一系列deployment,这些deployment将使用各种连接路径相互连接。连接路径包括有/无service负载平衡以及各种网络策略组合。pod名称表示连接变量,readiness和liveness gate表示测试的成功或失败:

kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/1.7.2/examples/kubernetes/connectivity-check/connectivity-check.yaml

安装Hubble

Hubble是一个完全分布式的网络和安全的观测平台,用于云本地工作负载。它构建在Cilium和eBPF之上,可以通过完全透明的方式深入了解服务以及网络基础设施的通信和行为。Visit Hubble Github page

安装helm
wget https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz
tar -zxvf helm-v3.1.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
安装Hubble
git clone https://github.com/cilium/hubble.git
cd hubble/install/kubernetes
helm template hubble \
    --namespace kube-system \
    --set metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}" \
    --set ui.enabled=true \
> hubble.yaml
kubectl apply -f hubble.yaml

如果需要通过nodeport的方式访问,可以创建如下service,访问http://{$Externap_IP}:32000即可看到相关的策略

apiVersion: v1
kind: Service
metadata:
name: hubble-ui-node
namespace: kube-system
spec:
ports:
- name: http
port: 12000
protocol: TCP
targetPort: 12000
nodePort: 35000
selector:
k8s-app: hubble-ui
sessionAffinity: None
type: NodePort

Cilium的网络模型

同节点访问

同节点内部的容器之间的连通性依赖内核协议栈二层转发和BPF程序,不会经过像OVS或Linux bridge这样的二层设备。这部分功能由Cilium Agent负责,使用BPF规则进行流量的管控。简单示意图如下:

官方示意图如下:

可以看到,同节点的容器之间通信直接走BPF规则即可;不同节点的容器的通信需要通过各个节点上的cilium_host接口进行转发

容器和所在节点的通信走节点内部的三层路由和BPF转发,BPF程序连接容器的veth pair和它的网关设备。如下路由中,将cilium_host作为容器的默认网关。容器和容器所在的节点的通信需要经过cilium_host接口

容器:
# ip route
default via 10.42.0.79 dev eth0 mtu 1450
10.42.0.79 dev eth0 scope link
节点:
[root@iZt4n3pfp2quf7ld2pln01Z ~]# ip route
default via 172.21.239.253 dev eth0
10.42.0.0/24 via 10.42.0.79 dev cilium_host src 10.42.0.79 mtu 1450
10.42.0.79 dev cilium_host scope link
169.254.0.0/16 dev eth0 scope link metric 1002
172.21.224.0/20 dev eth0 proto kernel scope link src 172.21.239.198

cilium_host涉及的iptables表项如下,可以看到对源地址为127.0.0.1的报文进行了SNAT。

Chain CILIUM_POST_nat (1 references)
 pkts bytes target     prot opt in     out     source               destination
1977  119K MASQUERADE  all  --  *      !cilium_+  10.42.0.0/24        !10.42.0.0/24         /* cilium masquerade non-cluster */
1521 95679 RETURN     all  --  *      !cilium_host  0.0.0.0/0            0.0.0.0/0            /* exclude non-cilium_host traffic from masquerade */
0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0xa00/0xe00 /* exclude proxy return traffic from masquarade */
0     0 SNAT       all  --  *      cilium_host !10.42.0.79          !10.42.0.0/24         /* cilium host->cluster masquerade */ to:10.42.0.79
0     0 SNAT       all  --  *      cilium_host  127.0.0.1            0.0.0.0/0            /* cilium host->cluster from 127.0.0.1 masquerade */ to:10.42.0.79

跨节点网络

下面是使用Host L3进行跨节点通信的流程图

下面是使用vxlan进行跨节点通信的流程图

Cilium cli

使用Cilium后,不会再使用kube-proxy,它会从Kubernetes API服务器获得Service信息,并存入BPF。可以使用cilium命令行查看相关的信息。如使用# cilium node list查看当前的node节点信息,使用# cilium service list查看service信息等。对于策略的获取,可以通过命令行# cilium policy get,也可以通过Hubble UI查看,如下:

参考:

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
2873 1
|
Kubernetes 网络协议 Linux
Cilium 系列 -7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
Cilium 系列 -7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
|
2月前
|
Kubernetes 监控 网络协议
【k8s-1.34.2安装部署】六.企业级部署cilium-1.18.4网络插件
本章详解K8s集群中CNI网络插件Cilium 1.18.4的安装配置,涵盖Helm部署、核心参数解析及状态验证。支持eBPF、Hubble可视化、带宽管理等功能,并提供镜像加速地址与常见问题处理方案。
859 7
|
Kubernetes Cloud Native Linux
阿里云基于Cilium的高性能云原生网络
你知道吗,这个方案基于Cilium & eBPF来实现。在此之前,Google的GKE和Anthos也宣布基于Cilium+eBPF实现了新的容器网络数据面V2方案。但阿里云的方案会有所不同,阿里云采用Terway IPVLAN+Cilium的eBPF结合的方式。
12897 1
阿里云基于Cilium的高性能云原生网络
|
12月前
|
存储 缓存 资源调度
全局缓存yarn
在现代前端开发中,Yarn 是重要的包管理工具。本文为初学者详细介绍如何实现“全局缓存 Yarn”,包括安装 Yarn、配置全局缓存路径及验证配置是否成功。通过设置缓存路径(如 `~/.cache/yarn`),避免重复下载相同包,提升开发效率并节省网络带宽。最后通过安装和验证包(如 lodash)确保配置有效。良好的包管理习惯对项目维护至关重要。
345 1
全局缓存yarn
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
4571 11
|
运维 Kubernetes 监控
kubernetes 安装cilium
Cilium是一个开源软件,用于透明地提供和保护使用Kubernetes,Docker和Mesos等Linux容器管理平台部署的应用程序服务之间的网络和API连接。 Cilium基于一种名为BPF的新Linux内核技术,它可以在Linux内部动态插入强大的安全性,可见性和网络控制逻辑。 除了提供传统的网络级安全性之外,BPF的灵活性还可以在API和进程级别上实现安全性,以保护容器或容器内的通信。由于BPF在Linux内核中运行,因此可以应用和更新Cilium安全策略,而无需对应用程序代码或容器配置进行任何更改。
1216 1
|
Kubernetes 网络协议 Linux
Cilium 系列 -2-Cilium 快速安装
Cilium 系列 -2-Cilium 快速安装
|
存储 Kubernetes API
在K8S中,如何扩容和缩容K8s集群?
在K8S中,如何扩容和缩容K8s集群?
|
Kubernetes 安全 数据安全/隐私保护
k8s-权限管理
k8s-权限管理
434 1