Project Icon

kube-fledged

Kubernetes容器镜像缓存管理工具

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

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

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

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

目录

使用场景

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

前提条件

  • 一个正常运行的 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了解提交拉取请求的流程详情。

贡献者

行为准则

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

许可证

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

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

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

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号