kube-fledged

kube-fledged

Kubernetes容器镜像缓存管理工具

kube-fledged是一个Kubernetes操作符,用于在集群工作节点上管理容器镜像缓存。它允许定义镜像列表和缓存位置,加速应用容器启动。通过API接口管理缓存生命周期,支持多种配置选项。适用于需快速扩展的应用、Serverless函数、边缘计算等场景,可提高容器启动速度和集群性能。

Kubernetes容器镜像缓存自定义资源kubefledged-controllerImageCacheGithub开源项目
<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/3e90b887-cd9e-4b8f-8bb8-e060a383a6ba.png">

构建状态 覆盖率状态 Go 报告卡 GitHub 发布 (最新日期) 许可证

kube-fledged 是一个 Kubernetes 操作器,用于在 Kubernetes 集群的工作节点上直接创建和管理容器镜像缓存。它允许用户定义一个镜像列表,并指定这些镜像应该缓存(即拉取)到哪些工作节点上。因此,应用程序 Pod 几乎可以立即启动,因为不需要从镜像仓库拉取镜像。

kube-fledged 提供 CRUD API 来管理镜像缓存的生命周期,并支持多个可配置参数以根据需求自定义功能。

目录

<!-- https://github.com/thlorenz/doctoc --> <!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> <!-- END doctoc generated TOC please keep comment here to allow auto update -->

使用场景

  • 需要快速启动和/或扩展的应用程序。例如,执行实时数据处理的应用程序需要由于数据量激增而快速扩展。
  • 无服务器函数通常需要对传入事件立即做出反应,并在几分之一秒内启动容器。
  • 在边缘设备上运行的物联网应用程序,需要容忍边缘设备和镜像仓库之间的间歇性网络连接。
  • 如果需要从私有仓库拉取镜像,但不能授予所有人从该仓库拉取镜像的权限,那么可以将镜像放置在集群的节点上。
  • 如果集群管理员或操作员需要为应用程序部署升级,并希望事先验证新镜像是否能够成功拉取。

前提条件

  • 一个正常运行的 Kubernetes 集群。可以是像 minikube 这样的简单开发集群,也可以是大型生产集群。
  • 对 Kubernetes 集群具有集群管理员权限,以便部署 kube-fledged。
  • 所有主节点和工作节点都有 ["kubernetes.io/hostname"] 标签。
  • 对于 kube-fledged 的开发,您需要在本地 Linux 或 Mac 机器上安装 git、make、go、docker 引擎 (>= 19.03)、openssl、kubectl、helm、gpg 和 gnu-sed。kubectl 需正确配置以访问集群。
  • 对于 kube-fledged 的部署,您需要在本地 Linux 或 Mac 机器上安装 git、make、helm 和 kubectl。kubectl 需正确配置以访问集群。

使用 YAML 清单快速安装

这些说明使用 YAML 清单和 Docker Hub 中的预构建镜像,将 kube-fledged 安装到名为 "kube-fledged" 的单独命名空间中。

  • 克隆源代码仓库

    $ git clone https://github.com/senthilrch/kube-fledged.git $HOME/kube-fledged
    $ cd $HOME/kube-fledged
    
  • 将 kube-fledged 部署到集群

    $ make deploy-using-yaml
    
  • 验证 kube-fledged 是否成功部署

    $ kubectl get pods -n kube-fledged -l app=kubefledged
    $ kubectl get imagecaches -n kube-fledged (输出应为:'未找到资源')
    

使用 Helm chart 快速安装

  • 创建将安装 kube-fledged 的命名空间

    $ export KUBEFLEDGED_NAMESPACE=kube-fledged
    $ kubectl create namespace ${KUBEFLEDGED_NAMESPACE}
    
  • 验证并安装最新版本的 kube-fledged helm chart

    $ helm repo add kubefledged-charts https://senthilrch.github.io/kubefledged-charts/
    $ helm repo update
    $ gpg --keyserver keyserver.ubuntu.com --recv-keys 92D793FA3A6460ED (或) gpg --keyserver pgp.mit.edu --recv-keys 92D793FA3A6460ED
    $ gpg --export >~/.gnupg/pubring.gpg
    $ helm install --verify kube-fledged kubefledged-charts/kube-fledged -n ${KUBEFLEDGED_NAMESPACE} --wait
    

使用 Helm operator 快速安装

