K8s系列之:Pod的扩容和缩容

在实际生产系统中,经常会遇到某个服务需要扩容的场景,可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用Deployment/RC的Scale机制来完成这些工作。

K8s对Pod的扩容和缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令对一个Deployment/RC进行Pod副本数量的设置,可一键完成。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。

一、手动扩容和缩容模式

以Deployment nginx为例:
nginx-deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

已运行Pod副本数量为3个

kubectl get pods

通过kubectl scale命令可以将Pod副本数量从初始的3更新为5:

kubectl scale deployment nginx-deployment --replicas 5

再次查看Pod副本数量,副本数量已经变为5个

kubectl get pods

将–replicas设置为比当前Pod副本数量更小的数字,系统将会杀掉一些运行中的Pod,以实现应用集群缩容

kubectl scale deployment nginx-deployment --replicasa=1
kubectl get pods

二、自动扩容和缩容模式

Horizontal Pod Autoscaler(HPA)的控制器,用于实现基于CPU使用率进行自动Pod扩容和缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数–horizontal-pod-autoscaler-sync-period定义的时长(默认周期为30s),周期性地监测目标Pod的CPU使用率,并在满足条件时对ReplicationController或Deployment中的Pod副本数量进行调整,以符合用户定义的平均Pod CPU使用率。Pod CPU使用率来源于Heapster组件,所以需要预先安装好Heapster。

创建HPA时可以使用kubectl autoscale命令进行快速创建或者使用yaml配置文件进行创建。在创建HPA之前,需要已经存在一个Deployment/RC对象,并且该Deployment/RC中的Pod必须定义resources.requests.cpu的资源请求值,如果不设置该值,则Heapster将无法采集到该Pod的CPU使用情况,会导致HPA无法正常工作。

下面通过为一个RC设置HPA,然后使用一个客户端对其进行压力测试,对HPA的用法进行示例。
以php-apache的RC为例,设置cpu request为200m,未设置limit上限的值:
php-apache-deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    metadata:
      name: php-apache
      labels:
        app: php-apache
    spec:
      containers:
      - name: php-apache
        image: gcr.io/google_containers/hpa-example
        resources:
          requests:
            cpu: 200m
        ports:
        - containerPort: 80
kubectl create -f php-apache-deployment.yaml
deployment "php-apache" created

再创建一个php-apache的Service,供客户端访问:
php-apache-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: php-apache
spec:
  ports:
  - port: 80
  selector:
    app: php-apache
kubectl create -f php-apache-svc.yaml

接下来为Deployment "php-apache"创建一个HPA控制器,在1和10之间调整Pod的副本数量,以使得平均Pod CPU使用率维持在50%。

使用kubectl autoscale命令进行创建:

kubectl autoscale deployment php-apache --min=1 --max=10 --cpu-percent=50
deployment "php-apache" autoscaled

通过yaml配置文件来创建HPA,需要在scaleTargetRef字段指定需要管理的Deployment/RC的名字,然后设置minReplicas、maxReplicas和targetCPUUtilizationPercentage参数:
hpa-php-apache.yaml

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50
kubectl create -f hpa-php-apache.yaml
horizontalpodautoscaler "php-apache" created

查看已经创建的HPA:

kubectl get hpa
NAME   REFERENCE   TARGETS     MINPODS  MAXPODS   REPLICAS  AGE
php-apache  Deployment/php-apache 1%/50%     1   10    0   3m

然后创建一个busybox Pod,用于对php-apache服务发起压力测试的请求
busybox-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: bsybox
spec:
 containers:
 - name: busybox
   image: busybox
   command: ["sleep","3600"]
kubectl create -f busybox-pod.yaml
pod "busybox" created

登陆busybox容器,执行一个无限循环的wget命令来访问php-apache服务

# while true; do wget -q -o- http://php-apache > /dev/null; done

注意:wget的目的URL地址是Service的名称"php-apache",要求DNS服务正常工作,也可以使用Service的虚拟ClusterIP地址对其进行访问,例如http://169.169.122.145:

kubectl exec -ti busybox -- sh
/ # while true; do wget -q -o- http://php-apache > /dev/null; done

等待一段时间后,观察HPA控制器搜集到的Pod CPU使用率:

kubectl get hpa
NAME  REFERENCE  TARGETS   MINPODS  MAXPODS  REPLICAS  AGE
php-apache Deployment/php-apache 3068%/50%  1 10  0 3m

再过一会,查看RC php-apache副本数量的变化:

kubectl get deployment php-apache
NAME   DESIRED   CURRENT  UP-TO-DATE  AVAILABLE   AGE
php-apache   10    10  10   10  5m  

可以看到HPA已经根据Pod的CPU使用率的提高对RC进行了自动扩容,Pod的副本数量变成了10个。

最后停止压力测试,在busybox的控制台输入Ctrl+C,停止无限循环操作。等待一段时间,观察HPA的变化:

kubectl get hpa
NAME  REFERENCE  TARGETS   MINPODS  MAXPODS  REPLICAS  AGE
php-apache Deployment/php-apache 3%/50%  1 10  0 3m

再次查看Deployment的副本数量

kubectl get deployment php-apache
NAME  DESIRED   CURRENT   UP-TO-DATE  AVAILABLE   AGE
php-apache   1    1  1   1  5m  

可以看到HPA根据Pod CPU使用率的降低对副本数量进行了缩容操作,Pod副本数量变成了1个。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最笨的羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值