阿里云飞天洛神云网络集中式网关ACMG最佳实践

简介: 云网络集中式网关ACMG的实践

ACMG是专门为东西向流量打造的集中式七层网关,使用无侵入式引流的方式,在满足用户流量治理需求的同时,相比Sidecar模式在资源利用率、运维复杂度、性能和时延等方面具有优势。


其中之前主流的分布式Sidecar模式在近几年受到了大家的青睐,但是在使用过程中也有问题逐渐暴露了出来,Sidecar模式在内存消耗上比较可控,最多也是在MB这个量级,但是在CPU利用率上,随着业务吞吐量的增长,Sidecar的CPU消耗基本达到了与业务消耗持平的量级,相当于在使用Sidecar之后,相同业务规模需要两倍的集群数来承载。

总的来看,业内也逐渐意识到了这个问题,逐渐演进出了其他方案,比如Ambient、AWS VPC Lattice都推出了与Sidecar不同的方案。



按照下面的教程可以体验ACMG的基本流量接管功能以及一些拓展的高级用法,同样支持开发者们基于ACMG的源代码进行二次开发。


3.1 编译代码

$ make build


3.2 编译镜像

$ make docker
$ docker images

经过编译,得到下图所示的docker镜像:

localhost:5000/app_sidecar_centos_7        latest      localhost:5000/app_sidecar_debian_11       latest      localhost:5000/app_sidecar_ubuntu_xenial   latest      localhost:5000/app_sidecar_ubuntu_jammy    latest      localhost:5000/app                         latest      localhost:5000/install-cni                 latest      localhost:5000/proxyv2                     latest      localhost:5000/operator                    latest      localhost:5000/pilot                       latest      localhost:5000/istioctl                    latest      localhost:5000/acmg                        latest      localhost:5000/ext-authz                   latest


3.3 安装

Istio有多种安装模式,我们选择acmg(集中式网关)的模式进行安装。

$ ./out/linux_amd64/istioctl profile list
Istio configuration profiles:
acmg
default
demo
empty
external
minimal
open
shift
preview


$ ./out/linux_amd64/istioctl install --set profile=acmg


当上面的命令执行完毕,可以检查一下安装情况。

$ kubectl get pods -n istio-system
NAME                               READY   STATUS    RESTARTS   AGEacmg-controller-798cbd6b9d-x4fmd   1/1     Running   0          5m32sacmg-gateway-66f9f86fcd-xx9qg      1/1     Running   0          3m8sistiod-945b9f699-sm4js             1/1     Running   0          5m31s

可以看到acmg-controller,acmg-gateway,istiod三个重要的角色已经就绪,其中acmg-gateway可以接管整个集群的东西向流量。


3.4 使用

以服务default命名空间里的helloworld为例,介绍一下如何使用集中式网关。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:  
name: helloworld-acmg  
namespace: istio-system
spec:  
enableAcmg: true  
hosts:  
- "*"  
http:  
- match:    
- uri:        
exact: /hello    
route:    - destination:        host: helloworld.default.svc.cluster.local

其中enableAcmg字段表示此虚拟服务将托管到集中式网关中。发起对helloworld服务的访问,可以发现流量是经过集中式网关到达的helloworld服务。


3.5 卸载

$ ./out/linux_amd64/istioctl uninstall --purge

当上面的命令执行完毕,检查一下卸载情况。

$ kubectl get pods -n istio-systemNo resources found.

可以看到,集中式网关的相关资源已经全部清理完毕。



4.1 流量分发

创建DestinationRule,指定不同版本的helloworld服务。

apiVersion: 
networking.istio.io/v1alpha3
kind: DestinationRule
metadata:  
name: helloworld-acmg  
namespace: istio-system
spec:  
host: helloworld.default.svc.cluster.local  
trafficPolicy:    
loadBalancer:      
simple: ROUND_ROBIN  
subsets:    
- name: v1      labels:        
version: v1    
- name: v2      
labels:        
version: v2

创建VirtualService,引用不同版本的helloworld服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:  
name: helloworld-acmg  
namespace: istio-system
spec:  enableAcmg: true  
hosts:  
- "*"  
http:  
- match:    
- uri:        
exact: /hello    
route:    
- destination:        
host: helloworld.default.svc.cluster.local        
subset: v1      
weight: 90    
- destination:        
host: helloworld.default.svc.cluster.local        
subset: v2      
weight: 10


4.2 故障注入

例如,我们可以为访问 helloworld 服务千分之一的请求配置一个 5 秒的延迟访问:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:  
name: helloworld-acmg  
namespace: istio-system
spec:  enableAcmg: true  
hosts:  
- "*"  
http:  
- fault:      
delay:        
percentage:          
value: 0.1        fixedDelay: 5s  
- match:    
- uri:        
exact: /hello    
route:    
- destination:        
host: helloworld.default.svc.cluster.local


4.3 服务熔断

例如下面的设置将helloworld服务v1子集的工作负载并发连接数限制为 100:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:  
name: helloworld-acmg  
namespace: istio-systemspec:  
host: helloworld.default.svc.cluster.local  
trafficPolicy:    
loadBalancer:     
simple: ROUND_ROBIN  
subsets:    
- name: v1      
labels:        
version: v1      
trafficPolicy:        
connectionPool:          
tcp:            maxConnections: 100    
- name: v2      
labels:       
version: v2



云原生理念让我们受益良多,但是也带来了一些问题,比如原先的单体式应用变成了多个服务单元,这使得服务发现与路由规则变得更为复杂了;而且通常情况下,东西向流量的访问也是默认使用http,当攻击者绕过防火墙进入K8S集群,那么整个集群内的服务都会直接暴露给攻击者。这时候就要考虑每个服务如何安全地与集群内其他服务进行通信。


ACMG后期主要会着力于打造安全零信任网络,完善可观测能力,在访问控制、双向认证、身份识别等方面推出成熟的解决方案,在可观测性方面,通过无侵入的方式加强日志追踪、日志收集等能力,为集群内的服务生成完整的遥测数据。


相关资料:开源代码链接


常见问题:

Q:集中式网关和Sidecar、Ambient有什么区别?

A:集中式网关是专门为服务网格场景打造的集中式七层网关,整个集群的东西向流量都可以由集中式网关接管,无需Sidecar;在满足用户流量治理需求的同时,相比Sidecar、Ambient在资源利用率、运维复杂度、性能和时延等方面具有优势。

Q:集中式网关的转发底座是什么?

A:集中式网关是基于Envoy进行开发设计的。

Q:集中式网关打算一直坚持开源吗?

A:是的,我们坚持开源,不会改变。

Q:集中式网关适合哪种业务使用?

A

  • 业务规模较大,对Sidecar消耗的资源较为敏感。
  • 运维复杂的ServiceMesh场景,出现问题时排查、解决都较为困难。
  • 尝试了目前市面上的方案都不太满足自己的需求,欢迎来试用集中式网关
作者介绍
目录