pod 中不受信任的 k8s 签名证书

k8s-signed certificate not trusted within pod

我正在尝试为部署到 k8s 集群的应用程序整理证书(运行 在 docker-for-win,WSL2 在 Windows 10 20H2)。

我想使用 DNS 连接服务,例如registry.default.svc.cluster.local,我已验证可访问。我按照以下步骤创建了证书:

  1. 创建一个 openssl.conf 内容
[ req ]
default_bits = 2048
prompt = no
encrypt_key = no
distinguished_name = req_dn
req_extensions = req_ext

[ req_dn ]
CN = *.default.svc.cluster.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = *.default.svc.cluster.local
  1. 使用 openssl req -new -config openssl.conf -out wildcard.csr -keyout wildcard.key
  2. 创建 csr 和密钥文件
  3. 使用
  4. 创建了证书签名请求
cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: wildcard_csr
spec:
  groups:
  - system:authenticated
  request: $(cat wildcard.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
  1. 批准请求:kubectl certificate approve wildcard_csr
  2. 提取了 crt 文件:kubectl get csr wildcard_csr -o jsonpath='{.status.certificate}' | base64 -d > wildcard.crt
  3. 已删除请求 kubectl delete csr wildcard_csr

然后我用 registry:2 图像启动了一个 pod,并将其配置为使用 wildcard.crtwildcard.key 文件。

在另一个 pod 中,我尝试推送到该注册表,但出现错误

Error response from daemon: Get https://registry.default.svc.cluster.local:2100/v2/: x509: certificate signed by unknown authority

看来在 pod 中,k8s CA 不受信任。我对这个观察是否正确?如果是这样,我怎样才能让 k8s 信任自己(毕竟,它是一个 k8s 组件签署了证书)?

我找到了一种仅通过更改 yaml 来实现此目的的方法:在我的机器上(不确定它有多普遍),CA 证书在服务帐户令牌秘密中可用 default-token-7g75mkubectl describe secrets 要找出名称,请查找包含条目 ca.crt) 的类型 kubernetes.io/service-account-token 的秘密。

因此要信任此证书,请添加 volume

name: "kube-certificate"
secret:
  secretName: "default-token-7g75m"

并向需要证书的 pod 添加 volumeMount

name: "kube-certificate"
mountPath: "/etc/ssl/certs/kube-ca.crt",
subPath: "ca.crt"