Zadig 从 v1.11.0 版本推出了自测模式,开发者之间可以共享同一套基准环境,从基准环境拉出子环境来部署少量变更的服务。通过子环境和基准服务交互,实现了在复杂业务场景下低成本的自测联调:
Zadig 自测模式在应用场景上,主要针对集群内部的流量动态管理做了支持,但在日常工作中,开发者通常会需要在集群外部访问集群中的服务,比较常见的模式是基于 Ingress Controller 访问集群中的服务。
Nginx Ingress Controller 和 Istio Ingress Gateway 作为常用的 Ingress Controller,下述将分别基于这两种类型的 Ingress Controller,实现集群外部访问集群内部的自测环境。
实现原理
Kubernetes Ingress 和 Istio Gateway 可以基于 Host 和请求 Path 做动态路由,将集群外部的请求转发到内部的 Service。外部请求进入到集群中的服务后,可基于 Zadig 自测模式使用的 Istio 的能力,基于灰度标将请求动态路由到目标环境中的服务。
即基于 二次动态路由 实现集群外部对集群中自测环境的访问:
- 基于 Ingress 或 Istio Gateway,路由集群外部请求到集群内的环境
- 基于灰度标,路由集群内部自测模式的请求
基于 Ingress
假设用户基准环境 base 中部署了 3 个服务 A / B / C,请求链路为 A->B->C。基于基准环境创建了 2 个子环境 dev1 和 dev2,dev1 中部署了服务 A’ / B’,dev2 中部署了服务 B” / C”。
用户在另一个 namespace 中部署了 Ingress Controller (如 Nginx Ingress Controller 或 Istio Ingress Gateway),该 Ingress Controller 不用注入 istio-proxy。
为了实现从集群外部对集群中自测环境的访问,需要分别在 base 和 dev1 环境中部署 Ingress,基于 Host 将外部请求路由到相应的环境中 (由于 dev2 没有部署入口访问服务 A,故不用部署 Ingress,通过 base 环境的 Ingress 将外部请求路由到 dev2 环境)。
- 当用户从外部访问 base 环境,请求的 Host 配置 base 环境中配置的 Ingress 的 Host,请求 header 中可选加灰度标
x-env=base
。 - 当用户从外部访问 dev1 环境,请求的 Host 配置 dev1 环境中配置的 Ingress 的 Host,请求 header 中添加灰度标
x-env=dev1
。 - 当用户从外部访问 dev2 环境,请求的 Host 配置 base 环境中配置的 Ingress 的 Host,请求 header 中添加灰度标
x-env=dev2
。
基于 Istio Gateway
Istio Gateway 提供了比 Ingress 更灵活的流量管理能力,在上述集群外部访问集群中自测环境的场景中,示意图如下:
使用方法同上,区别点在于可在 dev2 环境中部署 Gateway 资源,在集群外部访问 dev2 环境时,请求的 Host 可配置为 dev2 环境中配置的 Host。
案例实践
基于 Ingress 的实践
适用于 Nginx Ingress Controller 和 Istio Ingress Gateway
base 环境 Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress namespace: piggymetrics-env-base spec: rules: - host: "base.testing.koderover.com" http: paths: - path: / pathType: Prefix backend: service: name: a port: number: 80
dev1 环境 Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress namespace: piggymetrics-env-dev1 spec: rules: - host: "dev1.testing.koderover.com" http: paths: - path: / pathType: Prefix backend: service: name: a port: number: 80
集群外部访问集群中的自测环境:
# 访问 base 环境 $ curl -sSL -H "Host: base.testing.koderover.com" -H "x-env: base" http://<INGRESS IP>/api/v1/info # 访问 dev1 环境 $ curl -sSL -H "Host: dev1.testing.koderover.com" -H "x-env: dev1" http://<INGRESS IP>/api/v1/info # 访问 dev2 环境 $ curl -sSL -H "Host: base.testing.koderover.com" -H "x-env: dev2" http://<INGRESS IP>/api/v1/info
基于 Gateway 的实践
适用于 Istio Ingress Gateway
base 环境 Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: base-gateway namespace: piggymetrics-env-base spec: selector: istio: ingressgateway servers: - port: number: 8080 name: http protocol: HTTP hosts: - "base.testing.koderover.com" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: base namespace: piggymetrics-env-base spec: hosts: - "*" gateways: - base-gateway http: - route: - destination: port: number: 80 host: a.piggymetrics-env-base.svc.cluster.local
dev1 环境 Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: dev1-gateway namespace: piggymetrics-env-dev1 spec: selector: istio: ingressgateway servers: - port: number: 8080 name: http protocol: HTTP hosts: - "dev1.testing.koderover.com" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: base namespace: piggymetrics-env-dev1 spec: hosts: - "*" gateways: - dev1-gateway http: - route: - destination: port: number: 80 host: a.piggymetrics-env-dev1.svc.cluster.local
dev2 环境 Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: dev2-gateway namespace: piggymetrics-env-dev2 spec: selector: istio: ingressgateway servers: - port: number: 8080 name: http protocol: HTTP hosts: - "dev2.testing.koderover.com" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: dev2 namespace: piggymetrics-env-dev2 spec: hosts: - "*" gateways: - dev2-gateway http: - route: - destination: port: number: 80 host: a.piggymetrics-env-base.svc.cluster.local
集群外部访问集群中的自测环境:
# 访问 base 环境 $ curl -sSL -H "Host: base.testing.koderover.com" -H "x-env: base" http://<INGRESS IP>/api/v1/info # 访问 dev1 环境 $ curl -sSL -H "Host: dev1.testing.koderover.com" -H "x-env: dev1" http://<INGRESS IP>/api/v1/info # 访问 dev2 环境 $ curl -sSL -H "Host: dev2.testing.koderover.com" -H "x-env: dev2" http://<INGRESS IP>/api/v1/info
展望
基于 Nginx Ingress Controller 或 Istio Ingress Gateway,我们可以通过简单的配置实现从集群外部到集群中自测环境的访问,方便开发者灵活选择访问方式,提升开发自测效率。
未来 Zadig 会考虑如何将上述能力产品化,支持更多的请求协议和灰度规则,并增强流量的可观测性,给开发者提供更易使用的产品体验。
Zadig,让工程师更专注创造。
欢迎加入 开源吐槽群?