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
View Code

分别是: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文件

https://raw.githubusercontent.com/cilium/hubble/v0.5/tutorials/deploy-hubble-servicemap/hubble-all-minikube.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

 

posted @ 2022-05-22 12:31  肖祥  阅读(608)  评论(0编辑  收藏  举报