带gke tcp负载平衡器和TLS证书的nginx入口

时间:2018-08-04 23:39:06

标签: ssl nginx kubernetes

我正在使用nginx-ingress控制器在GKE上运行集群,而不是使用默认的gce入口控制器。

我正在使用cert-manager生成证书。如果我使用默认的gce控制器,则可以正常工作。

我已经使用以下配置部署了nginx-ingress控制器:

containers:
  - args:
    - /nginx-ingress-controller
    - --default-backend-service=kube-system/nginx-ingress-default-backend
    - --publish-service=kube-system/nginx-ingress-controller
    - --election-id=ingress-controller-leader
    - --ingress-class=nginx
    - --configmap=kube-system/nginx-ingress-controller
    - --sort-backends=true

此服务使用默认服务type=LoadBalancer,我可以在Google Cloud控制台中看到已为我配置了TCP 4负载均衡器。

我的前端服务和入口具有以下注释:

annotations:
  ingress.kubernetes.io/allow-http: "true"
  kubernetes.io/ingress.class: nginx
  ingress.kubernetes.io/ssl-redirect: "true"
  kubernetes.io/tls-acme: "true"

HTTP可以正常工作,但是当我尝试HTTPS时,我收到SSL协议错误:

* Rebuilt URL to: https://hostname/
*   Trying xx.xxx.xx.xxx...
* TCP_NODELAY set
* Connected to guestbook.lbrlabs.com (xx.xxx.xx.xxx) port 443 (#0)
* Unknown SSL protocol error in connection to hostname:-9847
* Closing connection 0
curl: (35) Unknown SSL protocol error in connection to hostname:-9847

我可以在日志中看到什么是二进制数据:

10.36.0.1 - [10.36.0.1] - - [04/Aug/2018:23:37:23 +0000] "\x16\x03\x01\x00\xC8\x01\x00\x00\xC4\x03\x03[f8\xB4J\xFD\xB6\x1C9\x93\xA9\xF6$\x82\x1B~h" 400 174 "-" "-" 0 0.051 [] - - - -

我在这里缺少什么配置选项?我尝试使用代理协议,但这没用(正如我预期的那样)。我正在使用nginx-ingress-controller的0.14.0

1 个答案:

答案 0 :(得分:0)

如果您将整个入口Yaml放在帖子中会很有帮助,但是从第一个视图来看,如果您是通过Ingress创建TLS证书,那么我认为您会错过注释中的issuer,因为cert-manager会检查该注释来发布证书。检查以下内容:

kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/issuer: letsencrypt-prod
    ...
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: backend-service
          servicePort: http
        path: /
  tls:
  - hosts:
    - example.com
    secretName: example-com-tls

您还可以描述自己的入口以查看事件:

kubectl describe ingress <ingress-name>

如果不是这种情况,那么您可以通过以下方法对证书进行故障排除:

kubectl get certs # To see the status of certificates
kubectl describe cert # If it is issued successfully

您还可以检查cert-manager控制器的日志,证书的颁发方式。

kubectl logs cert-manager-pod-name-21322 -n cert-manager

希望有帮助!