kaniko-在k8s集群中构建容器镜像

简介: kaniko-在k8s集群中构建容器镜像

前言

通常情况下,我们在使用dockerfile构建镜像的时候要与Docker后台进程交互访问,也就是需要本机root权限。如果是在Docker后台进程无法暴露的场景下,生成容器镜像就变得很困难。kaniko是Google开源的一个工具,可以帮助开发及运维人员从容器或Kubernetes集群内的Dockerfile构建容器镜像,而无需访问Docker守护程序。这样,您可以在容器内执行构建作业,而无需授予对主机文件系统的任何访问权限,你只需要将构建清单创建为Kubernetes批处理作业,然后使用你选择的任何CI工具将其应用于集群。该工作负责构建映像并将其上传到指定的容器注册表。

kaniko的工作方式

1.读取指定的Dockerfile

2.将基本映像(在FROM指令中指定)提取到容器文件系统中。

3.在独立的Dockerfile中分别运行每个命令

4.每次运行后都会对用户空间文件系统的做快照。

5.每次运行时,将快照层附加到基础层。

kaniko工作原理


kaniko作为一个容器镜像运行,它接受三个参数:一个 Dockerfile ,一个构建上下文以及将镜像推送到的注册表。它在执行程序镜像中提取基本镜像的文件系统。然后,在Dockerfile中执行任何命令,快照用户空间中的文件系统。Kaniko在每个命令后都会将一层已更改的文件附加到基本镜像。最后,执行程序将新镜像推送到指定的注册表。由于Kaniko在执行程序镜像的用户空间中完全执行了这些操作,因此它完全避免了在用户计算机上需要任何特权访问。



使用kaniko

Kaniko解决了在Kubernetes构建的问题,但是构建的项目、目标 registry 的认证、Dockerfile的分发,还是需要我们自己考虑。

前提条件:

1.需要一个运行的 kubernetes 集群;

安装k8s集群可参考如下:

k8s1.18多master节点高可用集群安装-超详细中文官方文档

2.需要有一个用来存储dockerfile和kubernetes资源清单yaml文件的github仓库

3.需要有一个存储docker镜像的docker hub镜像仓库

创建一个容器注册表的secret

让我们从设置容器注册表secret开始。必须通过容器注册表进行身份验证才能推送生成的映像。

将需要以下内容:

docker-server—需要在其中托管映像的Docker注册表服务器。如果使用的是Docker Hub,请使用https://index.docker.io/v1/。
docker-username — Docker注册表用户名。
docker-password — Docker注册表密码。
docker-email —在Docker注册表上配置的电子邮件。

运行以下命令,替换上面的值:


kubectl create secret docker-registry regcred --docker-server=<docker-server> --docker-username=<username> --docker-password=<password> --docker-email=<email>

通过dockerfile构建一个镜像

cat dockerfile

FROM nginx
RUN echo 'This is version 3' > /usr/share/nginx/html/index.html

cat build.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: kaniko
spec:
  template:
    spec:
      containers:
      - name: kaniko
        image: gcr.io/kaniko-project/executor:latest
        args: ["--dockerfile=Dockerfile",
               "--context=git://github.com/bharatmicrosystems/kubernetes-kaniko-nginx.git#refs/heads/master",
               "--destination=bharamicrosystems/nginx:v3"]
        volumeMounts:
        - name: kaniko-secret
          mountPath: "/kaniko/.docker"
      restartPolicy: Never
      volumes:
      - name: kaniko-secret
        secret:
          secretName: regcred
          items:
          - key: .dockerconfigjson
            path: config.json

上面的资源清单build.yaml文件是一个Job控制器。清单使用gcr.io/kaniko-project/executor:latest镜像创建一个容器,并使用以下参数运行它:

  • docker-file — dockerfile的路径。
  • context — Docker上下文。在这种情况下,我们已经指出了我们的GitHub存储库
  • destination —用于推送构建映像的Docker存储库。


此外,它还会在/kaniko/.docker目录下安装docker config JSON文件以实现docker存储库的身份验证。上面我们已经定义过了。

cat nginx-deployment.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: web
  annotations:
    fluxcd.io/automated: "true"
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: bharamicrosystems/nginx:v3
        ports:
        - containerPort: 80

上面是通过deployment部署的nginx,使用的镜像bharamicrosystems/nginx:v3就是我们在build.yaml文件中构建的镜像,将NGINX容器暴露给外部负载均衡器。


