使用 Nginx 入口控制器将 .Net Core WebApi Docker 图像部署到 Azure Kubernetes 服务
Deploying .Net Core WebApi Docker Image to Azure Kubernetes Service using Nginx Ingress Controller
我创建了一个示例 .Net Core WebApi 并将图像推送到 ACR。现在,我使用指向已部署 Pods 运行 图像的 ClusterIP 服务的入口资源,使用 Nginx 入口控制器将其部署到 AKS。
问题是当我将 ClusterIP 服务更改为 LoadBalancer 以直接命中它进行测试时,我从 WebApi 获得结果。但是当我将它改回 ClusterIP 并使用 Nginx Ingress Controller IP 地址时,我总是得到 404 Not Found。
下面是代码。请提出建议。
apiVersion: apps/v1
kind: Deployment
metadata:
name: weather-forecast-webapi-deployment
namespace: development
spec:
replicas: 1
selector:
matchLabels:
app: weather-forecast-webapi-pod
template:
metadata:
labels:
app: weather-forecast-webapi-pod
spec:
containers:
- name: weather-forecast-webapi-container
image: employeeconnectacr.azurecr.io/demoapi:latest
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: weather-forecast-webapi-service-clusterip
namespace: development
spec:
ports:
- port: 80
targetPort: 80
selector:
app: weather-forecast-webapi-pod
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: econnect-ingress
namespace: development
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- http:
paths:
- path: /demo
pathType: Prefix
backend:
serviceName: weather-forecast-webapi-service-clusterip
servicePort: 80
status:
loadBalancer:
ingress:
- ip: 52.141.219.175
看起来你搞砸了你的入口对象。我假设您想将 /demo
路径重写为 /
,以便将 /demo/foo/bar
之类的路径重写为 /foo/bar
.
Here 是重写解释。
示例如下:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: econnect-ingress
namespace: development
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
rules:
- http:
paths:
- path: /demo(/|$)(.*)
pathType: Prefix
backend:
serviceName: weather-forecast-webapi-service-clusterip
servicePort: 80
请注意,我只更改了路径和 rewtire-tager 组号。在 /demo(/|$)(.*)
中,括号 ()
创建一个在 rewrite-target: /
中引用的组。 $1 引用第一组:/ or end of string
,第二组是它后面的所有内容;所以你复制 /demo/
之后的所有内容并使其成为新路径。
我创建了一个示例 .Net Core WebApi 并将图像推送到 ACR。现在,我使用指向已部署 Pods 运行 图像的 ClusterIP 服务的入口资源,使用 Nginx 入口控制器将其部署到 AKS。
问题是当我将 ClusterIP 服务更改为 LoadBalancer 以直接命中它进行测试时,我从 WebApi 获得结果。但是当我将它改回 ClusterIP 并使用 Nginx Ingress Controller IP 地址时,我总是得到 404 Not Found。
下面是代码。请提出建议。
apiVersion: apps/v1
kind: Deployment
metadata:
name: weather-forecast-webapi-deployment
namespace: development
spec:
replicas: 1
selector:
matchLabels:
app: weather-forecast-webapi-pod
template:
metadata:
labels:
app: weather-forecast-webapi-pod
spec:
containers:
- name: weather-forecast-webapi-container
image: employeeconnectacr.azurecr.io/demoapi:latest
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: weather-forecast-webapi-service-clusterip
namespace: development
spec:
ports:
- port: 80
targetPort: 80
selector:
app: weather-forecast-webapi-pod
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: econnect-ingress
namespace: development
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- http:
paths:
- path: /demo
pathType: Prefix
backend:
serviceName: weather-forecast-webapi-service-clusterip
servicePort: 80
status:
loadBalancer:
ingress:
- ip: 52.141.219.175
看起来你搞砸了你的入口对象。我假设您想将 /demo
路径重写为 /
,以便将 /demo/foo/bar
之类的路径重写为 /foo/bar
.
Here 是重写解释。
示例如下:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: econnect-ingress
namespace: development
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
rules:
- http:
paths:
- path: /demo(/|$)(.*)
pathType: Prefix
backend:
serviceName: weather-forecast-webapi-service-clusterip
servicePort: 80
请注意,我只更改了路径和 rewtire-tager 组号。在 /demo(/|$)(.*)
中,括号 ()
创建一个在 rewrite-target: /
中引用的组。 $1 引用第一组:/ or end of string
,第二组是它后面的所有内容;所以你复制 /demo/
之后的所有内容并使其成为新路径。