AKS Ingress - 多个 ExternalName 服务

AKS Ingress - multiple ExternalName services

我们正在将应用程序迁移到 AKS。最初它部署在我们的服务器上,并且在具有代理设置的同一台机器上有一个包含图像的目录。所以我们有 www.example.com 用于应用程序和 www.example.com/images 指向这个目录。

我们已经使用 nginx ingress 为不同的环境成功部署了我们的应用程序到 AKS,并且我们已经为每个环境创建了带有目录的 blob 存储 , 两者都运作良好。现在我们需要为应用程序及其图像创建相同的 URL。

我发现可以使用ExternalName服务(https://www.elvinefendi.com/2018/08/08/ingress-nginx-proxypass-to-external-upstream.html)实现,但是ExternalName中无法设置URL中的目标路径服务并在入口元数据注释中设置,我们需要每个环境的不同路径

我找到了不同的 ExternalName 服务的示例,但所有服务都在基础 URL 或一个 ExternalName 服务上提供,适用于所有环境。所以我的问题是 - 有没有什么方法可以设置环境,以便所有环境都有一个入口和一个 blob 存储? 或者每个环境有一个入口更好吗?

Blob 存储结构:

.
|--example-dev  
|  |-- dev-image.png 
|--example-test
|  |-- test-image.png
|--example-prod
|  |--prod-image.png

外部名称服务:

kind: Service
apiVersion: v1
metadata:
  name: file-service
spec:
  type: ExternalName
  externalName: example.blob.core.windows.net
  ports:
    - port: 443

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - example.northeurope.cloudapp.azure.com
      secretName: tls-secret
  rules:
    - host: example.northeurope.cloudapp.azure.com
      http:
        paths:

#### Here we need to specify the path inside blob container somehow, I guess ####
          - path: /dev/images(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: file-service
                port:
                  number: 443
          - path: /dev(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: dev-example-app
                port:
                  name: http
          - path: /test(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: test-example-app
                port:
                  name: http

我们终于通过为每个环境创建单独的入口解决了这个问题:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: "/example-test/"
    nginx.ingress.kubernetes.io/upstream-vhost: "example.blob.core.windows.net"
  name: test-storage-ingress
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - example.myserver.com
      secretName: tls-secret
  rules:
    - host: example.myserver.com
      http:
        paths:
          - path: /test/images(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: storage-service
                port:
                  number: 80

因此我们为所有 Web 应用程序设置了一个入口,为每个环境的图像设置了一个入口,这样就不会造成混淆。