You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MicroK8s集群Nginx Ingress返回404问题排查求助

问题:MicroK8s中Nginx Ingress访问.NET Orleans应用返回404

问题概述

在MicroK8s集群部署Nginx Ingress与.NET Orleans应用Pod,已配置关联Service,但访问Ingress时返回404,Ingress-Nginx-Controller和Pod均无报错日志。

部署配置

Deployment配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud.solar.trest.se
  labels:
    orleans/serviceId: cloud.solar.trest.se
    orleans/clusterId: trest
spec:
  selector:
    matchLabels:
      orleans/serviceId: cloud.solar.trest.se
      orleans/clusterId: trest
  replicas: 2
  template:
    metadata:
      labels:
        orleans/serviceId: cloud.solar.trest.se
        orleans/clusterId: trest
    spec:
      containers:
        - name: main
          image: lordmax2/klevebrandsolarcontroller:cloud-latest
          imagePullPolicy: Always
          ports:
            - containerPort: 80
            - containerPort: 443
            - containerPort: 11111
            - containerPort: 30000
            - containerPort: 7298
          env:
            - name: ORLEANS_SERVICE_ID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['orleans/serviceId']
            - name: ORLEANS_CLUSTER_ID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.labels['orleans/clusterId']
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: DOTNET_SHUTDOWNTIMEOUTSECONDS
              value: "120"
      terminationGracePeriodSeconds: 180
  strategy:
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1

Service配置

apiVersion: v1
kind: Service
metadata:
  name: solar-service
spec:
  selector:
    orleans/serviceId: cloud.solar.trest.se
    orleans/clusterId: trest
  ports:
    - name: port-11111
      protocol: TCP
      port: 11111
      targetPort: 11111
    - name: port-30000
      protocol: TCP
      port: 30000
      targetPort: 30000
    - name: port-80
      protocol: TCP
      port: 80
      targetPort: 80
    - name: port-443
      protocol: TCP
      port: 443
      targetPort: 443
    - name: port-7298
      protocol: TCP
      port: 7298
      targetPort: 7298

Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: solar-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  ingressClassName: "nginx"
  rules:
  - host: cloud.solar.trest.se
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: solar-service
            port:
              number: 7298
  tls:
  - hosts:
    - cloud.solar.trest.se
    secretName: cloud-certificate

集群状态输出

查看Ingress状态

microk8s kubectl get ingress

输出:

NAME            CLASS   HOSTS                  ADDRESS       PORTS     AGE
solar-ingress   nginx   cloud.solar.trest.se   10.10.1.200   80, 443   117m

查看Service状态

microk8s kubectl get svc

输出:

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                       AGE
kubernetes      ClusterIP   10.152.183.1     <none>        443/TCP                                       2d4h
solar-service   ClusterIP   10.152.183.166   <none>        11111/TCP,30000/TCP,80/TCP,443/TCP,7298/TCP   3h14m

查看Pod状态

microk8s kubectl get pods -o wide

输出:

NAME                                  READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
cloud.solar.trest.se-c97468cb-hwk4m   1/1     Running   0          9m26s   10.1.211.165   kdc-node-1   <none>           <none>
cloud.solar.trest.se-c97468cb-lsm4n   1/1     Running   0          8m21s   10.1.160.143   kdc-node-2   <none>           <none>

Ingress详情

microk8s kubectl describe ingress solar-ingress

输出:

Name:             solar-ingress
Labels:           <none>
Namespace:        default
Address:          10.10.1.200
Ingress Class:    nginx
Default backend:  <default>
TLS:
  cloud-certificate terminates cloud.solar.trest.se
Rules:
  Host                  Path  Backends
  ----                  ----  --------
  cloud.solar.trest.se
                        /   solar-service:7298 (10.1.160.143:7298,10.1.211.165:7298)
Annotations:            <none>
Events:
  Type    Reason  Age                     From                      Message
  ----    ------  ----                    ----                      -------
  Normal  Sync    4m43s (x230 over 119m)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    4m43s (x224 over 115m)  nginx-ingress-controller  Scheduled for sync
  Normal  Sync    26s (x234 over 115m)    nginx-ingress-controller  Scheduled for sync

全Namespace资源列表

kubectl get all

输出:

