在 CICD 场景下, 我们经常需要在流水线中构建和推送镜像。
在之前的文档 《在 Kubernetes 上动态创建 Jenkins Slave》[1] 中, 我描述了通过挂载 /var/run/docker.sock 文件, 允许在 Docker 驱动的 Kubernetes 集群中构建和推送镜像。在文档 《如何在 Docker 中使用 Docker》[2]中, 我又进行了更加详细地阐述, 其原理是共享主机 Docker Daemon。
在 1.20 版本之后, Kubernetes 社区放弃了对 Docker 的支持, 而后又有其他社区接手, 隐约给 Docker 蒙上了一层阴影。在这样的背景下, 我们开始考虑非 Docker 环境下, 如何进行 CICD 实践。
非 Docker 环境意味着之前挂载 /var/run/docker.sock 的方式失效了, 我们需要寻找新的解决方案。
2. 测试集群环境
2.1 Kubernetes - 1.17.9
执行如下命令, 查看 Kubernetes 版本:
-
kubectl version
-
-
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.9", GitCommit:"4fb7ed12476d57b8437ada90b4f93b17ffaeed99", GitTreeState:"clean", BuildDate:"2020-07-15T16:18:16Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
-
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.9", GitCommit:"4fb7ed12476d57b8437ada90b4f93b17ffaeed99", GitTreeState:"clean", BuildDate:"2020-07-15T16:10:45Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
2.2 Containerd - 1.4.3
执行如下命令, 查看 containerd 版本:
-
containerd
-
-
containerd github.com/containerd/containerd v1.4.3 269548fa27e0089a8b8278fc4fc781d7f65a939b
3. 镜像管理工具 Podman
由于 Containerd 不支持 Docker API, 常见的 docker build、docker push 等命令在 Containerd 环境下无法使用。因此, 需要一种不依赖于 Docker, 针对 OCI 标准的镜像构建和推送工具。
3.1 Podman 简介
Podman 是一个实现 OCI 标准的容器和镜像管理工具, 同时也是 Daemonless, 不需要守护进程, 也支持非特权用户使用。Podman 提供了类似 Docker CLI 的功能, 大部分情况下可以执行 alias docker=podman 使用 Podman 替换 Docker , 而不会有任何问题。
3.2 Podman 安装
安装方法可以参考 Podman 的安装指引[3]。这里以 CentOS 7 为例:
-
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo
-
yum -y install podman
-
podman
-
-
podman version 3.0.1
这里为了方便查阅, 贴出完整的帮助文档。
-
podman
-
manage pods and images
-
-
Usage:
-
podman [flags]
-
podman [command]
-
-
Available Commands:
-
attach Attach to a running container
-
build Build an image using instructions from Containerfiles
-
commit Create new image based on the changed container
-
container Manage Containers
-
cp Copy files/folders between a container and the local filesystem
-
create Create but do not start a container
-
diff Inspect changes on container's file systems
-
events Show podman events
-
exec Run a process in a running container
-
export Export container's filesystem contents as a tar archive
-
generate Generated structured data
-
healthcheck Manage Healthcheck
-
help Help about any command
-
history Show history of a specified image
-
image Manage images
-
images List images in local storage
-
import Import a tarball to create a filesystem image
-
info Display podman system information
-
init Initialize one or more containers
-
inspect Display the configuration of a container or image
-
kill Kill one or more running containers with a specific signal
-
load Load an image from container archive
-
login Login to a container registry
-
logout Logout of a container registry
-
logs Fetch the logs of a container
-
mount Mount a working container's root filesystem
-
network Manage Networks
-
pause Pause all the processes in one or more containers
-
play Play a pod
-
pod Manage pods
-
port List port mappings or a specific mapping for the container
-
ps List containers
-
pull Pull an image from a registry
-
push Push an image to a specified destination
-
restart Restart one or more containers
-
rm Remove one or more containers
-
rmi Removes one or more images from local storage
-
run Run a command in a new container
-
save Save image to an archive
-
search Search registry for image
-
start Start one or more containers
-
stats Display a live stream of container resource usage statistics
-
stop Stop one or more containers
-
system Manage podman
-
tag Add an additional name to a local image
-
top Display the running processes of a container
-
umount Unmounts working container's root filesystem
-
unpause Unpause the processes in one or more containers
-
unshare Run a command in a modified user namespace
-
varlink Run varlink interface
-
version Display the Podman Version Information
-
volume Manage volumes
-
wait Block on one or more containers
-
-
Flags:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-v,
-
-
Use "podman [command] --help" for more information about a command.
Podman 在覆盖 Docker 命令的同时,增加了对 Pod 操作的支持。
(编辑:上饶站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|