在Pod内部,k8s签名证书未被信任。

3

我正在尝试为部署到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创建CSR和密钥文件。
  2. 创建证书签名请求。
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组件)?


k8s传递自己的证书给容器的假设只是部分正确的。你要找的CA证书是/var/run/secrets/kubernetes.io/serviceaccount/ca.crt。尝试使用它来验证注册表,如果可以的话,请告诉我。 - Matt
那个证书似乎是我需要的那一个。我该如何使它变得可信任? - stefan
你可以将它复制到/etc/ssl/certs/目录下,并运行update-ca-certificates命令。 - Matt
这是每个 pod 都要这样做的严肃方式吗? - stefan
@Matt,难道没有办法在yaml中进行配置吗? - stefan
恐怕这是唯一的方法来完成这个任务。Kubernetes通常不会与容器集成,你可以在yaml中进行的修改非常有限。顺便说一下,你提到了:“在另一个pod中,我尝试将其推送到该注册表,但出现了错误” - 是否无法通过某个标志或配置文件将此ca文件传递给应用程序?我相信这通常是如何完成的。 - Matt
1个回答

3
我发现只需通过yaml文件更改就能实现这个目标:在我的机器上(不确定多普遍),CA证书在服务帐户令牌秘密" default-token-7g75m "中可用(使用kubectl describe secrets查找名称,查找类型为 kubernetes.io/service-account-token的秘密,其中包含一个条目ca.crt)。
因此,要信任此证书,请添加一个
name: "kube-certificate"
secret:
  secretName: "default-token-7g75m"

对于需要证书的 pod,需要添加一个 volumeMount

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接