您的位置:  首页 > 技术杂谈 > 正文

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

2022-07-05 20:00 https://my.oschina.net/koderover/blog/5549700 Zadig云原生交付 次阅读 条评论

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 的能力,基于灰度标将请求动态路由到目标环境中的服务。

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

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

基于 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,让工程师更专注创造。

欢迎加入 开源吐槽群🔥

Zadig on Github
Zadig on Gitee

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接