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 应用程序设置了一个入口,为每个环境的图像设置了一个入口,这样就不会造成混淆。
我们正在将应用程序迁移到 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 应用程序设置了一个入口,为每个环境的图像设置了一个入口,这样就不会造成混淆。