kubeadm1.20.0+cilium+hubble环境搭建
一、概述
Cilium是一种开源网络实现方案,与其他网络方案不同的是,Cilium着重强调了其在网络安全上的优势,可以透明的对Kubernetes等容器管理平台上的应用程序服务之间的网络连接进行安全防护。
Cilium在设计和实现上,基于Linux的一种新的内核技术eBPF,可以在Linux内部动态插入强大的安全性、可见性和网络控制逻辑,相应的安全策略可以在不修改应用程序代码或容器配置的情况下进行应用和更新。
Cilium在其官网上对产品的定位称为“API-aware Networking and Security”,因此可以看出,其特性主要包括这三方面:
(1)提供Kubernetes中基本的网络互连互通的能力,实现容器集群中包括Pod、Service等在内的基础网络连通功能;
(2)依托eBPF,实现Kubernetes中网络的可观察性以及基本的网络隔离、故障排查等安全策略;
(3)依托eBPF,突破传统主机防火墙仅支持L3、L4微隔离的限制,支持基于API的网络安全过滤能力。Cilium提供了一种简单而有效的方法来定义和执行基于容器/Pod身份(Identity Based)的网络层和应用层(比如HTTP/gRPC/Kafka等)安全策略。
二、架构
Cilium官方给出了如下的参考架构[3],Cilium位于容器编排系统和Linux Kernel之间,向上可以通过编排平台为容器进行网络以及相应的安全配置,向下可以通过在Linux内核挂载eBPF程序,来控制容器网络的转发行为以及安全策略执行。
简单的关系描绘
三、环境准备
需要注意2个特殊条件
kubernetes >=1.9 linux kernel >= 4.9
关于内核升级,请参考链接:https://www.cnblogs.com/xiao987334176/p/16273902.html
关于kubernetes安装,请参考链接:https://www.cnblogs.com/xiao987334176/p/16274066.html
服务器信息如下:
操作系统:ubuntu-18.04.6-server-amd64
配置:2核3g
ip地址:192.168.1.12
主机名:k8smaster
操作系统:ubuntu-18.04.6-server-amd64
配置:2核4g
ip地址:192.168.1.13
主机名:k8snode1
四、安装cilium
这里选的版本为:1.7.0
注意:这里要做一下特别提示,在安装cilium之前,我们要确保没有其他cni插件,比如:flannel
我发现如果已经存在flannel,然后再安装cilium,会导致安装失败,因为2个插件有冲突。
所以在此之前,先删除掉flannel
kubectl delete -f kube-flannel.yml
打开谷歌浏览器,下载yaml文件
https://raw.githubusercontent.com/cilium/cilium/v1.7/install/kubernetes/quick-install.yaml
默认下载的是txt文件,需要手动改成yaml文件。
将yaml文件上传到服务器,然后在master执行
kubectl apply -f quick-install.yaml
等待几分钟,查看pod状态
# kubectl get pods -A|grep cilium kube-system cilium-8bkqp 1/1 Running 0 161m kube-system cilium-kfqnk 1/1 Running 0 162m kube-system cilium-operator-746766746f-xtsr4 1/1 Running 0 162m
查看ip地址,注意,会多出4块网卡
# ifconfig cilium_host: flags=4291<UP,BROADCAST,RUNNING,NOARP,MULTICAST> mtu 1500 inet 10.222.0.209 netmask 255.255.255.255 broadcast 0.0.0.0 inet6 fe80::c4b6:27ff:fe03:c42d prefixlen 64 scopeid 0x20<link> ether c6:b6:27:03:c4:2d txqueuelen 1000 (Ethernet) RX packets 1065 bytes 80847 (80.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 366 bytes 24032 (24.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 cilium_net: flags=4291<UP,BROADCAST,RUNNING,NOARP,MULTICAST> mtu 1500 inet6 fe80::5cd7:4bff:fec8:e267 prefixlen 64 scopeid 0x20<link> ether 5e:d7:4b:c8:e2:67 txqueuelen 1000 (Ethernet) RX packets 366 bytes 24032 (24.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1065 bytes 80847 (80.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 cilium_vxlan: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::74d7:7bff:fe3a:1d63 prefixlen 64 scopeid 0x20<link> ether 76:d7:7b:3a:1d:63 txqueuelen 1000 (Ethernet) RX packets 7132 bytes 4542061 (4.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5733 bytes 1282422 (1.2 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:af:83:a0:88 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.12 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 2409:8a1e:af4e:ac10:a00:27ff:fec8:200c prefixlen 64 scopeid 0x0<global> inet6 fe80::a00:27ff:fec8:200c prefixlen 64 scopeid 0x20<link> ether 08:00:27:c8:20:0c txqueuelen 1000 (Ethernet) RX packets 121149 bytes 40742391 (40.7 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 104963 bytes 47334122 (47.3 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 2054621 bytes 421532535 (421.5 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2054621 bytes 421532535 (421.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lxc00259a3b8fde: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::904c:e8ff:fe8c:425c prefixlen 64 scopeid 0x20<link> ether 92:4c:e8:8c:42:5c txqueuelen 1000 (Ethernet) RX packets 1405 bytes 632795 (632.7 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1319 bytes 146621 (146.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lxc_health: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::607a:2ff:fec8:cc10 prefixlen 64 scopeid 0x20<link> ether 62:7a:02:c8:cc:10 txqueuelen 1000 (Ethernet) RX packets 2108 bytes 170024 (170.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2602 bytes 216113 (216.1 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
分别是:cilium_host,cilium_net,lxc_health,lxc00259a3b8fde(这个字符串随机)
说明cilium安装完成。
五、安装hubble
Hubble 是专门为网络可视化设计的,能够利用 Cilium 提供的 eBPF 数据路径,获得对 Kubernetes 应用和服务的网络流量的深度可见性。这些网络流量信息可以对接 Hubble CLI、UI 工具,可以通过交互式的方式快速诊断如与 DNS 相关的问题。除了 Hubble 自身的监控工具,还可以对接主流的云原生监控体系——Prometheus 和 Grafana,实现可扩展的监控策略。
安装文档:https://github.com/cilium/hubble/blob/v0.5/Documentation/installation.md
使用谷歌浏览器,下载yaml文件
默认下载的是txt文件,需要手动改成yaml文件。
将yaml文件上传到服务器,由于hubble-ui的svc默认是ClusterIP,使用浏览器访问不方便。这里手动改成NodePort
修改文文件
vi hubble-all-minikube.yaml
将第132行的ClusterIP改成NodePort
然后在master执行
kubectl apply -f hubble-all-minikube.yaml
等待几分钟,查看pod状态
# kubectl get pods -A|grep hubble kube-system hubble-5q7zd 1/1 Running 0 174m kube-system hubble-q5447 1/1 Running 0 174m kube-system hubble-ui-649d76c898-swqrq 1/1 Running 0 174m
查看hubble-ui的svc
# kubectl get svc -A|grep hubble-ui kube-system hubble-ui NodePort 10.1.54.175 <none> 12000:32286/TCP 178m
这里可以看到nodeport的映射的端口是32286,注意:这个端口是随机的,以实际情况为准。
访问hubble-ui
使用http://master ip+32286
效果如下:
这里我有一个默认的应用flaskapp,先访问一下flaskapp的页面,然后再次查看hubble-ui
这里就会出现一条链路
从上图Hubble的界面,我们可以简单的看出其部分功能和数据,比如,可以直观的显示出网路和服务之间的通信关系,可以查看Flows的多种详细数据指标,可以查看对应的安全策略情况,可以通过namespace对观测结果进行过滤等等。
本文参考链接:
https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/107969613
https://blog.csdn.net/saynaihe/article/details/115187298