KubernetesのNginx Ingressを経由してPodにアクセスすると「502 Bad Gateway」が出てしまう。Nginx Ingressより内部のClusterIPからは正常にアクセスできます。
エラー内容
次のようにNginx Ingressを経由してPodにアクセスすると「502 Bad Gateway」が出てしまいます。
Nginx Ingressのログには次のように出力されています。SSLのハンドシェイクでエラーが発生しているようです。
2023/11/08 16:47:13 [error] 8136#8136: *151653717 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: xxx.xxx.xxx.xxx, server: xxx.xxxx.com, request: "GET / HTTP/2.0", upstream: "https://10.42.2.84:3000/", host: "xxx.xxxx.com"
環境
- Kubernetes v1.24.9
- Nginx Ingress v1.4.0
マニフェストは次のようになっています。
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: someapp
namespace: someapp
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
cert-manager.io/cluster-issuer: "someapp-cluster-issuer"
spec:
ingressClassName: nginx
tls:
- hosts:
- someapp.xxxx.com
secretName: someapp--secret
rules:
- host: someapp.xxxx.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: someapp-clusterip
port:
number: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: someapp-clusterip
namespace: someapp
labels:
app: someapp
spec:
type: ClusterIP
ports:
- name: "someapp-port"
protocol: "TCP"
port: 80
targetPort: 80
selector:
app: someapp
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: someapp
namespace: someapp
spec:
replicas: 3
selector:
matchLabels:
app: someapp
template:
metadata:
labels:
app: someapp
spec:
containers:
- name: someapp
image: xxxxx/sampapp:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 80
原因
今回Deployment(Pod)で動かしているアプリケーションがTLSをサポートしていないため、上記のようなエラーがでます。
対応
Ingressのマニフェストにて、nginx.ingress.kubernetes.io/backend-protocol
を削除します。これにより、IngressのバックエンドとなるPodへのアクセスはHTTPで行われるようになります。
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: someapp
namespace: someapp
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" cert-manager.io/cluster-issuer: "someapp-cluster-issuer"
spec:
ingressClassName: nginx
tls:
- hosts:
- someapp.xxxx.com
secretName: someapp--secret
rules:
- host: someapp.xxxx.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: someapp-clusterip
port:
number: 80
参考
https://serverfault.com/questions/1041667/ingress-returns-502-tls-backend-communication-issue
https://qiita.com/toritori0318/items/f15b4e165e7170c5055b