首页 > 其他分享 >kubesphere流水线使用kaniko在容器中构建镜像

kubesphere流水线使用kaniko在容器中构建镜像

时间:2023-04-15 15:34:45浏览次数:48  
标签:INFO name kubesphere kaniko 构建 流水线 镜像 dockerfile

kubesphere流水线使用kaniko在容器中构建镜像

Kaniko - 更安全可靠的方式在Kubernetes内构建容器镜像

kaniko是一个在容器或Kubernetes内从Dockerfile构建容器镜像的工具。

kaniko不依赖Docker守护进程,完全在用户空间执行Docker文件中的每个命令。这使得在不能轻易或安全地运行Docker守护进程的环境中构建容器镜像,例如标准的Kubernetes集群。

kaniko是要作为一个镜像来运行:gcr.io/kaniko-project/executor。我们不建议在其他镜像中运行kaniko二进制文件,因为可能无法工作。

Kaniko是如何工作的?

kaniko executor(执行器)镜像负责从 Dockerfile 构建镜像并将其推送到registry。在执行器镜像中,我们提取了基础镜像的文件系统(Dockerfile 中的 FROM 镜像)。 然后我们执行 Dockerfile 中的命令,在每个命令之后在用户空间中对文件系统进行快照。 在每个命令之后,我们将一层更改的文件附加到基础图像(如果有的话)并更新镜像元数据。

已知问题(Known Issues)

  • kaniko不支持构建Windows容器
  • 不支持在官方kaniko镜像以外的任何Docker镜像中运行kaniko(即YMMV)。
    • 这包括将官方镜像中的kaniko可执行文件复制到另一个镜像中。
  • kaniko不支持v1版registry API(Registry v1 API 已弃用)。

教程

本教程适用于想要开始使用 kaniko 的初学者,旨在建立一个快速入门的测试例子。

前提(Prerequisities)

  • kubernetes(k8s)
  • dockerhub账户,用于push创建的public镜像

准备Dockerfile

SSH进入k8s集群,并创建一个本地目录,该目录将被挂载到kaniko容器作为构建环境。在那里创建一个简单的dockerfile。

$ mkdir kaniko && cd kaniko
$ echo 'FROM ubuntu' >> dockerfile
$ echo 'ENTRYPOINT ["/bin/bash", "-c", "echo hello"]' >> dockerfile
$ cat dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
$ pwd
/home/<user-name>/kaniko # 将此路径复制到 volume.yaml 文件中

注意:volume.yaml中的hostPath需要替换为你创建的本地目录。

volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: dockerfile
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  hostPath:
    path: <local-directory> # 替换你的本地目录

volume-claim.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: dockerfile-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: local-storage
© 2022 GitHub, Inc.
Terms
Privacy

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: kubebiz/kaniko:executor-v1.9.1
    args: ["--dockerfile=/workspace/dockerfile",
            "--context=dir://workspace",
            "--destination=<user-name>/<repo>"] # 你的dockerhub账户
    volumeMounts:
      - name: kaniko-secret
        mountPath: /kaniko/.docker
      - name: dockerfile-storage
        mountPath: /workspace
  restartPolicy: Never
  volumes:
    - name: kaniko-secret
      secret:
        secretName: regcred
        items:
          - key: .dockerconfigjson
            path: config.json
    - name: dockerfile-storage
      persistentVolumeClaim:
        claimName: dockerfile-claim

创建一个包含你的授权token的Secret

Kubernetes集群使用docker-registry类型的Secret来验证docker registry,用于推送镜像。

此 Secret,将其命名为 regcred:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
  • <your-registry-server> 是你的私有 Docker Registry FQDN。
  • <your-name> 是你的 Docker 用户名。
  • <your-pword> 是你的 Docker 密码。
  • <your-email> 是你的 Docker 电子邮件。

这个 secret 将在 pod.yaml 配置中使用。

在 Kubernetes 中创建资源

# 创建持久卷
$ kubectl create -f volume.yaml
persistentvolume/dockerfile created

# 创建持久卷声明
$ kubectl create -f volume-claim.yaml
persistentvolumeclaim/dockerfile-claim created

# 检查卷是否正确安装
$ kubectl get pv dockerfile
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS    REASON   AGE
dockerfile   10Gi       RWO            Retain           Bound    default/dockerfile-claim   local-storage            1m

# 创建pod
$ kubectl create -f pod.yaml
pod/kaniko created
$ kubectl get pods
NAME     READY   STATUS              RESTARTS   AGE
kaniko   0/1     ContainerCreating   0          7s

# 检查构建是否完成并显示构建日志
$ kubectl get pods
NAME     READY   STATUS      RESTARTS   AGE
kaniko   0/1     Completed   0          34s
$ kubectl logs kaniko
➜ kubectl logs kaniko
INFO[0000] Resolved base name ubuntu to ubuntu
INFO[0000] Resolved base name ubuntu to ubuntu
INFO[0000] Downloading base image ubuntu
INFO[0000] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory
INFO[0000] Downloading base image ubuntu
INFO[0001] Built cross stage deps: map[]
INFO[0001] Downloading base image ubuntu
INFO[0001] Error while retrieving image from cache: getting file info: stat /cache/sha256:1bbdea4846231d91cce6c7ff3907d26fca444fd6b7e3c282b90c7fe4251f9f86: no such file or directory
INFO[0001] Downloading base image ubuntu
INFO[0001] Skipping unpacking as no commands require it.
INFO[0001] Taking snapshot of full filesystem...
INFO[0001] ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

