使用 Nginx 入口控制器将 .Net Core WebApi Docker 映像部署到 Azure Kubernetes 服务

问题描述

我创建了一个示例 .Net Core WebApi 并将图像推送到 ACR。现在,我使用指向 ClusterIP 服务的入口资源将其部署到带有 Nginx 入口控制器的 AKS,该服务指向运行映像的已部署 Pod。

问题是当我将 ClusterIP 服务更改为 LoadBalancer 以直接点击它进行测试时,我从 WebApi 获得结果。但是当我将它改回 ClusterIP 并使用 Nginx 入口控制器 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: /$1
    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: /$2
    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: /$2 中引用的组。 $1 引用第一组:/ or end of string,第二组是它之后的所有内容;因此,您复制 /demo/ 之后的所有内容并将其设为新路径。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...