linux怎么查看本机内存大小
294
2022-10-25
EKS 训练营-弹性伸缩(4)
介绍
EKS的弹性伸缩包括两个方面的内容:
一个是水平的 Pod 弹性伸缩(HPA:Horizontal Pod Autoscaler),这是调用K8s的API实现replica配置 一个是集群的 Node 弹性伸缩(CA:Cluster Autoscaler),这是集群层面的垂直弹性伸缩
我们将结合 kube-ops-view (通过Helm部署,官方地址 )来实现弹性伸缩的可视化配置的数据源。
安装 helm
1.下载和安装Helm
mkdir -p ~/environment/helm && cd ~/environment/helm/ curl -sSL | bash helm version --short
2.配置Repository
helm repo add stable https://charts.helm.sh/stable helm repo update
安装kube-ops-view
此处我们使用参数 --set service.type=LoadBalancer 表示把 kube-ops-view 的入口部署到 ELB 上(从而避免了必须使用kube-proxy做端口转发)
helm install kube-ops-view \ stable/kube-ops-view \ --set service.type=LoadBalancer \ --set rbac.create=True
查看安装情况
helm list
如果返回类似如下表示部署成功
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION kube-ops-view default 1 2021-05-21 15:33:24.092579976 +0800 CST deployed kube-ops-view-1.2.4 20.4.0
查看入口
kubectl get svc kube-ops-view | tail -n 1 | awk '{ print "Kube-ops-view URL = }'
系统会返回类似的结果
Kube-ops-view URL = URL(因为此处我们使用了 ELB,在创建 ELB 和传播 DNS 的时候需要点时间,一般需要 1-2 分钟左右),会获得一个如下图所示的监控数据页面
监控截图的含义如下
Pod伸缩(HPA)
1.准备工作
要实现水平弹性伸缩,需要先部署 Metrics Server ,有数据才能实现。
kubectl apply -f apache
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 80 kubectl get pod -l app=php-apache
设定 cpu 超过 50% 就扩容
kubectl autoscale deployment php-apache \ --cpu-percent=50 \ --min=1 \ --max=10
查看状态
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache
大概过上1-2分钟,我们就会发现 /50% 变成了 0%/50% 。
3.人为加压
部署一个pod用来操作
kubectl --generator=run-pod/v1 run -i --tty load-generator --image=busybox /bin/sh
进入Pod后,运行3个后台进程持续加压
while true; do wget -q -O - done & while true; do wget -q -O - done & while true; do wget -q -O - done &
另开一个窗口,查看加压情况
kubectl get hpa -w
发现负载上来后,逐步扩容(如果要快速看到10个副本的效果,可以多运行几行加压脚本)
wangzan:~/environment $ kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 622%/50% 1 10 1 2m41s php-apache Deployment/php-apache 622%/50% 1 10 4 2m49s php-apache Deployment/php-apache 622%/50% 1 10 8 3m4s php-apache Deployment/php-apache 622%/50% 1 10 10 3m20s php-apache Deployment/php-apache 125%/50% 1 10 10 3m35s
4.清除环境
通过如下方式清除刚才的水平扩容测试环境
kubectl delete hpa,svc php-apache kubectl delete deployment php-apache kubectl delete pod load-generator
Cluster伸缩(CA)
在 EKS 里面,集群自动伸缩是集成了 AWS 的 Auto Scaling Groups(ASG)服务实现的,支持如下几种方式
1.配置弹性伸缩组
查看系统已经部署好的 asg 的内容
aws autoscaling \ describe-auto-scaling-groups \ --region eu-west-1 \ --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='my-cluster']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" \ --output table
如下所示(默认配置最小,最大和实际需要的实例数量都是2个)
------------------------------------------------------------- | DescribeAutoScalingGroups | +-------------------------------------------+----+----+-----+ | eks-96bcc1d0-d5ac-a1c7-56be-d4ffdab08a88 | 2 | 2 | 2 | +-------------------------------------------+----+----+-----+
此处我们把最大的实例数量调整成 4 个
aws autoscaling \ update-auto-scaling-group \ --auto-scaling-group-name eks-96bcc1d0-d5ac-a1c7-56be-d4ffdab08a88 \ --min-size 2 \ --desired-capacity 2 \ --max-size 5 \ --region eu-west-1
2.配置 IAM 角色
此处我们使用 IAM Roles for Service Accounts,有兴趣的读者请参考 官方文档
使用如下的方式启用 IAM 角色和 Service Accounts 的功能
eksctl utils associate-iam-oidc-provider \ --cluster eksworkshop-eksctl \ --approve
配置 IAM 角色
mkdir ~/environment/cluster-autoscaler && cd ~/environment/cluster-autoscaler
cat <
把IAM Role和SA关联起来
eksctl create iamserviceaccount \ --name cluster-autoscaler \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn "arn:aws:iam::921283538843:policy/k8s-asg-policy" \ --approve \ --override-existing-serviceaccounts \ --region eu-west-1
查看并确认
kubectl -n kube-system describe sa cluster-autoscaler
3.部署 Cluster Autoscaler
完成以下步骤以部署 Cluster Autoscaler。我们建议您先查看部署注意事项并优化 Cluster Autoscaler 部署,然后再将其部署到生产集群。
部署 Cluster Autoscaler
部署 Cluster Autoscaler。 kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml 使用以下命令修补部署以将 cluster-autoscaler.kubernetes.io/safe-to-evict 注释添加到 Cluster Autoscaler Pod。 kubectl -n kube-system \ annotate deployment.apps/cluster-autoscaler \ cluster-autoscaler.kubernetes.io/safe-to-evict="false" 使用以下命令编辑 Cluster Autoscaler 部署。 kubectl -n kube-system edit deployment.apps/cluster-autoscaler 编辑cluster-autoscaler容器命令 修改为自己集群的参数。 --balance-similar-node-groups --skip-nodes-with-system-pods=false spec: containers: - command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster - --balance-similar-node-groups - --skip-nodes-with-system-pods=false 保存并关闭该文件以应用更改。 在 Web 浏览器中打开 Cluster Autoscaler 发行版页面GitHub,找到与集群的 Kubernetes 主版本和次要版本匹配的最新 Cluster Autoscaler 版本。例如,如果您集群的 Kubernetes 版本是 1.19,则查找以 1.19. 开头的最新 Cluster Autoscaler 版本。记录该版本的语义版本号以便在下一步中使用。 使用以下命令,将 Cluster Autoscaler 映像标签设置为您在上一步中记录的版本。替换为您自己的值。 kubectl set image deployment cluster-autoscaler \ -n kube-system \ cluster-autoscaler=k8s.gcr.io/autoscaling/cluster-autoscaler:v1.20.0
4.部署nginx应用
通过如下方式部署一个测试用的 Nginx 服务
cd ~/environment/cluster-autoscaler/
cat <
设置副本数为10
kubectl scale --replicas=10 deployment/nginx-to-scaleout
我们会发现部分 pod 会处于 “pending” 状态,因为它在等待 EC2 扩容。
可以查看详细的日志信息
kubectl -n kube-system logs -f deployment/cluster-autoscaler
我们会发现已经由原来的 2 个节点变成了 4 个节点,如下所示
wangzan:~/environment/cluster-autoscaler $ kubectl get no
NAME STATUS ROLES AGE VERSION
ip-172-31-19-134.eu-west-1.compute.internal Ready
清理环境
通过如下方式清除我们用于测试集群弹性伸缩的环境信息
cd ~/environment/cluster-autoscaler/ kubectl delete -f nginx.yaml kubectl delete -f cluster-autoscaler-autodiscover.yaml eksctl delete iamserviceaccount \ --name cluster-autoscaler \ --namespace kube-system \ --cluster eksworkshop-eksctl \ --wait aws iam delete-policy \ --policy-arn arn:aws:iam::921283538843:policy/k8s-asg-policy helm -n metrics uninstall metrics-server kubectl delete ns metrics helm uninstall kube-ops-view
推荐配置
在 EKS 的配置默认值里面,一个集群可以配置 10 个节点组,每个节点组可以有 100 个工作节点。
我们通过 eksctl 创建集群时,没有指定节点组(默认 1 个),意味着这个集群最多可以扩容到 100 个 EC2 节点,然后再怎么加压也不会扩容了,这个时候就需要添加节点组(最简单的方式就是通过控制台手工增加)。
欢迎大家扫码关注,获取更多信息
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~