1 什么是Cilium(官网翻译借鉴)

当前趋势
现代数据中心的应用系统已经逐渐转向基于微服务架构的开发体系,一个微服务架构的应用系统是由多个小的独立的服务组成,它们之间通过轻量通信协议如HTTP、gRPC、Kafka等进行通信。微服务架构下的服务天然具有动态变化的特点,结合容器化部署,时常会引起大规模的容器实例启动或重启。要确保这种向高度动态化的微服务应用之间的安全可达,既是挑战,也是机遇。

现有问题
传统的Linux网络访问安全控制机制(如iptables)是基于静态环境的IP地址和端口配置网络转发、过滤等规则,但是IP地址在微服务架构下是不断变化的,非固定的;出于安全目的,协议端口(例如HTTP传输的TCP端口80)也不再固定用来区分应用系统。为了匹配大规模容器实例快速变化的生命周期,传统网络技术需要维护成千上万的负载均衡规则和访问控制规则,并且需要以不断增长的频率更新这些规则,而如果没有准确的可视化功能,要维护这些规则也是十分困难,这些对传统网络技术的可用性和性能都是极大的挑战。比如经常会有人对kube-proxy基于iptables的服务负载均衡功能在大规模容器场景下具有严重的性能瓶颈,同时由于容器的创建和销毁非常频繁,基于IP做身份关联的故障排除和安全审计等也很难实现。

解决方案
Cilium作为一款Kubernetes CNI插件,从一开始就是为大规模和高度动态的容器环境而设计,并且带来了API级别感知的网络安全管理功能,通过使用基于Linux内核特性的新技术——BPF,提供了基于service/pod/container作为标识,而非传统的IP地址,来定义和加强容器和Pod之间网络层、应用层的安全策略。因此,Cilium不仅将安全控制与寻址解耦来简化在高度动态环境中应用安全性策略,而且提供传统网络第3层、4层隔离功能,以及基于http层上隔离控制,来提供更强的安全性隔离。

另外,由于BPF可以动态地插入控制Linux系统的程序,实现了强大的安全可视化功能,而且这些变化是不需要更新应用代码或重启应用服务本身就可以生效,因为BPF是运行在系统内核中的。

以上这些特性,使Cilium能够在大规模容器环境中也具有高度可伸缩性、可视化以及安全性。

1.1 cilium整体组件部署结构图

在这里插入图片描述

2 Cilium部署过程

2.1 环境准备

#Kubernetes "v1.19.1"
[root@k8smaster180 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.1", GitCommit:"206bcadf021e76c27513500ca24182692aabd17e", GitTreeState:"clean", BuildDate:"2020-09-09T11:26:42Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.1", GitCommit:"206bcadf021e76c27513500ca24182692aabd17e", GitTreeState:"clean", BuildDate:"2020-09-09T11:18:22Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

#Cilium "v1.8.4"

#helm "v3.4.0"

2.2 helm3部署

#下载地址:helm-v3.4.0-linux-amd64.tar.gz

tar zxvf helm-v3.4.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

[root@k8smaster180 ~]# helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}

2.3 cilium-1.8.4部署

#下载地址:cilium-1.8.4.tar.gz

tar zxvf cilium-1.8.4.tar.gz
cd cilium-1.8.4/install/kubernetes/

#执行make

[root@k8smaster180 kubernetes]# make
:  " -> Updating version to 1.8.4"
grep -lRZ -e "version:" -e "appVersion:" "/root/cilium-1.8.4/install/kubernetes/cilium"/ | \
	xargs -0 -l sed -i -e 's/''\([vV]ersion:\) ''[0-9]\+\.[0-9]\+\.[0-9]\+.*''/\1 1.8.4/g'
for chart in ""/root/cilium-1.8.4/install/kubernetes/cilium"/values.yaml" ""/root/cilium-1.8.4/install/kubernetes/cilium"/charts/hubble-relay/values.yaml"; do							\
	if echo 1.8.4 | grep -q '[0-9]\+\.[0-9]\+\.90'; then				\
		sed -i 's/''\(tag:\) \(v''[0-9]\+\.[0-9]\+\.[0-9]\+.*''\|latest\)''/\1 latest/' $chart;				\
		sed -i 's/''\([pP]ullPolicy:\) .*''/\1 Always/' $chart;			\
	elif echo 1.8.4 | grep -q '[0-9]\+\.[0-9]\+-dev'; then				\
		sed -i 's/''\(tag:\) \(v''[0-9]\+\.[0-9]\+\.[0-9]\+.*''\|latest\)''/\1 v1.8.4/' $chart;	\
		sed -i 's/''\([pP]ullPolicy:\) .*''/\1 Always/' $chart;			\
	else											\
		sed -i 's/''\(tag:\) \(v''[0-9]\+\.[0-9]\+\.[0-9]\+.*''\|latest\)''/\1 v1.8.4/' $chart;			\
		sed -i 's/''\([pP]ullPolicy:\) .*''/\1 IfNotPresent/' $chart;		\
	fi; done
sed -i 's/'1.8.4'/'"v2.0.7"'/' "/root/cilium-1.8.4/install/kubernetes/cilium/charts/managed-etcd/values.yaml"
helm template cilium --namespace=kube-system  > "/root/cilium-1.8.4/install/kubernetes/quick-install.yaml"
helm template cilium --namespace=kube-system --set global.hubble.enabled=true --set global.hubble.listenAddress=":4244" --set global.hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}" --set global.hubble.relay.enabled=true --set global.hubble.ui.enabled=true > "/root/cilium-1.8.4/install/kubernetes/experimental-install.yaml"

#查看生成的yaml文件(这步已经启用了Hubble)

sed -i 's/'1.8.4'/'"v2.0.7"'/' "/root/cilium-1.8.4/install/kubernetes/cilium/charts/managed-etcd/values.yaml"

