企业资讯,产品资讯_博拉资讯 技术资讯 基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

广告位

基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

Zadig 从 v1.11.0 版本推出了自测模式,开发者之间可以共享同一套基准环境,从基准环境拉出子环境来部署少量变更的服务。通过子环境和基准服务交互,实现了在复杂业务场景下低成本的自测联调: 基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

Zadig 自测模式在应用场景上,主要针对集群内部的流量动态管理做了支持,但在日常工作中,开发者通常会需要在集群外部访问集群中的服务,比较常见的模式是基于 Ingress Controller 访问集群中的服务。

Nginx Ingress Controller 和 Istio Ingress Gateway 作为常用的 Ingress Controller,下述将分别基于这两种类型的 Ingress Controller,实现集群外部访问集群内部的自测环境。

实现原理

Kubernetes Ingress 和 Istio Gateway 可以基于 Host 和请求 Path 做动态路由,将集群外部的请求转发到内部的 Service。外部请求进入到集群中的服务后,可基于 Zadig 自测模式使用的 Istio 的能力,基于灰度标将请求动态路由到目标环境中的服务。

即基于 二次动态路由 实现集群外部对集群中自测环境的访问:

  1. 基于 Ingress 或 Istio Gateway,路由集群外部请求到集群内的环境
  2. 基于灰度标,路由集群内部自测模式的请求

基于 Ingress

基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

假设用户基准环境 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 更灵活的流量管理能力,在上述集群外部访问集群中自测环境的场景中,示意图如下: 基于 Ingress Controller 在集群外访问 Zadig 自测环境(最佳实践)

使用方法同上,区别点在于可在 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,让工程师更专注创造。

欢迎加入 开源吐槽群?

Zadig on Github
Zadig on Gitee

本文来自网络,不代表企业资讯,产品资讯_博拉资讯立场,转载请注明出处。

作者: 博拉资讯

上一篇
下一篇
广告位

发表回复

返回顶部