-
Notifications
You must be signed in to change notification settings - Fork 8.4k
Description
What happened:
All requests failed with 403 for one replica, while there was no such issue for another replica
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
found following logs from ingress-nginx-controller
1757171414218 I0906 15:10:14.218599 7 controller.go:196] "Configuration changes detected, backend reload required"
1757171414276 I0906 15:10:14.276895 7 controller.go:216] "Backend successfully reloaded"
1757171414277 I0906 15:10:14.277043 7 event.go:377] Event(v1.ObjectReference{Kind:"Pod", Namespace:"test", Name:"nginx-ingress-controller-f454d46db-fl5zk", UID:"c7e7ed06-de43-4330-b3ad-51dc290b9494", APIVersion:"v1", ResourceVersion:"1215888925", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration
1757171414283 I0906 15:10:14.283794 7 store.go:645] "secret was updated and it is used in ingress annotations. Parsing" secret="test/client.ca.truststore"
1757171414284 2025/09/06 15:10:14 [emerg] 27#27: cannot load certificate "/etc/ingress-controller/ssl/test-client-certificate.pem": PEM_read_bio_X509_AUX() failed (SSL: error:0480006C:PEM routines::no start line:Expecting: TRUSTED CERTIFICATE)
The issue was resolved after deleting the pod, no such issue for the new pod.
What you expected to happen:
Nginx should handle requests normally same with another replica.
our ingress has following annotations and spec
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
nginx.ingress.kubernetes.io/auth-tls-secret: test/client.ca.truststore
nginx.ingress.kubernetes.io/auth-tls-verify-client: optional
name: test-ingress
namespace: test
spec:
rules:
- host: <host>
http:
paths:
- backend:
service:
name: front
port:
number: 8080
pathType: ImplementationSpecific
tls:
- hosts:
- <host>
secretName: client-certificate
From my analysis, it seems one of the certificate secret changed and caused all certificate files were wrote again.
while the reload happened due to configuration change from https://github.com/kubernetes/ingress-nginx/blob/main/internal/ingress/controller/controller.go#L213
It's race condition to me. Nginx read empty certificate (truncated when write the file from
ingress-nginx/internal/net/ssl/ssl.go
Line 183 in a031a08
err := os.WriteFile(pemFileName, []byte(sslCert.PemCertKey), file.ReadWriteByUser) |
NGINX Ingress controller version (exec into the pod and run /nginx-ingress-controller --version
):
/etc/nginx $ /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: v1.13.1
Build: c8ce0d146a53fbdb94848548068001909767e2de
Repository: https://github.com/kubernetes/ingress-nginx
nginx version: nginx/1.27.1
-------------------------------------------------------------------------------
Kubernetes version (use kubectl version
):
Server Version: version.Info{Major:"1", Minor:"32", GitVersion:"v1.32.7", GitCommit:"158eee9fac884b429a92465edd0d88a43f81de34", GitTreeState:"clean", BuildDate:"2025-07-15T18:00:33Z", GoVersion:"go1.23.10", Compiler:"gc", Platform:"linux/amd64"}
How to reproduce this issue:
It's hard to reproduce. We have applied same change to many clusters (above 200), only two had such issue.
Anything else we need to know:
Metadata
Metadata
Assignees
Labels
Type
Projects
Status