陈少文
发布于:2021-04-02    本文总阅读量:

DevOps 流水线如何去除 Docker 依赖

前言

在 1.20 版本之后, Kubernetes 社区放弃了对 Docker 的支持, 但并不是说未来 Docker 将无法使用。本文主要是针对非 Docker 驱动的 Kubernetes 集群下,给出一个可行的 CI/CD 方案。如果你对非 Docker 环境下进行 CI/CD 也有需求,欢迎一起讨论方案。

阅读本文需要一些基础,这些包括:

  • 熟悉 KubeSphere Devops,能独立阅读文档进行自定义配置
  • 熟练使用流水线功能

不建议刚接触 DevOps 的人阅读本文。由于这种变更对用户影响较大,后面的版本中,希望能达成统一的实践,再集成到产品中,预期会支持 Containerd、cri-o、Kind 等。

测试环境描述

安装非 Docker 集群可以参考文档 ,执行如下命令, 查看 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"}

执行如下命令, 查看 containerd 版本:

containerd --version

containerd github.com/containerd/containerd v1.4.3 269548fa27e0089a8b8278fc4

去除 KubeSphere DevOps 对 Docker 的依赖

主要有两点:

  • Docker Volumes
  • docker.sock

下面主要针对这两个依赖进行配置。请参考文档对 CasC 进行修改。

如上图,以 Maven 为例,主要有三点需要修改:

  • 添加特权模式启动
  • 将 docker.sock 挂载,改为 /var/lib/containers
  • 将缓存路径改为主机绝对路径

最后别忘了重启 Jenkins 或重新加载配置。

流水线改造

这里主要用于测试,因此没有将 Podman 安装到基础镜像中,而是在流水线中实时安装。生产环境,应该提前安装,以加快执行速度。

devops-java-sample 为例,流水线中主要需要增加如下部分:

        stage ('install podman') {
            steps {
                container ('maven') {
                    sh '''
                    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
                    mv  /usr/bin/docker /usr/bin/docker_ce
                    ln -s /usr/bin/podman /usr/bin/docker
                    '''
                }
            }
        }

相关脚本,已经更新到 Podman 分支中。

测试 devops-java-sample 项目

使用 devops-java-sample 创建 SCM 流水线,Jenkinsfile 路径设置为 Jenkinsfile-online,并配置好相关的秘钥值。

最后执行时,在 Podman 分支上可以看到如下日志:

在 DockerHub 上可以查看到推送的镜像:

在 KubeSphere 中可以看到项目部署成功:

总结

本文主要提供了一种在非 Docker 驱动的 Kubernetes 集群中,进行 CI/CD 镜像构建的思路,使用 Podman 替换 Docker。选择 Podman 的原因是, 其使用方式更贴近 Docker,而 Buildah 需要用户修改镜像编译指令,因为 Buildah 使用的是 buildah bud。

扩展阅读