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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 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中完成相同的任务。

        相关实践学习
        通过容器镜像仓库与容器服务快速部署spring-hello应用
        本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
        Kubernetes极速入门
        Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
        相关文章
        |
        1月前
        |
        供应链 监控 安全
        对话|企业如何构建更完善的容器供应链安全防护体系
        随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
        150315 32
        |
        1月前
        |
        存储 运维 Kubernetes
        正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
        飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
        正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
        |
        29天前
        |
        存储 监控 对象存储
        ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
        针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
        117 21
        |
        1月前
        |
        存储 监控 对象存储
        ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
        介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
        |
        1月前
        |
        供应链 监控 安全
        对话|企业如何构建更完善的容器供应链安全防护体系
        本期节目围绕软件供应链安全、容器安全的主要挑战以及阿里云如何帮助用户等维度展开了深入的讨论。
        |
        1月前
        |
        缓存 容灾 网络协议
        ACK One多集群网关:实现高效容灾方案
        ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
        |
        1月前
        |
        Kubernetes Linux 虚拟化
        入门级容器技术解析:Docker和K8s的区别与关系
        本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
        209 11
        |
        2月前
        |
        Kubernetes Ubuntu 网络安全
        ubuntu使用kubeadm搭建k8s集群
        通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
        148 12
        |
        1月前
        |
        人工智能 运维 监控
        容器服务Kubernetes场景下可观测体系生产级最佳实践
        阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
        |
        6天前
        |
        Ubuntu API 网络虚拟化
        ubuntu22 编译安装docker,和docker容器方式安装 deepseek
        本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
        131 15