我找到了各种关于如何添加证书以供 pod 本身使用的演练,但似乎找不到有关如何设置 Kubernetes 以允许自签名证书从集群内运行的 Harbor 实例中提取图像的信息。我已将 ca 证书导入系统的受信任证书(系统运行的是 Ubuntu 18.04),但我猜 Kubernetes 在某处使用它自己的受信任证书存储,类似于 Java 忽略系统的受信任证书并依赖密钥库文件的方式?
编辑 更具体地说,我试图部署一个存储在我的 Kubernetes 集群中运行的 Harbor 实例中的自定义 Docker 镜像。我已将 Harbor 的证书导入到我的主机系统操作系统中,并且可以运行:
docker login <url_to_harbor>
docker pull <url_to_harbor>/library/custom/image:latest
它在 CLI 中运行良好,但如果我尝试创建如下部署 yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: custom-deployment
spec:
replicas: 1
selector:
matchLabels:
app: custom
template:
metadata:
labels:
app: custom
spec:
containers:
- name: custom
image: <url_to_harbor>/library/custom/image:latest
...
并运行kubectl apply -f custom-deploy.yaml
时,我得到以下错误:
custom-deployment-6ff68947f6-8jj2p 0/1 ImagePullBackOff 0 13s
如果我得到了有关失败的 Pod 的描述,我会看到:
Warning Failed 18s kubelet, node3 Failed to pull image "<url_to_harbor>/library/custom/image:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://<url_to_harbor>/v2/: x509: certificate signed by unknown authority
Warning Failed 18s kubelet, node3 Error: ErrImagePull
自从我导入 CA 证书后,我重启了主机。我通过将根 CA 证书文件移入/usr/local/share/ca-certificates
然后运行来添加证书sudo update-ca-certificates
。
答案1
导入 CA 证书的方法是正确的,但你必须在每个集群节点上执行此操作:所有主节点和工作节点。Kubernetes 仅依赖于安装在底层操作系统上的 CA。
答案2
如果您不想在每个节点上安装 CA 证书,也可以运行 DaemonSet 来配置 ca 证书。请注意,这仅在 Kubernetes 配置了 containerd 运行时时才有效。
apiVersion: v1
kind: ConfigMap
metadata:
name: trusted-ca
namespace: kube-system
data:
ca.crt: |+
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
---
apiVersion: v1
kind: ConfigMap
metadata:
name: setup-script
namespace: kube-system
data:
setup.sh: |
echo "$TRUSTED_CERT" > /usr/local/share/ca-certificates/ca.crt && update-ca-certificates && systemctl restart containerd
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
namespace: kube-system
name: node-custom-setup
labels:
k8s-app: node-custom-setup
spec:
selector:
matchLabels:
k8s-app: node-custom-setup
template:
metadata:
labels:
k8s-app: node-custom-setup
spec:
hostPID: true
hostNetwork: true
initContainers:
- name: init-node
command: ["nsenter"]
args: ["--mount=/proc/1/ns/mnt", "--", "sh", "-c", "$(SETUP_SCRIPT)"]
image: debian
env:
- name: TRUSTED_CERT
valueFrom:
configMapKeyRef:
name: trusted-ca
key: ca.crt
- name: SETUP_SCRIPT
valueFrom:
configMapKeyRef:
name: setup-script
key: setup.sh
securityContext:
privileged: true
containers:
- name: wait
image: k8s.gcr.io/pause:3.1
来源:http://hypernephelist.com/2021/03/23/kubernetes-containerd-certificate.html
这些说明是在在 cri 中实现主机注册表目录在 containerd 1.5 中,因此如果运行新版本,可能无需重启即可进行配置。请参阅注册表配置 - 介绍。
最后,如果您在云管理集群上运行,他们可能会提供用于管理 CA 证书的自定义配置。例如,AKS-自定义 CA