AKS 中的入口控制器未正确路由

问题描述 投票:0回答:1

我有一个 aks 集群,其中部署了 spring boot REST API,连接到 psql 服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
      - name: springboot-app
        image: someImage
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_DATASOURCE_URL
          value: jdbc:postgresql://postgres:5432/student
        - name: SPRING_DATASOURCE_USERNAME
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: username
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
---
apiVersion: v1
kind: Service
metadata:
  name: springboot-service
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: springboot-app

这是 API 控制器类的一部分:

@RestController
@RequestMapping(path = "api/product")
public class ProductController {

    private final ProductService productService;

    @Autowired
    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @GetMapping(path = "products")
    public List<Product> getProducts() {
        return productService.getProducts();
    }

我想将 API 公开到互联网,所以我安装了 nginx 控制器并创建了一个入口文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster.issuer: letsencrypt-staging
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
  generation: 2
  name: aks-helloworld
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: springboot-service
            port:
              number: 80
        path: /
        pathType: Prefix

当我执行 Spring API pod 并尝试像这样卷曲资源时

curl http://localhost:8080/api/product/products

它工作正常并返回正确的输出。 但是,当我尝试使用 nginx 控制器中的公共静态 ip 连接到 api 时,我得到了 spring 白色标签错误页面,404 not found

http://<public-ip>/api/product/products

入口控制器日志是这么说的

[05/Jul/2024:08:57:56 +0000] "GET /api/product/products HTTP/1.1" 404 306 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/111.0.0.0" 489 0.005 [default-springboot-service-80]

而且也没有提及该电话。在 spring API pod 日志中,与我在 pod 本身中使用curl 时不同。我是 k8s 的新手,如果我对我做错了什么有任何建议,我们将不胜感激。

还值得一提的是,当我部署本教程中的 aks-helloworld 映像时 https://learn.microsoft.com/en-us/azure/aks/app-routing?tabs=default%2Cdeploy-app-default 我可以通过公共IP连接没有问题。

spring-boot kubernetes yaml azure-aks
1个回答
0
投票

您可以交叉验证您的入口和服务模板,特别是比较端口映射。它应该与您的 springboot 中的 application.properties 文件匹配。

假设您的 ACR 中已提供申请,

enter image description here

创建您的 springboot-deployment、服务和入口 yaml

部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-app
  labels:
    app: springboot-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
      - name: springboot-app
        image: arkoacr.azurecr.io/my-spring-boot-app:latest
        ports:
        - containerPort: 8091
        env:
        - name: SPRING_DATASOURCE_URL
          value: jdbc:postgresql://postgres-postgresql.postgres.svc.cluster.local:5432/student
        - name: SPRING_DATASOURCE_USERNAME
          value: arko
        - name: SPRING_DATASOURCE_PASSWORD
          value: Welcome@12345
        readinessProbe:
          httpGet:
            path: /greeting
            port: 8091
          initialDelaySeconds: 10
          periodSeconds: 5
        imagePullSecrets:
        - name: acr-secret

服务

apiVersion: v1
kind: Service
metadata:
  name: springboot-service
  labels:
    app: springboot-app
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8091
  selector:
    app: springboot-app

enter image description here

入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: springboot-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /greeting
        pathType: Prefix
        backend:
          service:
            name: springboot-service
            port:
              number: 80

enter image description here

enter image description here

enter image description here

enter image description here

如果您仍然遇到问题,请检查

kubectl describe ingress <ingress-name>
以检查您的入口资源的配置,以及
kubectl describe service <service-name>
以检查您的服务的配置以及
kubectl logs <nginx-controller-pod-name>

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.