cat nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: web
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: NodePort

使用Kaniko构建容器映像

    kubectl apply -f build.yaml

    验证是否部署成功

      kubectl get pod

      显示如下说明部署成功:

      NAME           READY   STATUS    RESTARTS   AGE
      kaniko-jztf6   1/1     Running   0          66s

      查看对应的pod日志,输出如下

        kubectl logs kaniko-jztf6 -f
        E0523 15:36:17.247145       1 aws_credentials.go:77] while getting AWS credentials NoCredentialProviders: no valid providers in chain. Deprecated.
                For verbose messaging see aws.Config.CredentialsChainVerboseErrors
        INFO[0001] Retrieving image manifest nginx
        INFO[0001] Retrieving image manifest nginx
        INFO[0002] Built cross stage deps: map[]
        INFO[0002] Retrieving image manifest nginx
        INFO[0002] Retrieving image manifest nginx
        INFO[0003] Executing 0 build triggers
        INFO[0003] Unpacking rootfs as cmd RUN echo 'This is version 3' > /usr/share/nginx/html/index.html requires it.
        INFO[0005] RUN echo 'This is version 3' > /usr/share/nginx/html/index.html
        INFO[0005] Taking snapshot of full filesystem...
        INFO[0007] Resolving 5400 paths
        INFO[0008] cmd: /bin/sh
        INFO[0008] args: [-c echo 'This is version 3' > /usr/share/nginx/html/index.html]
        INFO[0008] Running: [/bin/sh -c echo 'This is version 3' > /usr/share/nginx/html/index.html]
        INFO[0008] Taking snapshot of full filesystem...
        INFO[0008] Resolving 5400 paths
        nginx-service.yaml和nginx-deployment.yaml通过kubectl更新

        kubectl apply -f nginx-service.yaml

        kubectl apply -f nginx-service.yaml

        Kaniko一些构建参数

        与其他工具的比较

        与kaniko相似的工具包括imgorca-build。像kaniko一样,这两个工具都可以从Dockerfiles构建容器映像,但是具有不同的方法和安全性的取舍。img工具在容器中以非特权用户身份构建,而kaniko在容器中以非特权用户身份以root用户身份构建。orca-build工具通过包装runc来执行构建,该runc使用内核命名间隔技术执行RUN命令。通过在容器中以root用户身份执行命令,我们可以在kaniko中完成相同的任务。

        相关实践学习
        通过ACR快速部署网站应用
        本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
        深入解析Docker容器化技术
        Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
        相关文章
        |
        4月前
        |
        人工智能 算法 调度
        阿里云ACK托管集群Pro版共享GPU调度操作指南
        本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
        409 1
        |
        5月前
        |
        Kubernetes Devops 应用服务中间件
        基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
        本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
        598 1
        |
        4月前
        |
        弹性计算 监控 调度
        ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
        ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
        293 89
        |
        9月前
        |
        资源调度 Kubernetes 调度
        从单集群到多集群的快速无损转型:ACK One 多集群应用分发
        ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
        430 9
        |
        9月前
        |
        资源调度 Kubernetes 调度
        从单集群到多集群的快速无损转型:ACK One 多集群应用分发
        本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
        |
        5月前
        |
        存储 Kubernetes 网络安全
        关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
        本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
        617 2
        |
        11月前
        |
        存储 Kubernetes 监控
        K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
        总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
        1003 33
        |
        10月前
        |
        Kubernetes 调度 异构计算
        生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
        生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
        生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
        |
        10月前
        |
        数据采集 消息中间件 Kubernetes
        容器化爬虫部署:基于K8s的任务调度与自动扩缩容设计
        随着业务复杂度提升,传统定时任务和手工扩缩容难以满足高并发与实时性需求。本文对比两种基于 Kubernetes 的爬虫调度与扩缩容方案:CronJob+HPA 和 KEDA。从调度灵活性、扩缩容粒度、实现难度等维度分析,并提供 YAML+Python 示例。方案 A(CronJob+HPA)适合固定定时任务,配置简单;方案 B(KEDA)支持事件驱动,适合高并发与异步触发场景。根据实际需求可混合使用,优化资源利用与效率。
        360 4
        |
        11月前
        |
        存储 运维 Kubernetes
        容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
        阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。

        推荐镜像

        更多