cloudpilot-ai

导航

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

posted on 2024-11-25 14:06  CloudPilotAI  阅读(40)  评论(0编辑  收藏  举报