【问题标题】:Can't get kubernetes to pass my tls certificate to browsers无法让 kubernetes 将我的 tls 证书传递给浏览器
【发布时间】:2019-01-20 20:16:51
【问题描述】:

我一直在努力尝试让 HTTPS 访问我在 Kubernetes 中的 Elasticsearch 集群。

认为问题在于 Kubernetes 不喜欢我尝试使用的 TLS 证书,这就是为什么它没有将它一直传递给浏览器的原因。

其他一切似乎都有效,因为当我接受 Kubernetes 入口控制器假证书时,请求按预期通过。

在我尝试这样做时,我设置了:

  • 集群本身
  • 一个 nginx 入口控制器
  • 入口资源

这是相关的yaml:

  • 集群:

    apiVersion: v1
    kind: Service
    metadata:
        creationTimestamp: 2018-08-03T03:20:47Z
    labels:
        run: my-es
    name: my-es
    namespace: default
    resourceVersion: "3159488"
    selfLink: /api/v1/namespaces/default/services/my-es
    uid: 373047e0-96cc-11e8-932b-42010a800043
    spec:
        clusterIP: 10.63.241.39
    ports:
        - name: http
    port: 8080
    protocol: TCP
    targetPort: 9200
    selector:
        run: my-es
    sessionAffinity: None
    type: ClusterIP
    status:
        loadBalancer: {}
    
  • 入口资源

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
        annotations:kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, OPTIONS
    nginx.ingress.kubernetes.io/cors-origins: http://localhost:3425 https://mydomain.ca
        https://myOtherDomain.ca
            nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    creationTimestamp: 2018-08-12T08:44:29Z
    generation: 16
    name: es-ingress
    namespace: default
    resourceVersion: "3159625"
    selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/es-ingress
    uid: ece0071d-9e0b-11e8-8a45-42001a8000fc
    spec:
        rules:
            - http:
    paths:
        - backend:
    serviceName: my-es
    servicePort: 8080
    path: /
    tls:
        - hosts:
    - mydomain.ca
    secretName: my-tls-secret
    status:
        loadBalancer:
            ingress:
                - ip: 130.211.179.225
    
  • nginx 入口控制器:

    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: 2018-08-12T00:41:32Z
      labels:
        app: nginx-ingress
        chart: nginx-ingress-0.23.0
        component: controller
        heritage: Tiller
        release: nginx-ingress
      name: nginx-ingress-controller
      namespace: default
      resourceVersion: "2781955"
      selfLink: /api/v1/namespaces/default/services/nginx-ingress-controller
      uid: 755ee4b8-9dc8-11e8-85a4-4201a08000fc
    spec:
      clusterIP: 10.63.250.256
      externalTrafficPolicy: Cluster
      ports:
      - name: http
        nodePort: 32084
        port: 80
        protocol: TCP
        targetPort: http
      - name: https
        nodePort: 31182
        port: 443
        protocol: TCP
        targetPort: https
      selector:
        app: nginx-ingress
        component: controller
        release: nginx-ingress
      sessionAffinity: None
      type: LoadBalancer
    status:
      loadBalancer:
        ingress:
        - ip: 35.212.6.131
    

我觉得我遗漏了一些基本的东西,因为要暴露这么简单的东西似乎并不难......

为了获得我的证书,我刚刚向 godaddy 请求了一份用于 mydomain.ca 的证书。

我是否需要以某种方式使用我的入口资源的集群 IP 作为通用名称来获取证书?

似乎无法验证 IP 的所有权。

我看到有人提到 Kubernetes 自动为入口资源创建证书的方法,但这些似乎是自签名的。

以下是来自 nginx-controller 的一些日志:

这是一个带有 tls-secret 的 PEM,但这只是一个警告。

