【发布时间】: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