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

