AWS EKS使用HPA+CA实现Pod自动扩缩
文章目录
- 一、Horizontal Pod Autoscaler
- 1.1 Pod 水平自动扩缩工作机制
- 1.2 部署测试应用
- 二、Cluster Autoscaler
- 2.1 创建服务账号IAM角色
- 2.2 部署CA
- 2.3 部署测试应用
- 参考
一、Horizontal Pod Autoscaler
Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的 自定义度量指标 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性地调整副本控制器或 Deployment 中的副本数量,以使得类似 Pod 平均 CPU 利用率、平均内存利用率这类观测到的度量值与用户所设定的目标值匹配。
1.1 Pod 水平自动扩缩工作机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbdSuTLj-1637632441381)(/Users/gdmo/笔记/Kubernetes/AWS EKS/知识梳理/images/horizontal-pod-autoscaler.svg)]
Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)。
每个周期内,控制器管理器根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 控制器管理器可以从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 API(其他指标)获取度量值。
-
对于按 Pod 统计的资源指标(如 CPU),控制器从资源指标 API 中获取每一个 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果设置了目标使用率, 控制器获取每个 Pod 中的容器资源使用情况,并计算资源使用率。 如果设置了 target 值,将直接使用原始数据(不再计算百分比)。 接下来,控制器根据平均的资源使用率或原始值计算出扩缩的比例,进而计算出目标副本数。
需要注意的是,如果 Pod 某些容器不支持资源采集,那么控制器将不会使用该 Pod 的 CPU 使用率。 下面的算法细节章节将会介绍详细的算法。
-
如果 Pod 使用自定义指示,控制器机制与资源指标类似,区别在于自定义指标只使用 原始值,而不是使用率。
-
如果 Pod 使用对象指标和外部指标(每个指标描述一个对象信息)。 这个指标将直接根据目标设定值相比较,并生成一个上面提到的扩缩比例。 在
autoscaling/v2beta2版本 API 中,这个指标也可以根据 Pod 数量平分后再计算。
通常情况下,控制器将从一系列的聚合 API(metrics.k8s.io、custom.metrics.k8s.io 和 external.metrics.k8s.io)中获取度量值。 metrics.k8s.io API 通常由 Metrics 服务器(需要额外启动)提供。 可以从 metrics-server 获取更多信息。 另外,控制器也可以直接从 Heapster 获取指标。
1.2 部署测试应用
前置条件:使用HPA,需要在K8S集群安装Metrics Server
HPA为K8S集群中的概念
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
部署测试应用
kubectl create deployment php-apache --image=us.gcr.io/k8s-artifacts-prod/hpa-example
kubectl set resources deploy php-apache --requests=cpu=200m
kubectl expose deploy php-apache --port 80kubectl get pod -l app=php-apache
创建HPA资源
kubectl autoscale deployment php-apache `#The target average CPU utilization` \--cpu-percent=50 \--min=1 `#The lower limit for the number of pods that can be set by the autoscaler` \--max=10 `#The upper limit for the number of pods that can be set by the autoscaler`# 查看kubectl get hpa
生成负载
kubectl --generator=run-pod/v1 run -i --tty load-generator --image=busybox /bin/sh
while true; do wget -q -O - http://php-apache; done
# 查看扩缩效果
kubectl get hpa -w
二、Cluster Autoscaler
前置条件:一个AutoScaling Group
2.1 创建服务账号IAM角色
启用IAM角色
eksctl utils associate-iam-oidc-provider \--cluster eksworkshop-eksctl \--approve
创建IAM策略,以运行CA Pod与AutoScaling Group进行交互
mkdir ~/environment/cluster-autoscalercat <<EoF > ~/environment/cluster-autoscaler/k8s-asg-policy.json
{"Version": "2012-10-17","Statement": [{"Action": ["autoscaling:DescribeAutoScalingGroups","autoscaling:DescribeAutoScalingInstances","autoscaling:DescribeLaunchConfigurations","autoscaling:DescribeTags","autoscaling:SetDesiredCapacity","autoscaling:TerminateInstanceInAutoScalingGroup","ec2:DescribeLaunchTemplateVersions"],"Resource": "*","Effect": "Allow"}]
}
EoFaws iam create-policy \--policy-name k8s-asg-policy \--policy-document file://~/environment/cluster-autoscaler/k8s-asg-policy.json
创建IAM角色
eksctl create iamserviceaccount \--name cluster-autoscaler \--namespace kube-system \--cluster eksworkshop-eksctl \--attach-policy-arn "arn:aws:iam::${ACCOUNT_ID}:policy/k8s-asg-policy" \--approve \--override-existing-serviceaccounts# 查看
kubectl -n kube-system describe sa cluster-autoscaler
2.2 部署CA
kubectl apply -f https://www.eksworkshop.com/beginner/080_scaling/deploy_ca.files/cluster-autoscaler-autodiscover.yaml# 为了防止 CA 删除运行它自己的 pod 的节点, 添加注释cluster-autoscaler.kubernetes.io/safe-to-evict
kubectl -n kube-system \annotate deployment.apps/cluster-autoscaler \cluster-autoscaler.kubernetes.io/safe-to-evict="false"# 更新
export K8S_VERSION=$(kubectl version --short | grep 'Server Version:' | sed 's/[^0-9.]*\([0-9.]*\).*/\1/' | cut -d. -f1,2)
export AUTOSCALER_VERSION=$(curl -s "https://api.github.com/repos/kubernetes/autoscaler/releases" | grep '"tag_name":' | sed -s 's/.*-\([0-9][0-9\.]*\).*/\1/' | grep -m1 ${K8S_VERSION})kubectl -n kube-system \set image deployment.apps/cluster-autoscaler \cluster-autoscaler=us.gcr.io/k8s-artifacts-prod/autoscaling/cluster-autoscaler:v${AUTOSCALER_VERSION}# 查看日志
kubectl -n kube-system logs -f deployment/cluster-autoscaler
2.3 部署测试应用
cat <<EoF> ~/environment/cluster-autoscaler/nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-to-scaleout
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:service: nginxapp: nginxspec:containers:- image: nginxname: nginx-to-scaleoutresources:limits:cpu: 500mmemory: 512Mirequests:cpu: 500mmemory: 512Mi
EoFkubectl apply -f ~/environment/cluster-autoscaler/nginx.yamlkubectl get deployment/nginx-to-scaleout
扩展副本集
kubectl scale --replicas=10 deployment/nginx-to-scaleout
# 查看Pod
kubectl get pods -l app=nginx -o wide --watch
# 查看日志
kubectl -n kube-system logs -f deployment/cluster-autoscaler
# 查看Node
kubectl get nodes
参考
[1] Pod水平自动扩缩:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/
[2] Amazon EKS用户指南:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/what-is-eks.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
