利用Serverless Kubernetes和Kaniko快速自动化构建容器镜像

前言:

在云原生时代中,容器镜像是一切应用分发的基础载体,除了dockerhub做为流行的镜像仓库外,各大公有云厂商也都提供了功能丰富镜像仓库服务,如ACR(Aliyun Container Registry), GCR(Goolge Container Registry),构建容器镜像已经是全部开发者必须掌握的基础实践能力。docker

不管开发者选择在本地使用docker完成基本的镜像构建,仍是使用CI/CD服务(如Jenkins),本质上都是遵循“pull -> build -> push”的过程,完成镜像的构建、分发和同步等操做。shell

本文介绍了一种新的面向开发者的简单镜像构建实践,基于阿里云Serverless Kubernetes容器服务,能够自动化并且低成本的构建容器镜像,以便让开发者了解如何使用Serverless运行CI/CD和自动化任务。json

why serverless kubernetes?

容器镜像的构建是须要计算资源的,开发者在本地使用docker pull/build/push时,其计算资源是本地开发机器,若是开发者在传统kubernetes集群中部署Jenkins或Gitlab-runner服务,其计算资源也是须要持续运行。可是,容器镜像的构建基本属于高度动态的行为,每每是定时或者条件触发引发的操做,因此为了动态的构建操做而维护一个固定的计算资源池对成本是不利的。api

Serverless Kubernetes不一样与传统基于节点的k8s集群,serverless集群中只有pod运行时才会收费,意味着只有在构建镜像时用户才须要付费,当构建结束时,也就中止计费。因此在成本上与传统k8s集群或ecs部署的方式相比显著减小。app

Kaniko

在Serverless Kubernetes集群中,pod没有privileged权限,没法访问主机上的docker daemon,也就没法使用docker in docker方案进行镜像的操做,那么如何在kubernetes集群中不依赖宿主机的Docker状况下构建镜像呢?显然这是一个通用需求,社区也有了推荐的方案:kaniko。less

kaniko的工做原理与docker build相似,可是不依赖docker daemon,在pod中完成Dockfile各层的解析和build,这使得pod不须要privileged权限也能够完成镜像的pull/build/push。测试

实践示例:定时同步容器镜像

下面让咱们使用Serverless Kubernetes和Kaniko实现一个简单的镜像build实验:定时同步镜像到国内ACR。ui

步骤1: 建立Serverless Kubernetes集群

登录容器服务控制台, 5s便可完成Serverless集群建立。(若是是国外的源镜像仓库,能够选择美西区域)google

步骤2: 建立secret,配置ACR的用户名密码,用于推送镜像到ACR

可登录cloudshell操做以下命令。阿里云

#docker login registry.cn-hangzhou.aliyuncs.com
...
#kubectl create secret generic regsecret --from-file=/root/.docker/config.json
...

步骤3: 建立定时任务CronJob

在控制台选择模版建立以下定时任务,每小时同步busybox镜像到ACR。

apiVersion: v1
kind: ConfigMap
metadata:
  name: dockerfile-cm
data:
  Dockerfile: |
    FROM busybox:latest
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: kaniko-builder
spec:
  schedule: "*/60 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: builder
            image: gcr.io/kaniko-project/executor:latest
            imagePullPolicy: Always
            args:
            - "--dockerfile=/configs/Dockerfile"
            - "--destination=registry.cn-hangzhou.aliyuncs.com/jovizhangwei/busybox:latest"
            volumeMounts:
            - name: dockerfile
              readOnly: true
              mountPath: "/configs/"
            - name: secrets
              readOnly: true
              mountPath: "/root/.docker/"
          volumes:
          - name: dockerfile
            configMap:
              name: dockerfile-cm
          - name: secrets
            secret:
              secretName: regsecret
          restartPolicy: OnFailure

待job执行后,可查看ACR镜像仓库,确认镜像已同步。

用户能够按照需求定制此模版文件,好比修改须要同步的镜像,添加build步骤等,也能够设置pod的资源限制(vcpu 0.25/0.5/1等), 以最小的计算成本完成同步任务。

结束

经过上面的示例,咱们看到基于Serverless Kubernetes的按需付费特性,可使用很低的成本运行一些定时和CI/CD任务,而不用维护一个固定的计算资源池,其一样适用于压力测试、数据计算、工做流处理等其余场景。

Happy Hacking!

更多参考信息

  1. Serverless Kubernetes快速部署jenkins环境及执行流水线构建: https://yq.aliyun.com/articles/685219
  2. kaniko intro:https://cloud.google.com/blog/products/gcp/introducing-kaniko-build-container-images-in-kubernetes-and-google-container-builder-even-without-root-access

原文连接

相关文章
相关标签/搜索