kube-fledged 是一个 Kubernetes 操作器,用于在 Kubernetes 集群的工作节点上直接创建和管理容器镜像缓存。它允许用户定义一个镜像列表,并指定这些镜像应该缓存(即拉取)到哪些工作节点上。因此,应用程序 Pod 几乎可以立即启动,因为不需要从镜像仓库拉取镜像。
kube-fledged 提供 CRUD API 来管理镜像缓存的生命周期,并支持多个可配置参数以根据需求自定义功能。
目录
- 使用场景
- 前提条件
- 使用 YAML 清单快速安装
- 使用 Helm 图表快速安装
- 使用 Helm 操作器快速安装
- Helm 图表参数
- 构建和部署
- 如何使用
- 工作原理
- Kubefledged 控制器的配置标志
- 支持的容器运行时
- 支持的平台
- 构建工具
- 博客和演示
- 致谢
- 贡献
- 行为准则
- 许可证
使用场景
- 需要快速启动和/或扩展的应用程序。例如,执行实时数据处理的应用程序需要由于数据量激增而快速扩展。
- 无服务器函数通常需要对传入事件立即做出反应,并在几分之一秒内启动容器。
- 在边缘设备上运行的物联网应用程序,需要容忍边缘设备和镜像仓库之间的间歇性网络连接。
- 如果需要从私有仓库拉取镜像,但不能授予所有人从该仓库拉取镜像的权限,那么可以将镜像放置在集群的节点上。
- 如果集群管理员或操作员需要为应用程序部署升级,并希望事先验证新镜像是否能够成功拉取。
前提条件
- 一个正常运行的 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
博客和演示
- Kubernetes 中缓存容器镜像的日益增长的需求
- 使用 Helm 安装 kube-fledged 以在 Kubernetes 的工作节点上直接创建和管理容器镜像缓存
- Kube-fledged:在 Kubernetes 中缓存容器镜像
- 如何部署和使用 Kube-fledged 在 Kubernetes 中缓存镜像
致谢
- 通过Percona棱镜看云原生:第1集
- Kubetools - Kubernetes工具精选列表
- Kubernetes基本工具:2021
- 设计Kubernetes集群 — 选择最佳自动扩展策略
- Uber Kraken替代方案
- 适合您这样的DevOps工程师的200大Kubernetes工具
- Kubernetes专业人士 - Facebook
- Kube-fledged:在Kubernetes中缓存容器镜像 - Reddit
- Kubernetes工具 - 容器和k8s工具集合
- Kubernetes文章 - 优秀的kubernetes相关文章集合
- Nubenetes - k8s插件、扩展、工具、项目
- SweetOps - 分享k8s类基础设施愿景的社区
- Devops Buzz - 扩展k8s能力
贡献
请阅读CONTRIBUTING.md了解提交拉取请求的流程详情。
贡献者
行为准则
请阅读CODE_OF_CONDUCT.md了解我们的行为准则详情,以及如何报告违规行为。
许可证
本项目采用Apache 2.0许可证 - 详情请参阅LICENSE文件。