这些说明使用 Helm operator 和 Docker Hub 中的预构建镜像,将 kube-fledged 安装到名为 "kube-fledged" 的单独命名空间中。

  • 克隆源代码仓库

    $ git clone https://github.com/senthilrch/kube-fledged.git $HOME/kube-fledged
    $ cd $HOME/kube-fledged
    
  • 将 helm operator 和 kube-fledged 部署到 "kube-fledged" 命名空间。如果需要部署到不同的命名空间,请导出变量 KUBEFLEDGED_NAMESPACE

    $ make deploy-using-operator
    
  • 验证 kube-fledged 是否成功部署

    $ kubectl get pods -n kube-fledged -l app.kubernetes.io/name=kube-fledged
    $ kubectl get imagecaches -n kube-fledged (输出应为:'未找到资源')
    

Helm chart 参数

Helm chart 的参数在这里有文档说明

构建和部署

这些说明将帮助您从源代码构建 kube-fledged 并将其部署到名为 "kube-fledged" 的单独命名空间。如果需要部署到不同的命名空间,请相应编辑 "kube-fledged/deploy" 中清单的命名空间字段。

构建

  • 克隆源代码仓库

    $ git clone https://github.com/senthilrch/kube-fledged.git $HOME/kube-fledged
    $ cd $HOME/kube-fledged
    
  • 如果您在代理后面,请导出以下环境变量(大写)

    export HTTP_PROXY=http://proxy_ip_or_hostname:port
    export HTTPS_PROXY=https://proxy_ip_or_hostname:port
    
  • 构建并将 docker 镜像推送到注册表(例如 Docker hub)

    $ export RELEASE_VERSION=<你的标签>
    $ export CONTROLLER_IMAGE_REPO=docker.io/<你的dockerhub用户名>/kubefledged-controller
    $ export WEBHOOK_SERVER_IMAGE_REPO=docker.io/<你的dockerhub用户名>/kubefledged-webhook-server
    $ export CRI_CLIENT_IMAGE_REPO=docker.io/<你的dockerhub用户名>/kubefledged-cri-client
    $ export OPERATOR_IMAGE_REPO=docker.io/<你的dockerhub用户名>/kubefledged-operator
    $ docker login -u <用户名> -p <密码>
    $ export DOCKER_CLI_EXPERIMENTAL=enabled
    $ make install-buildx && make release-amd64
    

部署

注意:部署需要 'cluster-admin' 权限

  • 部署 kube-fledged 所需的所有清单文件都位于 'kube-fledged/deploy' 目录中。

  • 编辑 "kubefledged-deployment-controller.yaml"。

    将 "image" 设置为 "<your_docker_hub_username>/kubefledged-controller:<your_tag>"

    image: <your_docker_hub_username>/kubefledged-controller:<your_tag>
    
  • 如果你将镜像推送到私有仓库,请在 "kubefledged-deployment-controller.yaml" 的末尾添加 'imagePullSecrets'。参考 Kubernetes 文档中的 在 Pod 上指定 ImagePullSecrets。密钥 <your_registry_key> 应在 "kube-fledged" 命名空间中创建。

    serviceAccountName: kubefledged
    imagePullSecrets:
      - name: <your_registry_key>
    
  • 编辑 "kubefledged-deployment-webhook-server.yaml"。

    将 "image" 设置为 "<your_docker_hub_username>/kubefledged-webhook-server:<your_tag>"

    image: <your_docker_hub_username>/kubefledged-webhook-server:<your_tag>
    
  • kube-fledged 部署到集群

    $ make deploy-using-yaml
    
  • 验证 kube-fledged 是否成功部署

    $ kubectl get pods -n kube-fledged -l app=kubefledged
    $ kubectl logs -f <pod_name_obtained_from_above_command> -n kube-fledged
    $ kubectl get imagecaches -n kube-fledged (输出应为:'No resources found')
    

如何使用

kube-fledged 提供了对镜像缓存执行 CRUD 操作的 API。这些 API 可以通过 kubectl 或 curl 使用。

创建镜像缓存

参考 "deploy/kubefledged-imagecache.yaml" 中的示例镜像缓存清单。在创建镜像缓存之前,根据需要进行编辑。如果镜像在需要凭证才能拉取的私有仓库中,请在末尾添加 "imagePullSecrets"。

  imagePullSecrets:
  - name: myregistrykey

使用 kubectl 创建镜像缓存。验证是否成功创建

$ kubectl create -f deploy/kubefledged-imagecache.yaml
$ kubectl get imagecaches -n kube-fledged

查看镜像缓存状态

使用以下命令以 "json" 格式查看镜像缓存状态。

$ kubectl get imagecaches imagecache1 -n kube-fledged -o json

在镜像缓存中添加/删除镜像

使用 kubectl edit 命令在镜像缓存中添加/删除镜像。编辑命令会在编辑器中打开清单文件。编辑更改,保存并退出。

$ kubectl edit imagecaches imagecache1 -n kube-fledged
$ kubectl get imagecaches imagecache1 -n kube-fledged -o json

刷新镜像缓存

