高级配置
podman

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.conf

3.让 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 create

Podman 网络

默认的 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 已被禁用。请参考此问题。