{
 insertId:  "1kvvhm7g1q7e0ej"
 labels: {
  compute.googleapis.com/resource_name:  "fluentd-gcp-v2.0.17-5b82n"
  container.googleapis.com/namespace_name:  "default"
  container.googleapis.com/pod_name:  "nginx-ingress-controller-58f57fc597-zl25s"
  container.googleapis.com/stream:  "stderr"
 }
 logName:  "projects/project-7d320/logs/nginx-ingress-controller"
 receiveTimestamp:  "2018-08-14T02:58:42.135388365Z"
 resource: {
  labels: {
   cluster_name:  "my-elasticsearch-cluster"
   container_name:  "nginx-ingress-controller"
   instance_id:  "2341889542400230234"
   namespace_id:  "default"
   pod_id:  "nginx-ingress-controller-58f57fc597-zl25s"
   project_id:  "project-7d320"
   zone:  "us-central1-a"
  }
  type:  "container"
 }
 severity:  "WARNING"
 textPayload:  "error obtaining PEM from secret default/my-tls-cert: error retrieving secret default/my-tls-cert: secret default/my-tls-cert was not found"
 timestamp:  "2018-08-14T02:58:37Z"
}

我有几次发生这种握手错误,这可能是上次警告的结果...

{
 insertId:  "148t6rfg1xmz978"
 labels: {
  compute.googleapis.com/resource_name:  "fluentd-gcp-v2.0.17-5b82n"
  container.googleapis.com/namespace_name:  "default"
  container.googleapis.com/pod_name:  "nginx-ingress-controller-58f57fc597-zl25s"
  container.googleapis.com/stream:  "stderr"
 }
 logName:  "projects/project-7d320/logs/nginx-ingress-controller"
 receiveTimestamp:  "2018-08-14T15:55:52.438035706Z"
 resource: {
  labels: {
   cluster_name:  "my-elasticsearch-cluster"
   container_name:  "nginx-ingress-controller"
   instance_id:  "2341889542400230234"
   namespace_id:  "default"
   pod_id:  "nginx-ingress-controller-58f57fc597-zl25s"
   project_id:  "project-7d320"
   zone:  "us-central1-a"
  }
  type:  "container"
 }
 severity:  "ERROR"
 textPayload:  "2018/08/14 15:55:50 [crit] 1548#1548: *860 SSL_do_handshake() failed (SSL: error:1417D18C:SSL routines:tls_process_client_hello:version too low) while SSL handshaking, client: 127.0.0.1, server: 0.0.0.0:442"
 timestamp:  "2018-08-14T15:55:50Z"
}

上面的日志看起来好像我的 tls secret 不起作用,但是当我运行 kubectl describe ingress 时,它说我的 secret 终止了。

aaronmw@project-7d320:~$ kubectl describe ing
Name:             es-ingress
Namespace:        default
Address:          130.221.179.212
Default backend:  default-http-backend:80 (10.61.3.7:8080)
TLS:
  my-tls-secret terminates mydomain.ca
Rules:
  Host  Path  Backends
  ----  ----  --------
  *
        /   my-es:8080 (<none>)
Annotations:
Events:  <none>

【问题讨论】:

  • 你检查过 pod 的日志,他们可能会告诉你什么没有正确加载。如果你能把这些贴在这里。
  • @Crou 感谢您的回复,添加了来自 nginx-controller 的日志。如果这些看起来不相关,请告诉我。

标签: ssl nginx kubernetes


【解决方案1】:

我想通了!

我最终做的是在创建时使用以下命令将默认 ssl 证书添加到我的 nginx-ingress 控制器

helm install --name nginx-ingress --set controller.extraArgs.default-ssl-certificate=default/search-tls-secret stable/nginx-ingress

获得该证书后,它按预期通过了证书,但我的证书仍然错误,因为 CN 与我的负载均衡器 IP 不匹配。

所以我做的是:

  • 使我的负载平衡器 IP 静态
  • 将 A 记录添加到我的域,以将子域映射到该 IP
  • 重新键入我的证书以匹配新的子域

我在做生意!

感谢@Crou,他的评论提醒我查看日志并让我走上正轨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2021-09-25
    • 2017-08-15
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多