首页 > 解决方案 > 如何让 K8s `ca.crt` 和 `ca.key` 在服务提供商(GKE)上运行 K8s

问题描述

注意:我不是在 Minikube 或其他东西上本地运行,而是 GKE - 但可以是任何提供者。

我希望能够使用 openssl 在 K8s 中创建用户/上下文:

openssl x509 -req -in juan.csr -CA CA_LOCATION/ca.crt -CAKey CA_LOCATION/ca.key -CAcreateserial -out juan.crt -days 500

如何获得 K8sca.crtca.key? - 我找到了这个ca.crt,但这是方式并且仍然缺少 ca.key?

kubectl get secret -o jsonpath="{.items[?(@.type==\"kubernetes.io/service-account-token\")].data['ca\.crt']}" | base64 --decode

而且,除了登录主节点之外/etc/kubernetes/pki/.

标签: kubernetesgoogle-kubernetes-engine

解决方案


你没有。Google 不会按照文档公开密钥。

具体来说,我引用:

内部 Google 服务管理此 CA 的根密钥,这些密钥是不可导出的。此服务接受证书签名请求,包括来自每个 GKE 集群中 kubelet 的请求。即使集群中的 API 服务器被入侵,CA 也不会被入侵,因此不会影响其他集群。

使用 Kubernetes v1.19 及更高版本,您可以使用此处引用的 Kubernetes API 本身签署您的 CSR 。

编码您的 CSR $ ENCODED=$(cat mia.csr | base64 | tr -d "\n")

然后发布到k8s:

$ cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: mia
spec:
  request: $ENCODED
  signerName: kubernetes.io/kube-apiserver-client
  #expirationSeconds: 86400  # Only supported on >=1.22
  usages:
  - client auth
EOF

然后批准 CSR:

$ kubectl certificate approve mia
certificatesigningrequest.certificates.k8s.io/mia approved

然后下载签名证书:

kubectl get csr mia -o jsonpath='{.status.certificate}'| base64 -d > mia.crt

我在这里写了一个端到端流程的例子。


推荐阅读