一、概述
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