kube-fledged 支持自动和按需刷新镜像缓存。可以使用 --image-cache-refresh-frequency: 标志启用自动刷新。要请求按需刷新,请运行以下命令:

$ kubectl annotate imagecaches imagecache1 -n kube-fledged kubefledged.io/refresh-imagecache=

删除镜像缓存

在删除镜像缓存之前,你需要使用以下命令清除缓存中的镜像。这将从工作节点中删除所有缓存的镜像。

$ kubectl annotate imagecaches imagecache1 -n kube-fledged kubefledged.io/purge-imagecache=

查看清除镜像缓存的状态。如果有任何失败,应手动删除这些镜像,或者你可以决定将这些镜像留在工作节点中。

$ kubectl get imagecaches imagecache1 -n kube-fledged -o json

最后使用以下命令删除镜像缓存。

$ kubectl delete imagecaches imagecache1 -n kube-fledged

删除 kube-fledged

运行以下命令从集群中删除 kube-fledged

$ make remove-kubefledged (如果你使用 YAML 清单部署)
$ helm delete kube-fledged -n ${KUBEFLEDGED_NAMESPACE} (如果你使用 Helm chart 部署)
$ make remove-kubefledged-and-operator (如果你使用 Helm Operator 部署)

工作原理

Kubernetes 允许开发人员通过自定义资源扩展 Kubernetes API。kube-fledged 定义了一个 "ImageCache" 类型的自定义资源,并实现了一个自定义控制器(名为 kubefledged-controller)。kubefledged-controller 负责管理镜像缓存的繁重工作。用户可以使用 kubectl 命令创建和删除 ImageCache 资源。 kubefledged-controller 内置了一个负责拉取和删除镜像的镜像管理器例程。镜像的拉取或删除是通过 Kubernetes 作业完成的。如果启用,镜像缓存会由刷新工作器定期刷新。kubefledged-controller 在 ImageCache 资源的状态字段中更新镜像拉取、刷新和删除的状态。

有关更详细的描述,请查阅 kube-fledged设计方案

Kubefledged 控制器的配置标志

--cri-socket-path: 节点上 CRI 套接字的路径,例如 /run/containerd/containerd.sock(默认值:/var/run/docker.sock, /run/containerd/containerd.sock, /var/run/crio/crio.sock)

--image-cache-refresh-frequency: 镜像缓存定期刷新以确保缓存是最新的。将此标志设置为"0s"将禁用刷新。默认值"15m"

--image-delete-job-host-network: 镜像删除作业的 Pod 是否应以'HostNetwork: true'运行。默认值:false

--image-pull-deadline-duration: 允许拉取镜像的最长时间。超过此时间,镜像拉取将被视为失败。默认值"5m"

--image-pull-policy: 将镜像拉取到缓存并刷新缓存的镜像拉取策略。可能的值为'IfNotPresent'和'Always'。默认值为'IfNotPresent'。没有标签或标签为":latest"的镜像始终会被拉取。

--job-priority-class-name: kubefledged-controller 创建的作业的 priorityClassName。

--job-retention-policy: 决定 kubefledged-controller 创建的作业在完成后是删除还是保留(用于调试)。可能的值为'delete'和'retain'。默认值为'delete'。

--service-account-name: 用于拉取或删除镜像的作业中使用的 serviceAccountName。可选标志。如果未指定,则使用命名空间的默认服务账户。

--stderrthreshold: 日志级别。将此标志的值设置为 INFO

支持的容器运行时

  • docker
  • containerd
  • cri-o

支持的平台

  • linux/amd64
  • linux/arm
  • linux/arm64

构建工具

  • kubernetes/sample-controller - 使用 CRD 构建我们自己的 Kubernetes 风格控制器。
  • kubebuilder - 使用 CRD 构建 Kubernetes API 的 SDK
  • operator-sdk - 构建 Kubernetes 应用程序的 SDK
  • cri-tools - Kubelet 容器运行时接口(CRI)的 CLI 和验证工具。
  • buildx - 使用 BuildKit 扩展构建功能的 Docker CLI 插件
  • Go Modules - Go 模块用于依赖管理
  • Make - GNU Make

博客和演示

致谢

贡献

请阅读CONTRIBUTING.md了解提交拉取请求的流程详情。

贡献者

<a href="https://github.com/senthilrch/kube-fledged/graphs/contributors"> <img src="https://contrib.rocks/image?repo=senthilrch/kube-fledged" /> </a>

行为准则

请阅读CODE_OF_CONDUCT.md了解我们的行为准则详情,以及如何报告违规行为。

许可证

本项目采用Apache 2.0许可证 - 详情请参阅LICENSE文件。

编辑推荐精选

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

下拉加载更多