Podman 具备 Docker API 兼容层。k3d 使用 Docker API,并且与 Podman v4 及更高版本兼容。
Podman 支持处于实验阶段
无法保证 k3d 能与 Podman 正常配合使用。如果你发现了问题,请帮忙提交一个问题报告。
经过测试的 Podman 版本:
- 客户端:Podman 引擎
- 版本:4.3.1
- API 版本:4.3.1
使用 Podman
1.确保 Podman 系统套接字可用
sudo systemctl enable --now podman.socket
# 或者在无守护进程模式下启动套接字
# sudo podman system service --time=0 &2.禁用 Podman 服务的超时设置
更多信息请参阅 podman-system-service (1) 手册页。
mkdir -p /etc/containers/containers.conf.d
echo 'service_timeout=0' > /etc/containers/containers.conf.d/timeout.conf3.让 k3d 指向正确的 Docker 套接字
方法一:创建符号链接
sudo ln -s /run/podman/podman.sock /var/run/docker.sock
# 或者,如果系统支持,安装 podman-docker
sudo k3d cluster create方法二:运行 k3d 时设置环境变量
export DOCKER_HOST=unix:///run/podman/podman.sock
export DOCKER_SOCK=/run/podman/podman.sock
sudo --preserve-env=DOCKER_HOST --preserve-env=DOCKER_SOCK k3d cluster create使用 cgroup(v2)
默认情况下,非根用户只能获得内存控制器(memory controller)和进程 ID 控制器(pids controller)的委托权限。
为了使系统正常运行,我们需要启用 CPU、CPU 集(CPUSET)和 I/O 委托权限。mkdir -p /etc/systemd/system/user@.service.d
cat > /etc/systemd/system/user@.service.d/delegate.conf <<EOF
[Service]
Delegate=cpu cpuset io memory pids
EOF
systemctl daemon-reload使用远程podman
在远程主机上启动Podman, 然后设置DOCKER_HOST并启动k3d:
export DOCKER_HOST=ssh://username@hostname
export DOCKER_SOCK=/run/user/1000/podman/podman.sock
k3d cluster create如果尚未初始化 Podman 机器,请进行初始化:
podman machine init或者启动已存在的 Podman 机器:
podman machine start获取连接详细信息:
podman system connection ls输出示例:
Name URI Identity Default
podman-machine-default ssh://core@localhost:53685/run/user/501/podman/podman.sock /Users/myusername/.ssh/podman-machine-default true
podman-machine-default-root ssh://root@localhost:53685/run/podman/podman.sock /Users/myusername/.ssh/podman-machine-default false编辑你的 OpenSSH 配置文件以指定身份文件:
vim ~/.ssh/config在配置文件中添加如下内容:
Host localhost
IdentityFile /Users/myusername/.ssh/podman-machine-default无特权模式
将 cpuset 控制组(cgroup)控制器委托给用户的 systemd 切片,为非 root 用户连接导出上述引用的 Docker 环境变量,然后创建集群:
podman machine ssh bash -e <<EOF
printf '[Service]\nDelegate=cpuset\n' | sudo tee /etc/systemd/system/user@.service.d/k3d.conf
sudo systemctl daemon-reload
sudo systemctl restart "user@\${UID}"
EOF
export DOCKER_HOST=ssh://core@localhost:53685
export DOCKER_SOCKET=/run/user/501/podman/podman.sock
k3d cluster create --k3s-arg '--kubelet-arg=feature-gates=KubeletInUserNamespace=true@server:*'有特权模式
为 root 用户连接导出上述引用的 Docker 环境变量,然后创建集群:
export DOCKER_HOST=ssh://root@localhost:53685
export DOCKER_SOCK=/run/podman/podman.sock
k3d cluster createPodman 网络
默认的 Podman 网络禁用了 DNS 功能。为了让 k3d 集群节点能够与 DNS 进行通信,必须创建一个新的网络。
podman network create k3d
podman network inspect k3d -f '{{ .DNSEnabled }}'
true创建本地镜像仓库
由于 Podman 没有默认的 “桥接” 网络,因此在创建本地镜像仓库时,必须使用 --default-network 标志指定一个网络:
k3d registry create --default-network podman mycluster-registry要让集群使用这个镜像仓库,需传递 --registry-use 标志:
k3d cluster create --registry-use mycluster-registry mycluster--registry-create 存在兼容性问题
由于 --registry-create 假定默认网络为 “桥接” 网络,因此在使用 Podman 时应避免使用 --registry-create。相反,在创建集群之前,始终要先创建一个镜像仓库。
cpuset 控制组(cgroup)控制器缺失
如果你遇到有关 cpuset 控制组控制器缺失的错误,请通过运行 systemctl --user stop xdg-document-portal.service 来确保用户单元 xdg-document-portal.service 已被禁用。请参考此问题。