CloudPilot AI携手阿里云发布Karpenter阿里云 Provider,优化ACK集群主动扩展
上一年7月,Kubernetes 达到十万星标的里程碑,显示其作为云核算范畴中心容器编列东西的广泛运用与认可。Kubernetes 的遍及加快了企业的上云进程,使云核算成为数字化转型的干流挑选。跟着越来越多企业依靠 Kubernetes 供给灵敏的基础设施扩展,云开销办理需求也益发急迫。依据 Flexera 发布的《2023年云核算现状陈述》,超越 80% 的受访企业已将云开销办理视为首要任务。
在这种布景下,专为 Kubernetes 规划的开源主动扩缩容项目 Karpenter 应运而生。Karpenter 于 2021 年 11 月初次发布并开源,并在 2023 年进入 beta 阶段后贡献给云原生核算基金会(CNCF)。本年8月,Karpenter 推出 1.0 版别,标志着该项目迈向老练,自发布以来已被 Slack、阿迪达斯、奥迪等职业领导者运用于出产环境。
但是,Karpenter 长时间以来仅支撑 AWS,难以满意许多企业的多云与混合云 IT 战略。为呼应开源社区用户的需求,CloudPilot AI 携手阿里云容器服务和弹性核算团队联合开发了 karpenter-provider-alibabacloud,将 Karpenter 的灵敏多战略集群弹性带给阿里云用户。
经过数月紧锣密鼓的开发,今日,咱们很快乐地宣告 karpenter-provider-alibabacloud 已正式发布。
开源地址:
https://github.com/cloudpilot-ai/karpenter-provider-alibabacloud
文档地址:
https://docs.cloudpilot.ai/karpenter/alibabacloud/
Karpenter 怎么作业?
Karpenter 是一个专为 Kubernetes 集群规划的开源集群扩缩容项目,旨在供给高效的节点生命周期办理,协助企业优化集群的的资源运用率和本钱,一同提高集群数据面节点的运维功率。
经过主动监控和剖析集群中 pending 的作业负载,Karpenter 能快速创立适宜的核算节点,以保证作业负载一直有满意的资源承载,保证服务继续安稳运转。而在资源需求削减时,它会主动开释剩余节点,协助企业按需减缩资源,然后下降云核算开销。
Karpenter 的共同优势还在于它能够辨认和优化资源运用率低节点,而且能够对接按需和 Spot 等多种计费形式的节点,经过节点整合(binpack)和节点替换功用,将事务从低运用率/本钱更高的节点迁移到能够提高运用率/更具本钱效益的节点实例上。
相较于另一款开源弹性弹性东西 Cluster Autoscaler,Karpenter 没有节点组的概念,经过动态核算资源分配以及直接对接阿里云的弹性供给组,削减多层API交互,使得分配资源最优、缩短API调用耗时、下降装备复杂性;一同在接连屡次弹性扩容等场景下,能够完结更高成功率的弹性资源交给。
Karpenter 可认为阿里云的客户带来什么?
阿里云 Provider 的发布为 Karpenter 供给了对阿里云环境的原生支撑。运用阿里云的企业能够在 Kubernetes 集群中充分运用 Karpenter 的主动扩缩容和资源优化功用,以更高效地办理核算资源。这不只节约了企业的办理时刻和精力,还完结了更智能、更灵敏的集群办理,然后下降整体云本钱,助力企业将更多预算投入到事务增加中。
关于企业而言,这一扩展带来的价值远超资源调度的简略主动化。经过阿里云 Provider,Karpenter 能依据作业负载需求实时调整节点数量,一同结合阿里云的定价形式(按需/Spot 等)和资源特性,挑选最具性价比的实例类型。这不只协助企业充分运用阿里云的弹性弹性才能,轻松应对突发流量需求,还能最大化资源运用率,以最低本钱完结节点扩缩,明显削减闲暇资源的糟蹋。
Karpenter 怎么高效主动扩展 ACK 集群?
本章节将详细介绍 Karpenter 怎么在 ACK 上完结从装置到主动扩缩容的完好流程,并协助您把握怎么运用 Karpenter 最大化 ACK 集群的资源运用功率。
Step 1:前期预备
在阿里云 ACK 集群上装置 Karpenter 首要需求装备阿里云的 API 权限,以便 Karpenter 能够主动创立、办理和开释节点。现在,Karpenter 暂时运用 AK/SK 凭证,未来将会切换至 RRSA 来增强安全性。
在开端装置 Karpenter 之前,请预备:
-
阿里云 CLI
-
Kubectl
-
Helm
运转以下指令,以装备带有 AK/SK 凭证的阿里云 CLI:
aliyun configure
Step 2:预备阿里云 ACK 集群
如果您已经有一个 ACK 集群,可疏忽此过程。
本过程首要用于创立一个用于演示意图的 ACK 集群。除了上述组件外,还需装置 Terraform。
装备阿里云凭证环境变量:
export ALICLOUD_ACCESS_KEY=<aliyun access key>
export ALICLOUD_SECRET_KEY=<aliyun secret key>
export ALICLOUD_REGION="cn-shenzhen"
下载 repo:
git clone https://github.com/cloudpilot-ai/examples.git
cd examples/clusters/ack-spot-flannel
履行以下指令创立 ACK 集群:
export TF_VAR_CLUSTER_NAME=<your_cluster_name>
terraform init
terraform apply --auto-approve
运转以下指令获取 kubeconfig:
export CLUSTER_NAME=<your_cluster_name>
export KUBECONFIG=~/.kube/demo
export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
aliyun cs GET /k8s/$CLUSTER_ID/user_config | jq -r '.config' > $KUBECONFIG
测验集群能否正常运转:
kubectl get nodes
集群到此创立结束。
Step 3:装备环境变量
运转下方指令,设置相应的环境变量:
export CLUSTER_NAME=<your_cluster_name> # Config your cluster name
export CLUSTER_REGION=<your_cluster_region> # Config the alibabacloud region
export ALIBABACLOUD_AK=<alibaba_cloud_access_key> # Config the alibabacloud AK
export ALIBABACLOUD_SK=<alibaba_cloud_secret_key> # Config the alibabacloud SK
export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
export VSWITCH_IDS=$(aliyun cs GET /api/v1/clusters --header "Content-Type=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME" '.clusters[] | select(.name == $CLUSTER_NAME) | .vswitch_ids[]')
export SECURITYGROUP_ID=$(aliyun cs GET /api/v1/clusters --header "Content-Type=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME" '.clusters[] | select(.name == $CLUSTER_NAME) | .security_group_id')
Step 4:给相关的资源打标签
Karpenter 经过 Tag 找到相应的安全组和 vSwitch,运转以下指令对其进行符号:
# Tag the security group
aliyun tag TagResources --region ${CLUSTER_REGION} --RegionId ${CLUSTER_REGION} --ResourceARN.1 "acs:ecs:*:*:securitygroup/${SECURITYGROUP_ID}" --Tags "{\"karpenter.sh/discovery\": \"$CLUSTER_NAME\"}"
# Tag the vswitch
IFS=' '
while IFS= read -r vs_id; do
aliyun tag TagResources --region ${CLUSTER_REGION} --RegionId ${CLUSTER_REGION} --ResourceARN.1 "acs:vpc:*:*:vswitch/${vs_id}" --Tags "{\"karpenter.sh/discovery\": \"$CLUSTER_NAME\"}"
done <<< $VSWITCH_IDS
Step 5:装置 Karpenter
运转以下指令即可装置最新版别的 karpenter-provider-alibabacloud
:
helm repo add karpenter-provider-alibabacloud https://cloudpilot-ai.github.io/karpenter-provider-alibabacloud
helm upgrade karpenter karpenter-provider-alibabacloud/karpenter --install --version 0.1.0 \
--namespace karpenter-system --create-namespace \
--set "alibabacloud.access_key_id"=${ALIBABACLOUD_AK} \
--set "alibabacloud.access_key_secret"=${ALIBABACLOUD_SK} \
--set "alibabacloud.region_id"=${CLUSTER_REGION} \
--set controller.settings.clusterID=${CLUSTER_ID} \
--wait
Step 6:
创立 NodePool/ECSNodeClass
Karpenter 经过 YAML 文件装备其扩缩容战略,包含节点类型、扩容触发条件等,详细而言,是经过运用自定义的 Kubernetes 资源——NodePool 和 NodeClass 来办理。
NodePool 是 Karpenter 在 Kubernetes 集群中装备节点时的一项重要特性。每个 NodePool 代表一组具有相同装备要求的节点,用户能够经过装备 NodePool 来设定集群中节点的详细要求和资源约束,包含实例类型、可用区、架构(例如 AMD64 或 ARM64)、容量类型(竞价或按需)等。
每个 NodePool 能够引证一个 NodeClass,然后确认由 Karpenter 供给的节点的详细装备。经过 NodeClass,用户能够定制与云环境相关的节点特点,保证在主动扩缩容时能够满意特定的云基础设施需求。
以下是 NodePool 和 NodeClass 创立示例:
cat > nodeclass.yaml <<EOF
apiVersion: karpenter.k8s.alibabacloud/v1alpha1
kind: ECSNodeClass
metadata:
name: defaultnodeclass
spec:
vSwitchSelectorTerms:
- tags:
karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name
imageSelectorTerms:
# ContainerOS only support x86_64 linux nodes, and it's faster to initialize
- alias: ContainerOS
EOF
kubectl apply -f nodeclass.yaml
cat > nodepool.yaml <<EOF
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: ecsnodepool
spec:
disruption:
budgets:
- nodes: 95%
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 1m
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: [ "amd64" ]
- key: kubernetes.io/os
operator: In
values: ["linux"]
- key: karpenter.sh/capacity-type
operator: In
values: ["spot"]
nodeClassRef:
group: "karpenter.k8s.alibabacloud"
kind: ECSNodeClass
name: defaultnodeclass
EOF
kubectl apply -f nodepool.yaml
Step 7:弹性弹性 ACK 布置
运用以下指令测验节点扩展才能:
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: inflate
spec:
replicas: 1
selector:
matchLabels:
app: inflate
template:
metadata:
labels:
app: inflate
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: karpenter.sh/capacity-type
operator: Exists
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
name: inflate
resources:
requests:
cpu: 250m
memory: 250Mi
securityContext:
allowPrivilegeEscalation: false
EOF
kubectl apply -f deployment.yaml
布置完结大约一分钟后,您会看到创立了一个新节点,而且 pod 被调度到新节点上:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
cn-shenzhen.172.16.1.58 Ready <none> 22m v1.31.1-aliyun.1
cn-shenzhen.172.16.2.142 Ready <none> 22m v1.31.1-aliyun.1
cn-shenzhen.172.16.5.18 Ready <none> 43s v1.31.1-aliyun.1
$ kubectl get po -l app=inflate -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
inflate-7758687f95-5r42m 1/1 Running 0 3m14s 10.169.2.2 cn-shenzhen.172.16.5.18 <none> <none>
接下来测验减缩布置,运转以下指令:
kubectl scale deployment/inflate --replicas=0
布置减缩后,您会看到节点被删去:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
cn-shenzhen.172.16.1.58 Ready <none> 22m v1.31.1-aliyun.1
cn-shenzhen.172.16.2.142 Ready <none> 22m v1.31.1-aliyun.1
经过 Karpenter 的主动扩缩容功用,ACK 用户能够大幅削减手动资源办理的作业量,并经过主动节点调度和资源优化明显下降云核算本钱。Karpenter 为 ACK 供给了多种优化资源运用率和本钱操控的战略。经过集成阿里云的计费模型,Karpenter 能够辨认并挑选本钱最优的 ECS 实例类型,乃至能够依据作业负载的需求运用贱价的抢占式实例。在负载下降或任务完结后,Karpenter 将主动开释不再需求的节点,完结灵敏的资源办理。
此外,Karpenter 的 binpack 和 drift 功用能够进一步优化节点费用和主动完结节点晋级。binpack 功用会主动将低效运用的 Node 替换为低标准节点,以提高集群运用率。而 drift 功用会替换掉状况违背预期的节点,保证 ACK 集群节点在长时间运转中一直维持在预期的状况,能够完结主动节点晋级等。
总 结
karpenter-provider-alibabacloud
的发布将 Karpenter 强壮的主动扩展才能带给阿里云用户,并为其供给了一种完好的端到端解决方案。经过这一扩展,阿里云环境中的 Kubernetes 集群能够愈加智能、灵敏地主动调整节点资源,协助企业完结按需资源供给,明显提高集群的可扩展性和资源优化功率。
此次,CloudPilot AI 与阿里云在开源社区的协作不只为阿里云用户带来了先进的技能解决方案,也进一步推动了 Karpenter 项意图开展,一同展示了两家企业同享与协作的开源精力。咱们信任,Karpenter 的继续立异将招引更多开发者和企业用户的重视与参加,咱们也欢迎更多的贡献者参加到 Karpenter 社区中,一同探究阿里云场景下 Karpenter 的新玩法。
曩昔十年,阿里云协助客户“上好云”,未来十年,CloudPilot AI 将携手阿里云,协助客户“用好云”!
最终,感谢以下初期贡献者(Github ID),他们不只经过提交高质量的代码为项目做出了重要贡献,还在项意图前期阶段供给了名贵的支撑和协助:
-
@daimaxiaxie
-
@jwcesign
-
@jxs1211
-
@helen-frank
-
@Vacant2333
-
@peng19940915
-
@B1F030
-
@ringtail
-
@IrisIris
-
@songkang7
公司介绍
云奇谋(CloudPilot.ai)是一家全球抢先的 Karpenter 保管云服务供给商,致力于经过智能化、主动化的云资源调度和编列技能,协助企业最大化云资源运用率。咱们秉持“让客户在云中花费的每一分钱都物超所值”的任务,为客户提高10倍的资源功率,一同将云本钱下降50%以上。
现在,开源K8s弹性弹性器 Karpenter 已为全球超500家知名企业在出产环境中供给服务,包含阿迪达斯、Anthropic、Slack、Figma等。云奇谋已为数十家全球顶尖科技公司供给服务,累计为客户节约超越30万美金,均匀节约67%。 挑选云奇谋,让每一笔开销都更才智。
免费试用,2步5分钟,下降50%云本钱:
cloudpilot.ai