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场景,出现问题时排查、解决都较为困难。
- 尝试了目前市面上的方案都不太满足自己的需求,欢迎来试用集中式网关。