[Kubernetes]Nginx Ingressを経由してPodにアクセスすると「502 Bad Gateway」が出てしまう

KubernetesのNginx Ingressを経由してPodにアクセスすると「502 Bad Gateway」が出てしまう。Nginx Ingressより内部のClusterIPからは正常にアクセスできます。

エラー内容

次のようにNginx Ingressを経由してPodにアクセスすると「502 Bad Gateway」が出てしまいます。

Nginx Ingressで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

コメント

コメントを残す

マークダウン形式でコメントを入力できます。

アップロードファイルの最大サイズ: 512 MB。 画像, 音声, 動画, 文書, スプレッドシート, 対話型, テキスト, アーカイブ, コード, その他 をアップロードできます。 Youtube、Facebook、Twitter および他サービスへのリンクは自動的にコメント内に埋め込まれます。 ここにファイルをドロップ

プロフィール背景
Ryosuke
Ryosuke

ITエンジニア & 講師

クラウドネイティブやアーキテクチャ設計の講師として活動しながら、ITエンジニアのDXを推進するために新しい技術やベストプラクティスを常に学び、エンジニアの生産性と開発品質の向上に貢献することを目指しています。猫5匹飼っています。山奥のポツンと一軒家に住んでいて、事務所は海の近くです。