在实际生产系统中,经常会遇到某个服务需要扩容的场景,可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用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个。