使用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查看,如下:

参考:

Cilium使用 (Cilium 3)的更多相关文章

  1. Cilium架构 (Cilium 2)

    Cilium架构 译自:http://docs.cilium.io/en/stable/architecture/ 本文档描述了Cilium的架构.它通过记录BPF数据路径(datapath)的钩子来 ...

  2. Cilium 1.11 发布,带来内核级服务网格、拓扑感知路由....

    原文链接:https://isovalent.com/blog/post/2021-12-release-111 作者:Cilium 母公司 Isovalent 团队 译者:范彬,狄卫华,米开朗基杨 ...

  3. eBPF Cilium实战(1) - 基于团队的网络隔离

    在 Rainbond 集群中,每个团队对应于底层 Kubernetes 的一个 Namespace ,由于之前使用的底层网络无法进行 Namespace 级别的网络管理,所以在 Rainbond 同一 ...

  4. eBPF Cilium实战(2) - 底层网络可观测性

    在之前的平台中,对于组件之间的网络流向不具备直接的可观测性,用户组件间通信出现问题,只能通过传统命令行工具进行手动排查,而 cilium 的 Hubble 服务可以提供 UI 界面向用户展示实时的流量 ...

  5. 腾讯云TKE-基于 Cilium 统一混合云容器网络(下)

    前言 在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案.公有云 TKE 集群添加第三方 ...

  6. 使用containerlab搭建cilium BGP环境解析

    使用 Containerlab + Kind 快速部署 Cilium BGP 环境一文中使用Containerlab和Cilium实现了模拟环境下的Cilium BGP网络.它使用Containerl ...

  7. kubernetes-整体概述和架构

    1.Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩容.在Kubernetes中,会将组 ...

  8. 阿里云单机快速部署K8S

    网上有很多关于K8S部署测试环境的文章,但是有些部署比较繁琐.这里推荐使用 https://github.com/gjmzj/kubeasz地址文章.文章介绍很详细,记录一下方便自己日后学习使用. # ...

  9. 容器、容器集群管理平台与 Kubernetes 技术漫谈

    原文:https://www.kubernetes.org.cn/4786.html 我们为什么使用容器? 我们为什么使用虚拟机(云主机)? 为什么使用物理机? 这一系列的问题并没有一个统一的标准答案 ...

随机推荐

  1. The instance of entity type 'manager' cannot be tracked because another instance with the same key value for {'id'} is already being tracked. When attaching existing entities, ensure that only one ent

    最近在用ASP.NET CORE时遇到一些问题,现记录下: 出现上述错误,即在更新实体数据时出现的错误 services.AddDbContext<StoreContext>(c => ...

  2. Dapper操作MySQL数据库获取JSON数据中文乱码

    前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...

  3. python对目录下的文件进行 多条件排序

    在进入正题之前,先介绍一下基础知识: 1.sort(),方法:就是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表 lists =[1, 5, 10, 8, 6]lists.sort ...

  4. word2vec 和 glove 模型的区别

    2019-09-09 15:36:13 问题描述:word2vec 和 glove 这两个生成 word embedding 的算法有什么区别. 问题求解: GloVe (global vectors ...

  5. 动态网站项目(Dynamic Web Project)CRUD(增删改查)功能的实现(mvc(五层架构)+jdbc+servlet+tomcat7.0+jdk1.8),前端使用JSP+JSTL+EL组合

    代码分享链接 https://pan.baidu.com/s/1UM0grvpttHW9idisiqa6rA    提取码:hx7c 图示           项目结构 1.SelectAllUser ...

  6. [SQL]CASE WHEN的用法及总结

    CASE WHEN的用法及总结 一.已知数据按照另外一种方式进行分组,分析 二.用一个SQL语句完成不同条件的分组 三.在Check中使用Case函数 四.根据条件有选择的UPDATE 五.两个表数据 ...

  7. ATM 最初版

    # 二 一个项目开发前,有一份开发文档 # # 项目: 编写小说阅读程序实现下属功能 # # # 一:程序运行开始时显示 # 0 账号注册 # 1 账号登录 # 2 充值功能 # 3 阅读小说 imp ...

  8. flask中 多对多的关系 主从表之间的的增删改查

    # 角色表模型class Role(db.Model): r_id = db.Column(db.Integer, primary_key=True) r_name = db.Column(db.St ...

  9. 3.用IntelliJ IDEA 创建Maven

    一.File→New→ Project (需要下载安装配置Maven等,这些步骤省略) 二.Maven→org.apache.maven.archetypes:maven-archetype-quic ...

  10. [洛谷1649]障碍路线<BFS>

    题目链接:https://www.luogu.org/problem/show?pid=1649 历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾: 这是一道很明显的BFS,然 ...