【问题标题】:SSL passthrough not being configured for ingress-nginx backend没有为 ingress-nginx 后端配置 SSL 直通
【发布时间】:2020-05-09 16:41:54
【问题描述】:

我正在通过 helm 在 minikube 中运行 nginx 入口控制器,通过查看 nginx 入口控制器 pod 的日志,我可以看到控制器中启用了 SSL 直通。

helm upgrade ingress stable/nginx-ingress --install --namespace kube-system --set "controller.extraArgs.annotations-prefix=nginx.ingress.kubernetes.io" --set "controller.extraArgs.enable-ssl-passthrough=" --set controller.hostNetwork=true

在内部,我在端口 19000 上公开了一个 HTTPS REST API 服务。我希望客户端和在 k8s 内运行的服务之间进行双向 TLS,所以我尝试配置我的入口并启用 SSL 直通但是当我设置 nginx .ingress.kubernetes.io/ssl-passthrough 注释到我的入口上的“true”,后端仍然显示 sslPassthrough 设置为 false,当我向服务发送请求时,nginx 正在剥离我的请求中的 TLS 证书。

我是否缺少一些配置来在后端启用 SSL 直通?

$ kubectl ingress-nginx --deployment ingress-nginx-ingress-controller -n kube-system backends
[
  {
    "name": "default-tlsapi-service-19000",
    "service": {
      "metadata": {
        "creationTimestamp": null
      },
      "spec": {
        "ports": [
          {
            "protocol": "TCP",
            "port": 19000,
            "targetPort": 19000,
            "nodePort": 30000
          }
        ],
        "selector": {
          "app": "tlsapi"
        },
        "clusterIP": "10.96.218.188",
        "type": "NodePort",
        "sessionAffinity": "None",
        "externalTrafficPolicy": "Cluster"
      },
      "status": {
        "loadBalancer": {}
      }
    },
    "port": 19000,
    "sslPassthrough": false,
    "endpoints": [
      {
        "address": "172.17.0.7",
        "port": "19000"
      }
    ],
    "sessionAffinityConfig": {
      "name": "",
      "mode": "",
      "cookieSessionAffinity": {
        "name": ""
      }
    },
    "upstreamHashByConfig": {
      "upstream-hash-by-subset-size": 3
    },
    "noServer": false,
    "trafficShapingPolicy": {
      "weight": 0,
      "header": "",
      "headerValue": "",
      "cookie": ""
    }
  }

ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: tlsapi-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  rules:
  - host: tlsapi.k8s
  - http:
      paths:
      - path: /
        backend:
          serviceName: tlsapi-service
          servicePort: 19000

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tlsapi-service
spec:
  type: NodePort
  selector:
    app: tlsapi
  ports:
    - port: 19000
      targetPort: 19000
      nodePort: 30000

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tlsapi-deployment
spec:
  selector:
    matchLabels:
      app: tlsapi
  replicas: 1
  template:
    metadata:
      name: tlsapi-pod
      labels:
        app: tlsapi
    spec:
      containers:
      - name: tlsapi-container
        image: tlsapi:latest
        imagePullPolicy: IfNotPresent

【问题讨论】:

    标签: ssl nginx kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    你需要启动带有标志--enable-ssl-passthrough的nginx入口控制器

    您可以在 nginx 入口控制器部署 yaml 的 args 部分提供此标志

    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:master
          args:
            - --enable-ssl-passthrough
    

    您可以通过查看 nginx 入口控制器日志并搜索 Starting TLS proxy for SSL Passthrough 来确认该参数已生效。

    【讨论】:

    • 您好,该标志已提供。我可以通过查看日志并查看以下行来确认 nginx 正在运行 SSL 直通:nginx.go:750] 为 SSL 直通启动 TLS 代理
    • 您能否提供更多详细信息,说明您是从哪里获得正在运行以检查后端的命令?
    • 它来自 ingress-nginx kubectl 插件,请参阅:kubernetes.github.io/ingress-nginx/kubectl-plugin/#backends 是否有另一种查看/更改后端配置的方法?也许通过执行到正在运行的 nginx-controller 容器中
    • 这对我有用。非常感谢@ArghyaSadhu
    【解决方案2】:

    原来问题出在我的入口定义上。我需要从 http 键前面删除 - :

    工作 ingress.yaml sn-p

    spec:
      rules:
      - host: tlsapi.k8s
        http:
          paths:
          - path: /
            backend:
              serviceName: tlsapi-service
              servicePort: 19000
    

    不工作 ingress.yaml sn-p

    spec:
      rules:
      - host: tlsapi.k8s
      - http:
          paths:
          - path: /
            backend:
              serviceName: tlsapi-service
              servicePort: 19000
    

    yaml转json的话,单个字符的区别就更明显了!

    删除字符后,SSL 直通按预期工作

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 2019-07-29
      • 2017-02-07
      • 2020-11-06
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多