我司现在使用的自动化扩展工具是ASG , 他可以做到自动根据cluster的一些指标进行增加或者删除node, 一般以分钟为计时单位,几分钟可以创建出一个node
Karpenter是一个新的自动扩缩容工具,不经过ASG,直接和ec2进行交互,可以做到秒级新增node
原理和其他的operator类似,需要在我们的eks中部署一个pod作为控制中心,来监控整个eks的状态,日志,然后和aws 接口进行交互,达到创建node,减少node的功能
因为牵扯到新的node加入到我们的eks集群,以及调用api来创建instance,所以需要给与一些需要的AWS权限
官方地址:
我是因为我已经有一个eks在跑了,所以我需要
https://karpenter.sh/v0.13.2/getting-started/getting-started-with-eksctl/
第一步需要准备好一些环境变量以便后边使用:
1 2 3 4 |
export KARPENTER_VERSION=v0.13.2 export CLUSTER_NAME="${USER}-karpenter-demo" export AWS_DEFAULT_REGION="us-west-2" export AWS_ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)" |
因为我的cluster正在运行了,所以我就不需要创建新的cluster,但是这个地方要注意一下,因为例子中的eks在创建是加了特殊的TAG,这个TAG是在后边需要用到的,例如:
1 2 |
tags: karpenter.sh/discovery: ${CLUSTER_NAME} |
我们需要在我们的创建好的cluster的资源上打上这个tag,例如subnet,例如security-group
下一步,我们创建第一个IAM role,这个role就是让我们新创建的instance有权限加入到我们的cluster
1 2 3 4 5 6 7 8 |
TEMPOUT=$(mktemp) curl -fsSL https://karpenter.sh/"${KARPENTER_VERSION}"/getting-started/getting-started-with-eksctl/cloudformation.yaml > $TEMPOUT \ && aws cloudformation deploy \ --stack-name "Karpenter-${CLUSTER_NAME}" \ --template-file "${TEMPOUT}" \ --capabilities CAPABILITY_NAMED_IAM \ --parameter-overrides "ClusterName=${CLUSTER_NAME}" |
创建好以后我们需要更新我们的aws 的auth 的configmap 来更新eks里边的map
1 2 3 4 5 6 |
eksctl create iamidentitymapping \ --username system:node:{{EC2PrivateDNSName}} \ --cluster "${CLUSTER_NAME}" \ --arn "arn:aws:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME}" \ --group system:bootstrappers \ --group system:nodes |
然后我们需要创建第二个role,这个role是用来给karpenter来启动instance的
1 2 3 4 5 6 7 8 |
eksctl create iamserviceaccount \ --cluster "${CLUSTER_NAME}" --name karpenter --namespace karpenter \ --role-name "${CLUSTER_NAME}-karpenter" \ --attach-policy-arn "arn:aws:iam::${AWS_ACCOUNT_ID}:policy/KarpenterControllerPolicy-${CLUSTER_NAME}" \ --role-only \ --approve export KARPENTER_IAM_ROLE_ARN="arn:aws:iam::${AWS_ACCOUNT_ID}:role/${CLUSTER_NAME}-karpenter" |
然后剩下就是如果没用过spot instance需要执行下边的命令
1 |
aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true |
这样就完成了准备工作,然后我们就需要在我9omende集群中安装Karpenter的控制中心
1 2 3 4 5 6 7 8 9 10 |
helm repo add karpenter https://charts.karpenter.sh/ helm repo update helm upgrade --install --namespace karpenter --create-namespace \ karpenter karpenter/karpenter \ --version ${KARPENTER_VERSION} \ --set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=${KARPENTER_IAM_ROLE_ARN} \ --set clusterName=${CLUSTER_NAME} \ --set clusterEndpoint=${CLUSTER_ENDPOINT} \ --set aws.defaultInstanceProfile=KarpenterNodeInstanceProfile-${CLUSTER_NAME} \ --wait # for the defaulting webhook to install before creating a Provisioner |
安装好以后还需要Provisioner才会真正的运行,这里边会定义一些类似最多能创建多少,创建的instance 绑定那些sg,创建到哪些subnet等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cat <<EOF | kubectl apply -f - apiVersion: karpenter.sh/v1alpha5 kind: Provisioner metadata: name: default spec: requirements: - key: karpenter.sh/capacity-type operator: In values: ["spot"] limits: resources: cpu: 1000 provider: subnetSelector: karpenter.sh/discovery: ${CLUSTER_NAME} securityGroupSelector: karpenter.sh/discovery: ${CLUSTER_NAME} ttlSecondsAfterEmpty: 30 EOF |
创建完成后就可以参考官方文档的测试用例来使用Karpenter了
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021