helm template cilium --namespace=kube-system  > "/root/cilium-1.8.4/install/kubernetes/quick-install.yaml"

helm template cilium --namespace=kube-system --set global.hubble.enabled=true --set global.hubble.listenAddress=":4244" --set global.hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}" --set global.hubble.relay.enabled=true --set global.hubble.ui.enabled=true > "/root/cilium-1.8.4/install/kubernetes/experimental-install.yaml"

#创建并查看cilium应用

[root@k8smaster180 kubernetes]# kubectl apply -f experimental-install.yaml
[root@k8smaster180 kubernetes]# kubectl get po,svc -o wide --all-namespaces=true |grep cilium
kube-system     pod/cilium-997ph                                         1/1     Running   0          26h   172.16.1.181   k8snode181     <none>           <none>
kube-system     pod/cilium-operator-df6dfbf9-4zdcd                       1/1     Running   0          26h   172.16.1.180   k8smaster180   <none>           <none>
kube-system     pod/cilium-operator-df6dfbf9-b4b9l                       1/1     Running   0          26h   172.16.1.181   k8snode181     <none>           <none>
kube-system     pod/cilium-z778r                                         1/1     Running   0          26h   172.16.1.180   k8smaster180   <none>           <none>
kube-system   service/hubble-metrics    ClusterIP   None             <none>        9091/TCP                 26h   k8s-app=cilium

#测试安装效果,如果所有的deployment都能成功运行起来,说明Cilium已经成功部署并工作正常。
#测试文件下载地址:connectivity-check.yaml

kubectl apply -f connectivity-check.yaml
[root@k8smaster180 kubernetes]# kubectl get po,svc -o wide
NAME                                                     READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
pod/echo-a-9c5d8bfcf-vcvpd                               1/1     Running   0          29h   10.0.1.21      k8snode181     <none>           <none>
pod/echo-b-79c6c76fb4-7vmn6                              1/1     Running   0          29h   10.0.1.205     k8snode181     <none>           <none>
pod/host-to-b-multi-node-clusterip-78ffcc7449-4dppx      1/1     Running   0          29h   172.16.1.180   k8smaster180   <none>           <none>
pod/host-to-b-multi-node-headless-6dcb4d494c-z25hq       1/1     Running   0          29h   172.16.1.180   k8smaster180   <none>           <none>
pod/pod-to-a-allowed-cnp-9f5cf94c4-n2hg2                 1/1     Running   0          29h   10.0.1.178     k8snode181     <none>           <none>
pod/pod-to-a-external-1111-76c557fc56-prtgq              1/1     Running   1          29h   10.0.1.108     k8snode181     <none>           <none>
pod/pod-to-a-f747cbc86-fnlqc                             1/1     Running   0          29h   10.0.1.164     k8snode181     <none>           <none>
pod/pod-to-a-l3-denied-cnp-6f6c68d6d4-ngvxh              1/1     Running   0          29h   10.0.1.133     k8snode181     <none>           <none>
pod/pod-to-b-intra-node-fd66d747-lnnff                   1/1     Running   0          29h   10.0.1.189     k8snode181     <none>           <none>
pod/pod-to-b-multi-node-clusterip-77cc47f747-2g6tq       1/1     Running   0          29h   10.0.0.193     k8smaster180   <none>           <none>
pod/pod-to-b-multi-node-headless-64b6d4fc95-7fl7x        1/1     Running   1          29h   10.0.0.100     k8smaster180   <none>           <none>

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/echo-a            ClusterIP   10.97.176.234   <none>        80/TCP    29h   name=echo-a
service/echo-b            ClusterIP   10.99.150.200   <none>        80/TCP    29h   name=echo-b
service/echo-b-headless   ClusterIP   None            <none>        80/TCP    29h   name=echo-b

3 Hubble网络可视化

3.1 Hubble介绍

Cilium强大之处就是提供了简单高效的网络可视化功能,它是通过Hubble组件完成的。Cilium在1.7版本后推出并开源了Hubble,它是专门为网络可视化设计,能够利用Cilium提供的eBPF数据路径,获得对Kubernetes应用和服务的网络流量的深度可见性。这些网络流量信息可以对接Hubble CLI、UI工具,可以通过交互式的方式快速诊断如与DNS相关的问题。除了Hubble自身的监控工具,还可以对接主流的云原生监控体系——Prometheus和Grafana,实现可扩展的监控策略。
在这里插入图片描述

3.2 启用hubble端口转发

#部署在2.3已经有写

[root@k8smaster180 ~]# kubectl get po,svc -o wide --all-namespaces=true|grep hubble
kube-system     pod/hubble-relay-7fcc544c57-26hvw                        1/1     Running   0          27h   10.0.1.91      k8snode181     <none>           <none>
kube-system     pod/hubble-ui-7854cf65dc-w6p6c                           1/1     Running   0          27h   10.0.1.111     k8snode181     <none>           <none>
kube-system   service/hubble-metrics    ClusterIP   None             <none>        9091/TCP                 27h   k8s-app=cilium
kube-system   service/hubble-relay      ClusterIP   10.101.112.209   <none>        80/TCP                   27h   k8s-app=hubble-relay
kube-system   service/hubble-ui         ClusterIP   10.98.116.239    <none>        80/TCP                   27h   k8s-app=hubble-ui
[root@k8smaster180 kubernetes]# kubectl port-forward -n kube-system svc/hubble-ui --address 0.0.0.0 --address :: 12000:80
Forwarding from 0.0.0.0:12000 -> 12000
Forwarding from [::]:12000 -> 12000

#访问hubble web http://IP:12000
在这里插入图片描述

4 未完待续

Logo

开源、云原生的融合云平台

更多推荐