kdc@kdc-node-1:~ $ kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/cloud.solar.trest.se-c97468cb-hwk4m   1/1     Running   0          25m
pod/cloud.solar.trest.se-c97468cb-lsm4n   1/1     Running   0          24m

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                       AGE
service/kubernetes      ClusterIP   10.152.183.1     <none>        443/TCP                                       2d4h
service/solar-service   ClusterIP   10.152.183.166   <none>        11111/TCP,30000/TCP,80/TCP,443/TCP,7298/TCP   3h30m

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cloud.solar.trest.se   2/2     2            2           24h

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/cloud.solar.trest.se-6c865fdb     0         0         0       24h
replicaset.apps/cloud.solar.trest.se-5b9bb67477   0         0         0       24h
replicaset.apps/cloud.solar.trest.se-c97468cb     2         2         2       25m
replicaset.apps/cloud.solar.trest.se-8577f49f4b   0         0         0       23h
kubectl get all -n ingress-nginx

输出:

kdc@kdc-node-1:~ $ kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS       AGE
pod/ingress-nginx-admission-create-6jwj6        0/1     Completed   0              25h
pod/ingress-nginx-admission-patch-hw8sf         0/1     Completed   1              25h
pod/ingress-nginx-controller-7445ddc6c4-hw76d   1/1     Running     4 (133m ago)   25h

NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller-admission   ClusterIP      10.152.183.230   <none>        443/TCP                      25h
service/ingress-nginx-controller             LoadBalancer   10.152.183.240   10.10.1.200   80:32307/TCP,443:32581/TCP   25h

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           25h

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-7445ddc6c4   1         1         1       25h

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           17m        25h
job.batch/ingress-nginx-admission-patch    1/1           17m        25h
kubectl get all -n metallb-system

输出:

kdc@kdc-node-1:~ $ kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS       AGE
pod/speaker-2lct7                 1/1     Running   0              147m
pod/speaker-rq2ls                 1/1     Running   1 (133m ago)   147m
pod/controller-749f8b5cbc-dq8sm   1/1     Running   0              36m

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/webhook-service   ClusterIP   10.152.183.65   <none>        443/TCP   147m

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   2         2         2       2            2           kubernetes.io/os=linux   147m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           147m

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-749f8b5cbc   1         1         1       36m
replicaset.apps/controller-5f7bb57799   0         0         0       147m
kubectl get ing

输出:

kdc@kdc-node-1:~ $ kubectl get ing
NAME            CLASS   HOSTS                  ADDRESS     PORTS     AGE
solar-ingress   nginx   cloud.solar.trest.se   127.0.0.1   80, 443   136m

补充信息

  • 已添加MetalLB及IPAddressPool、L2Assignment以获取真实IP,但未生效;
  • 执行microk8s kubectl port-forward svc/solar-service 7298后,可在主节点通过https://127.0.0.1:7298访问服务,但无法通过节点IPhttps://10.10.0.150:7298访问。

排查建议

  1. 检查应用监听地址:确认.NET Orleans应用在容器内是否监听0.0.0.0:7298,而非仅127.0.0.1,否则集群内其他组件无法访问;
  2. Ingress Host配置验证:访问时需确保请求的Host头为cloud.solar.trest.se,可通过curl -H "Host: cloud.solar.trest.se" http://10.10.1.200测试,避免因Host不匹配导致Ingress规则未命中;
  3. TLS配置冲突检查:Ingress中配置了TLS但禁用了ssl-redirect,直接访问80端口时,应用是否仅监听HTTPS?可尝试访问https://10.10.1.200并忽略证书验证,看是否返回正常;
  4. Service到Pod连通性测试:在Ingress Controller Pod内执行curl https://10.1.211.165:7298(替换为实际Pod IP),验证服务是否可达;
  5. Ingress Controller日志分析:查看Ingress Controller的详细日志,执行kubectl logs -n ingress-nginx ingress-nginx-controller-7445ddc6c4-hw76d,检查请求转发的具体错误信息;
  6. MetalLB配置验证:确认IPAddressPool的IP段与集群节点所在网段匹配,L2Advertisement配置正确,执行kubectl get ipaddresspools -n metallb-system和kubectl get l2advertisements -n metallb-system查看配置状态。

内容的提问来源于stack exchange,提问作者Hickori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:15:54