注意:pod.yaml 中的 destination 需要替换为你自己的。

拉取镜像并测试

如果符合预期,kaniko 将成功构建镜像并推送到 dockerhub。 拉取镜像到本地运行测试:

$ sudo docker run -it <user-name>/<repo-name>
Unable to find image 'debuggy/helloworld:latest' locally
latest: Pulling from debuggy/helloworld
5667fdb72017: Pull complete
d83811f270d5: Pull complete
ee671aafb583: Pull complete
7fc152dfb3a6: Pull complete
Digest: sha256:2707d17754ea99ce0cf15d84a7282ae746a44ff90928c2064755ee3b35c1057b
Status: Downloaded newer image for debuggy/helloworld:latest
hello

以上内容引用站点:Kaniko中文教程 https://www.orchome.com/kaniko/index

在kubesphere流水线中已job的方式运行kaniko构建镜像

cat <<EOF>$jobname-kaniko.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: $jobname-kaniko
  namespace: kubesphere-devops-worker
spec:
  backoffLimit: 5
  ttlSecondsAfterFinished: 10  # job任务执行完成后自动删除时间,单位秒
  activeDeadlineSeconds: 300
  template:
    spec:
      containers:
      - name: jobname-kaniko
        image: registry.cn-beijing.aliyuncs.com/pgy-k8s/kaniko:v1.9.2
        args: ["--dockerfile=/workspace/$jobname/dockerfile",  # dockerfile文件位置
                "--context=dir://$jobname",  #构建上下文,(注意:不能全路径,只能是dockerfile所在目录的名称)
                "--destination=myregster.com/$env/$jobname:$tag"]  #构建镜像以及上传
        volumeMounts:  # 挂载dockerfile以及构建需要的文件到容器中
          - name: kaniko-secret
            mountPath: /kaniko/.docker
          - name: dockerfile-storage
            mountPath: /workspace
      restartPolicy: Never
      volumes:
        - name: kaniko-secret  # 挂载镜像仓库密钥配置
          secret:
            secretName: regcred
            items:
              - key: .dockerconfigjson
                path: config.json
        - name: dockerfile-storage
          persistentVolumeClaim:
            claimName: jenkins-kaniko
EOF

标签:INFO,name,kubesphere,kaniko,构建,流水线,镜像,dockerfile
From: https://www.cnblogs.com/pgyLang/p/17321223.html

相关文章

  • 时间片 线程切换 指令周期 流水线 TPS的初步了解
    时间片线程切换指令周期流水线TPS的初步了解情况说明Redis单线程提供服务,可以支撑十万级别的TPS通过以个非常简单的测试redis-benchmark-c50-n50000pingIntel8369HB3.3Ghz14万TPS阿里倚天7102.7Ghz16万TPSAMD9T343.4Ghz22万TPS可......
  • KubeSphere——KubeSphere集群构建实战
    摘要KubeSphere愿景是打造一个以Kubernetes为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。一、安装环境准备如需在Kubernetes上安装KubeSphere3.2.1,......
  • KubeSphere——使用deployment文件部署实战(3)
    摘要如果没有KubeSphere可视化界面,同样也能保持部署的能力。因此使用deployment文件来部署的相关应用。Deployment对象,顾名思义,是用于部署应用的对象。它使Kubernetes中最常用的一个对象,它为ReplicaSet和Pod的创建提供了一种声明式的定义方法,从而无需像前两篇文章中那样手动创建Rep......
  • 【送猫超卡、阿里云代金券】动手体验 SAE+云效 10 分钟快速打通 CI/CD 流水线
    作者:ServerlessServerless应用引擎SAE是阿里云推出的一款全托管、免运维、高弹性的通用PaaS平台。SAE提供了无门槛的容器化、主流微服务和Job任务的全托管,以及多语言监控的能力,对用户来说,是一款技术门槛更低、迁移改造更简单的Serverless平台。通过本实验,将带大家亲......
  • 计算机流水线在正常程序中的体现(效果可视)
    众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑 但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的 首先我先声明一下需要的基础,需要懂16位以及32......
  • SAE+云效,10分钟快速打通CI/CD流水线
    本实验将带大家亲手在10分钟内从0开始搭建一套CI/CD流水线,体验自动化发布的神奇之处。摒弃传统应用构建部署流程中的繁琐步骤和各种旁路系统,通过阿里云SAE+云效的组合可以......
  • 深度学习之路二 将上一篇的逻辑流水线变成稍微通用的模型
    importnumpyasnpclassNeuralNetwork:def__init__(self,input_size,output_size):self.input_size=input_sizeself.output_size=outp......
  • KubeSphere Cloud 月刊|灾备支持 K8s 1.22+,轻量集群支持安装灾备和巡检组件
    功能升级备份容灾服务支持K8sv1.22+版本集群随着Kubernetes近一年频繁的发版、升级,越来越多的用户开始部署并使用高版本的Kubernetes集群。备份容灾服务支持Kube......
  • 计算机组成与设计 硬件软件接口 第五版 流水线部分笔记
    啊TODO1:为什么果壳不在IDU阶段读出寄存器?而要在后端?是跟超标量、乱序有关系吗?TODO2:修改PC难道比修改其它寄存器更快吗?TODO3:长流水线有什么缺点? TODO4:需要两......
  • 使用流水线插件实现持续集成、持续部署
    流水线插件是基于Rainbond插件体系扩展实现,通过插件化的方式,可以实现对Rainbond构建体系的扩展。该插件由社区合作伙伴拓维信息参与开发并贡献,底层是基于GitLabC......