介绍
Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目,遵循 FinOps 标准,已经获得FinOps基金会授予的全球首个认证降本增效开源方案。它为使用 Kubernetes 集群的企业提供了一种简单、可靠且强大的自动化部署工具。
Crane 的设计初衷是为了帮助企业更好地管理和扩展其 Kubernetes 集群,从而实现更高效的云原生应用管理。
它易于使用、高度可定制和可扩展。它提供了一组简单易用的命令行工具,使得开发者和管理员都能轻松地将应用程序部署到 Kubernetes 集群中。Crane 还支持多种云平台,并且可以根据具体的业务需求进行定制。
Crane 并已经被腾讯、网易、思必驰、酷家乐、明源云、数数科技等公司部署在生产系统,其主要贡献者来自腾讯、小红书、谷歌、eBay、微软、特斯拉等知名公司。
Crane中的成本优化包含以下三个方面
- 成本展示: Kubernetes 资源( Deployments, StatefulSets )的多维度聚合与展示。
- 成本分析: 周期性的分析集群资源的状态并提供优化建议。
- 成本优化: 通过丰富的优化工具更新配置达成降本的目标。
Crane主要特征包含以下几个方面
一. 成本可视化和优化评估
实现云资源计费和账单数据的多维度成本分析,并利用 Prometheus 监控系统存储,在多云环境下支持不同云服务商的计费优化评估。
二. 推荐框架
该推荐框架支持多种云资源的分析,并包含多种推荐器,如资源、副本、HPA及闲置资源推荐等,且具备可扩展性。
三. 基于预测的水平弹性器
在社区 HPA 的基础上,EffectiveHorizontalPodAutoscaler 支持预测、观测和周期等更多的弹性触发策略,以实现基于预测的弹性控制,提升弹性效率并保障服务质量。
四. 负载感知的调度器
根据节点的实际利用率,动态调度器构建了一个简单而高效的模型,并在平衡集群时过滤掉负载高的节点。
五. 拓扑感知的调度器
Scheduler和Crane Agent的协同作业,可以实现更加细致的资源拓扑感知调度和多种CPU绑定策略,解决复杂场景下“吵闹的邻居问题”,提高资源利用效率
六. 基于 QOS 的混部
在Kubernetes上运行的Pod的稳定性得到了QOS相关能力的保证。QOS具有多维指标条件下的干扰检测和主动回避能力,并支持精确操作和自定义指标接入;此外,QOS采用预测算法增强了弹性资源超卖能力,对集群内闲置资源进行复用和限制;同时,QOS还具备增强的旁路cpuset管理能力,可以在绑核的同时提高资源利用效率。
Crane架构设计
Crane 的整体架构如下:
Craned
Craned 是 Crane 的最核心组件,它管理了 CRDs 的生命周期以及API。Craned 通 过 Deployment 方式部署且由两个容器组成:
- Craned: 运行了 Operators 用来管理 CRDs,向 Dashboard 提供了 WebApi,Predictors 提供了 TimeSeries API
- Dashboard: 基于 TDesign’s Starter 脚手架研发的前端项目,提供了易于上手的产品功能
Fadvisor
Fadvisor 提供一组 Exporter 计算集群云资源的计费和账单数据并存储到你的监控系统,比如 Prometheus。Fadvisor 通过 Cloud Provider 支持了多云计费的 API。
Metric Adapter
Metric Adapter 实现了一个 Custom Metric Apiserver. Metric Adapter 读取 CRDs 信息并提供基于 Custom/External Metric API 的 HPA Metric 的数据。
Crane Agent
Crane Agent 通过 DaemonSet 部署在集群的节点上。
实操
环境安装
注意事项:本人电脑系统为: MacBook Pro M2 不同电脑安装时可能会有差别
- 安装 Docker
斜体样式我直接安装的是desktop application
打开链接就是 - 安装 kubectl
这一步的安装可以直接在docker 中直接打开Kubernetes
就可以, 打开的过程中就下载好了 - 安装 Helm
直接 终端运行brew install helm
就可以下载完成后输入helm search repo bitnami
看看有没有一个表头出现,有的话就对了 , 我忘记截图了 - 安装 kind
同样终端运行brew install kind
下载完成后 输入kind create cluster --help
看下有没有对应的指令 就可以了, 同样忘记截图了
到此前期的准备工作算是完成了
本地安装 Crane
安装本地的 Kind 集群和 Crane 组件
- 新建一个文件夹,打开文件夹的终端通过
curl -sf https://raw.githubusercontent.com/gocrane/crane/main/hack/local-env-setup.sh | sh -
安装 Crane 以及其依赖 (Prometheus/Grafana)[可能要使用一下魔法] - 上面的命令执行完成之后 ,执行 下面两个命令
2.1export KUBECONFIG=${HOME}/.kube/config_crane
2.2kubectl get deploy -n crane-system
注意:一定要确保所有 Pod 都正常运行:
Pod
的启动需要一定的时间等几分钟后输入命令查看后集群状态是否都Running
(我已经等了10min了 状态如图)
出现了一个 ImagePullBackOff
错误 ,通过大神 @Mr.丢哥 的指导终于解决 , 解决方案也很简单 ,使用科技就好了.
补充一下Pod状态解释
CrashLoopBackOff 容器退出,kubelet正在将它重启
InvalidImageName 无法解析镜像名称
ImageInspectError 无法校验镜像
ErrImageNeverPul 策略禁止拉取镜像
ImagePullBackOff 正在重试拉取
RegistryUnavailable 连接不到镜像中心
ErrImagePull 通用的拉取镜像出错
CreateContainerConfigError 不能创建kubelet使用的容器配置
CreateContainerError 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError 启动容器失败
PostStartHookError 执行hook报错
ContainersNotInitialized 容器没有初始化完毕
ContainersNotReady 容器没有准备完毕
ContainerCreating 容器创建中
PodInitializing pod 初始化中
DockerDaemonNotReady docker还没有完全启动
NetworkPluginNotReady 网络插件还没有完全启动
Evicted 即驱赶的意思,意思是当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod。 多见于资源不足时导致的驱赶。
访问 Crane Dashboard
在终端输入指令kubectl -n crane-system port-forward service/craned 9090:9090
浏览器访问地址 http://localhost:9090/
就可以了
注意:后续的终端操作新窗口操作,每一个新窗口操作前请把配置环境变量加上
export KUBECONFIG=${HOME}/.kube/config_crane
添加本地集群
如图所示:浏览器访问Crane Dashboard 后, 进行如下操作
设置 => 添加集群 => 集群名称 => CRANE URL(当前Crane的地址就可以) => 快速填入页面地址作为集群地址 => 确认
使用 EffectiveHPA
Kubernetes HPA 支持了丰富的弹性扩展能力,Kubernetes 平台开发者部署服务实现自定义 Metric 的服务,Kubernetes 用户配置多项内置的资源指标或者自定义 Metric 指标实现自定义水平弹性。
EffectiveHorizontalPodAutoscaler(简称 EHPA)是 Crane 提供的弹性伸缩产品,它基于社区 HPA 做底层的弹性控制,支持更丰富的弹性触发策略(预测,观测,周期),让弹性更加高效,并保障了服务的质量。
- 提前扩容,保证服务质量:通过算法预测未来的流量洪峰提前扩容,避免扩容不及时导致的雪崩和服务稳定性故障。
- 减少无效缩容:通过预测未来可减少不必要的缩容,稳定工作负载的资源使用率,消除突刺误判。
- 支持 Cron 配置:支持 Cron-based 弹性配置,应对大促等异常流量洪峰。
- 兼容社区:使用社区 HPA 作为弹性控制的执行层,能力完全兼容社区。
安装Metrics Server
依次执行以下命令安装 Metrics Server:
注意:这里我是在项目文件下新起了一个终端, 如果是新创建请配置环境变量 export KUBECONFIG=${HOME}/.kube/config_crane
kubectl apply -f installation/components.yaml
kubectl get pod -n kube-system
创建测试应用
执行以下命令启动一个 Deployment 用 hpa-example 镜像运行一个容器, 然后将其暴露为一个 服务(Service):
kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/autoscaling/php-apache.yaml
kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/analytics/nginx-deployment.yaml
创建 EffectiveHPA
kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/autoscaling/effective-hpa.yaml
运行以下命令查看 EffectiveHPA 的当前状态:kubectl get ehpa
输出结果如图:
增加负载
执行命令kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
以便负载生成继续,你可以继续执行其余步骤
现在执行:
kubectl get hpa ehpa-php-apache --watch
进行监控数据
界面展示
集群总览
成本洞察->集群总览
整体来说还是不错的.
实验环境清理
实验完成后可以通过 kind delete cluster --name=crane
将本地的集群清理删除
总结
Crane 从搭建到运行完成还是相当顺利的, 可以说是丝滑也不过分, 用起来也是很舒适.
我们可以自己在 K8s 集群中安装 crane 来获取这些相关功能, 可以帮助企业像管理 Workload 一样声明式管理 Node 节点,高效解决节点维护、资源规划等各种各样的运维问题。
不过还是存在一切小问题,如web端界面小bug 也是很多的 ,这一点希望后期可以逐渐修复,毕竟 web 永远展示给用户的第一印象