在原生K3s集群中部署Docker-in-Docker(Dind)的问题求助
我在基于RHEL8的K3s集群Pod中尝试使用Docker-in-Docker(Dind)时遇到了问题。这个K3s集群是通过脚本curl -sfL https://get.k3s.io | sh -安装的,系统里没装Docker和Podman。
相关版本信息:
k3s -v k3s version v1.25.4+k3s1 (0dc63334) go version go1.19.3
系统信息:
Operating System: Red Hat Enterprise Linux 8.8 (Ootpa) CPE OS Name: cpe:/o:redhat:enterprise_linux:8::baseos Kernel: Linux 4.18.0-477.13.1.el8_8.x86_64 Architecture: x86-64
我想把/run/k3s/containerd/containerd.sock暴露给Dind容器(替代Docker环境下的/var/run/docker.sock),但不知道去哪找连接containerd所需的TLS证书。
1. 理清containerd的默认配置逻辑
默认情况下,K3s自带的containerd不启用TLS认证,它的Unix域套接字通信是本地访问模式,根本不需要TLS证书。你可能混淆了Docker的TLS配置逻辑,containerd在这里的机制完全不同。
2. 直接挂载socket并配置客户端使用
在Pod配置里,直接把宿主机的/run/k3s/containerd/containerd.sock挂载到容器内的/run/containerd/containerd.sock,然后通过以下方式调用:
- 使用containerd原生工具
ctr:ctr --address /run/containerd/containerd.sock images ls - 用Docker CLI连接containerd:设置环境变量
export DOCKER_HOST=unix:///run/containerd/containerd.sock,之后就能用docker命令直接操作
3. 非必要场景:手动启用containerd TLS认证
如果你的业务场景必须启用TLS,需要修改K3s的containerd配置:
- 找到默认配置文件路径:
/var/lib/rancher/k3s/agent/etc/containerd/config.toml - 添加TLS相关配置片段:
[grpc] address = "tcp://0.0.0.0:你的containerd端口" tls_config = { cert_file = "/自定义路径/server.crt", key_file = "/自定义路径/server.key", ca_file = "/自定义路径/ca.crt" }
- 用
openssl自行生成CA和服务器证书,重启K3s服务:systemctl restart k3s
4. Dind容器的适配提醒
Dind本身是用来运行独立Docker daemon的,如果你只是想让容器内工具调用宿主机containerd,完全不需要Dind——直接挂载socket、安装对应工具就行。如果必须用Dind,要给容器加privileged权限,同时调整Dind配置,让它连接宿主机的containerd而非启动自身的Docker daemon。
内容的提问来源于stack exchange,提问作者Ralf Waldvogel

