如何在不修改 HTTP 客户端的情况下允许 API 访问 GKE K8S 集群
How can I allow API access to a GKE K8S cluster without modifying the HTTP client
我在 GKE 上搭建了一个 k8s 集群。
我想通过 k8s REST API 控制它(因此,查看 pods 上的部署等等,但不访问 k8s 集群上的实际 运行 SSL)。我已经获得了适当的不记名令牌(curl --insecure [request]
有效)并且可以发出 API 请求。但是,SSL 证书对我的客户端无效(如果重要的话,它是 java)。我现在不能轻易修改客户端以接受新的根证书。
我一直在四处挖掘并检查了以下三个选项:
- 将集群的根 CA 证书合并到我的客户端中已经存在的另一个证书链(根据我对 TLS 的有限理解,我不确定这是否可能)。
- 替换集群根 CA 证书(这样我就可以使用我的客户端在其密钥库中的东西)。 This implies you can do this with vanilla k8s, but this 表示您不能使用 GKE:"An internal Google service manages root keys for this CA, which are non-exportable."
- 允许 k8s API 在没有 TLS 的情况下访问。我在 the docs 中没有看到任何关于此的信息,这非常明确地表明 k8s API 通过网络访问必须使用 TLS
有这些可行的选择吗?或者是我修改客户端的最佳选择?
有一篇文章名为 "Access Clusters Using the Kubernetes API" (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/) that addresses your concerns about how to query the REST API using a Java Client (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#java-client)
如果您在 POD 中使用 Java 应用程序,您可以将集群的 CA 导入到 Java Trust Store (https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html). The CA certificate of for your cluster is inside all pods running within your cluster on /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
directory. More information in (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#without-using-a-proxy)
关于您的问题:
1.- 将您集群的 CA 证书导入您的信任库。
2.-您不能在GKE中设置自己的CA,但如果需要可以轮换CA证书(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation)
3.- 您无法在 GKE 中停用 TLS 通信 (https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-trust)
您最好的选择是使用官方 Java 客户端或将 CA 添加到您当前的开发中。
根据其他一些反馈(在 slack 中),我最终在我的 GKE 集群和我的客户端之间放置了一个代理。然后我可以将 GKE 集群 k8s ca 证书添加到代理的密钥库(而不必修改客户端)。出于我的目的,我不需要让代理使用 SSL,但对于生产我会。
我在 GKE 上搭建了一个 k8s 集群。
我想通过 k8s REST API 控制它(因此,查看 pods 上的部署等等,但不访问 k8s 集群上的实际 运行 SSL)。我已经获得了适当的不记名令牌(curl --insecure [request]
有效)并且可以发出 API 请求。但是,SSL 证书对我的客户端无效(如果重要的话,它是 java)。我现在不能轻易修改客户端以接受新的根证书。
我一直在四处挖掘并检查了以下三个选项:
- 将集群的根 CA 证书合并到我的客户端中已经存在的另一个证书链(根据我对 TLS 的有限理解,我不确定这是否可能)。
- 替换集群根 CA 证书(这样我就可以使用我的客户端在其密钥库中的东西)。 This implies you can do this with vanilla k8s, but this 表示您不能使用 GKE:"An internal Google service manages root keys for this CA, which are non-exportable."
- 允许 k8s API 在没有 TLS 的情况下访问。我在 the docs 中没有看到任何关于此的信息,这非常明确地表明 k8s API 通过网络访问必须使用 TLS
有这些可行的选择吗?或者是我修改客户端的最佳选择?
有一篇文章名为 "Access Clusters Using the Kubernetes API" (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/) that addresses your concerns about how to query the REST API using a Java Client (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#java-client)
如果您在 POD 中使用 Java 应用程序,您可以将集群的 CA 导入到 Java Trust Store (https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html). The CA certificate of for your cluster is inside all pods running within your cluster on /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
directory. More information in (https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#without-using-a-proxy)
关于您的问题:
1.- 将您集群的 CA 证书导入您的信任库。
2.-您不能在GKE中设置自己的CA,但如果需要可以轮换CA证书(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation)
3.- 您无法在 GKE 中停用 TLS 通信 (https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-trust)
您最好的选择是使用官方 Java 客户端或将 CA 添加到您当前的开发中。
根据其他一些反馈(在 slack 中),我最终在我的 GKE 集群和我的客户端之间放置了一个代理。然后我可以将 GKE 集群 k8s ca 证书添加到代理的密钥库(而不必修改客户端)。出于我的目的,我不需要让代理使用 SSL,但对于生产我会。