pod 中不受信任的 k8s 签名证书
k8s-signed certificate not trusted within pod
我正在尝试为部署到 k8s 集群的应用程序整理证书(运行 在 docker-for-win,WSL2 在 Windows 10 20H2)。
我想使用 DNS 连接服务,例如registry.default.svc.cluster.local
,我已验证可访问。我按照以下步骤创建了证书:
- 创建一个
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
- 使用
openssl req -new -config openssl.conf -out wildcard.csr -keyout wildcard.key
创建 csr 和密钥文件
- 使用
创建了证书签名请求
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
- 批准请求:
kubectl certificate approve wildcard_csr
- 提取了 crt 文件:
kubectl get csr wildcard_csr -o jsonpath='{.status.certificate}' | base64 -d > wildcard.crt
- 已删除请求
kubectl delete csr wildcard_csr
。
然后我用 registry:2
图像启动了一个 pod,并将其配置为使用 wildcard.crt
和 wildcard.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-7g75m
( kubectl 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"
我正在尝试为部署到 k8s 集群的应用程序整理证书(运行 在 docker-for-win,WSL2 在 Windows 10 20H2)。
我想使用 DNS 连接服务,例如registry.default.svc.cluster.local
,我已验证可访问。我按照以下步骤创建了证书:
- 创建一个
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
- 使用
openssl req -new -config openssl.conf -out wildcard.csr -keyout wildcard.key
创建 csr 和密钥文件
- 使用 创建了证书签名请求
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
- 批准请求:
kubectl certificate approve wildcard_csr
- 提取了 crt 文件:
kubectl get csr wildcard_csr -o jsonpath='{.status.certificate}' | base64 -d > wildcard.crt
- 已删除请求
kubectl delete csr wildcard_csr
。
然后我用 registry:2
图像启动了一个 pod,并将其配置为使用 wildcard.crt
和 wildcard.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-7g75m
( kubectl 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"