kubectl scale 对运行在k8s 环境中的pod 数量进行扩容(增加)或缩容(减小)。
HPA:(Horizontal Pod Autoscaler)Pod自动弹性伸缩,K8S通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络请求量)的检测,实现对Pod实例个数的动态新增和减少。
一、手动调整Pod数量的方式:
1.改yaml文件改replicas数量
2.在dashboard改deployment的pod值
3.通过kubectl scale命令(临时):
kubectl scale deployment linux39-tomcat-app1-deployment --replicas=3 -n linux39
kubectl delete hpa xx -n xx
4.通过kubectl edit命令(临时): kubectl edit deployment linux39-tomcat-app1-deployment -n linux39
实例:
[root@localhost7C ]# kubectl run net-test1 --image=alpine --replicas=4 sleep 360000
[root@localhost7C ]# kubectl scale deployment --replicas=3 net-test1 -n default
[root@localhost7C ]#kubectl get deployment -n default net-test1
NAME READY UP-TO-DATE AVAILABLE AGE
net-test1 3/3 3 3 57m
#scale不支持下面三个命令查看,autoscale支持。
[root@localhost7C ]# kubectl get hpa net-test1 -n default
[root@localhost7C ]# kubectl describe hpa net-test1 -n default
[root@localhost7C ]# kubectl delete hpa net-test1 -n default
二、HPA自动伸缩
1.HPA控制器简介及实现
k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,
早期的版本只能基于Heapster组件实现对CPU利用率做为触发条件,但是在k8s 1.11版本开始使用Metrices Server完成数据采集,
然后将采集到的数据通过API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,
然后再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的。
控制管理器默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
支持以下三种metrics指标类型:
->预定义metrics(比如Pod的CPU)以利用率的方式计算
->自定义的Pod metrics,以原始值(raw value)的方式计算
->自定义的object metrics
支持两种metrics查询方式:
->Heapster
->自定义的REST API
支持多metrics
1.通过命令配置扩缩容
kubectl autoscale deployment linux39-tomcat-app1-deployment --min=2 --max=5 --cpu-percent=50 -n linux39
2.yaml文件中定义扩缩容(kind: HorizontalPodAutoscaler),配置说明:
apiVersion: autoscaling/v2beta1 #定义API版本
kind: HorizontalPodAutoscaler #对象类型
metadata: #定义对象元数据
namespace: linux36 #创建后隶属的namespace
name: linux36-tomcat-app1-podautoscaler #hpa名称
labels: #label标签
app: linux36-tomcat-app1 #hpa的label名称
version: v2beta1 #hpa的api版本
spec: #定义对象具体信息
scaleTargetRef: #定义水平伸缩的目标对象,Deployment、ReplicationController/ReplicaSet
apiVersion: apps/v1 #API版本,HorizontalPodAutoscaler.spec.scaleTargetRef.apiVersion
kind: Deployment #目标对象类型为deployment(重点)
name: linux36-tomcat-app1-deployment #deployment 的具体名称(重点)
minReplicas: 2 #最小pod数
maxReplicas: 5 #最大pod数
targetCPUUtilizationPercentage: 30 #设置CPU使用率警戒线百分比,指定对应pod的cpu资源使用率达到30%就触发hpa。
#metrics: #调用metrics数据定义
#- type: Resource #类型为资源
# resource: #定义资源
# name: cpu #资源名称为cpu
# targetAverageUtilization: 80 #CPU使用率
#- type: Resource #类型为资源
# resource: #定义资源
# name: memory #资源名称为memory
# targetAverageValue: 1024Mi #memory使用率
经验说明:
如果HPA的最小值高于业务yaml文件replicas的值,以hpa中的min的值为准
如果HPA的最小值低于业务yaml文件replicas的值,以hpa中的min的值为准
无状态应用可以hpa,有状态的应用不使用hpa
HPA自动伸缩实例:
1.clone代码:
git clone https://github.com/kubernetes-incubator/metrics-server.git
cd metrics-server/
2.:准备image:
测试系统自带的指标数据:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/pods
3.测试指标数据:
# kubectl top
# kubectl top nodes #报错如下
Error from server (NotFound): the server could not find the requested resource (get
services http:heapster:)
解决方案:
docker pull k8s.gcr.io/metrics-server-amd64:v0.3.5 #google镜像仓库
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.5 #阿里云镜像仓库
或者
docker tag k8s.gcr.io/metrics-server-amd64:v0.3.5 harbor.zzhz.com/baseimages/metrics-server-amd64:v0.3.5
docker push harbor.zzhz.com/baseimages/metrics-server-amd64:v0.3.5
4.(可选)修改controller-manager启动参数,重启controller-manager
[root@localhost7C ~]# kube-controller-manager --help | grep horizontal-pod-autoscaler
[root@localhost7C ~]# vim /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/usr/bin/kube-controller-manager \
--address=127.0.0.1 \
--allocate-node-cidrs=true \
--cluster-cidr=10.20.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
--leader-elect=true \
--node-cidr-mask-size=24 \
--root-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-cluster-ip-range=10.10.0.0/16 \
--use-service-account-credentials=true \ #是否使用其他客户端数据
--horizontal-pod-autoscaler-sync-period=10s \ #可选项目,定义数据采集周期间隔时间
--v=2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
5.修改yaml文件
cd metrics-server/deploy/kubernetes
[root@localhost7C ~]# ll k8s/metrics/
aggregated-metrics-reader.yaml
auth-delegator.yaml
auth-reader.yaml
metrics-apiservice.yaml
metrics-server-deployment.yaml
metrics-server-service.yaml
resource-reader.yaml
[root@localhost7C ]# vim metrics-server-deployment.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6 #镜像
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
ports:
- name: main-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- name: tmp-dir
mountPath: /tmp
nodeSelector:
kubernetes.io/os: linux
kubernetes.io/arch: "amd64"
6.部署和查看资源使用情况
[root@localhost7C kubernetes]# kubectl apply -f ./
[root@localhost7C kubernetes]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
192.168.80.120 107m 2% 1140Mi 101%
192.168.80.130 137m 3% 1098Mi 98%
192.168.80.140 108m 2% 1200Mi 84%
192.168.80.150 69m 1% 816Mi 64%
192.168.80.160 65m 1% 844Mi 53%
192.168.80.170 59m 1% 752Mi 43%
[root@localhost7C kubernetes]# kubectl top pod -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system kube-dns-69979c4b84-2h6d2 3m 31Mi
kube-system kube-flannel-ds-amd64-2262m 3m 17Mi
kube-system kube-flannel-ds-amd64-69qjr 3m 15Mi
kube-system kube-flannel-ds-amd64-6bsnm 1m 11Mi
kube-system kube-flannel-ds-amd64-6cq5q 2m 11Mi
kube-system kube-flannel-ds-amd64-ckmzs 2m 14Mi
kube-system kube-flannel-ds-amd64-xddjr 3m 11Mi
kube-system metrics-server-ccccb9bb6-m6pws 2m 16Mi
指标数据:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/pods
7.创建示例
[root@localhost7C kubernetes]# cat nginx.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: magedu-nginx-deployment-label
name: magedu-nginx-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: magedu-nginx-selector
template:
metadata:
labels:
app: magedu-nginx-selector
spec:
containers:
- name: magedu-nginx-container
image: harbor.zzhz.com/baseimage/nginx:latest
#command: ["/apps/tomcat/bin/run_tomcat.sh"]
#imagePullPolicy: IfNotPresent
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
resources:
limits:
cpu: '1'
memory: 200Mi
requests:
cpu: '1'
memory: 200Mi
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-nginx-service-label
name: magedu-nginx-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30080
selector:
app: magedu-nginx-selector
#方式一:通过命令配置扩缩容:
#--cpu-percent=1 指定对应pod的cpu资源使用率达到50%就触发hpa
#等待一会,可以看到相关的hpa信息(K8s上metrics服务收集所有pod资源的时间间隔大概在60s的时间)
kubectl autoscale deployment magedu-nginx-deployment --max=5 --min=2 --cpu-percent=5 -n default
验证信息:
[root@localhost7C kubernetes]# kubectl get hpa magedu-nginx-deployment -n default
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
magedu-nginx-deployment Deployment/magedu-nginx-deployment 0%/5% 2 5 3 3m47s
#查看详细信息
[root@localhost7C kubernetes]# kubectl describe hpa magedu-nginx-deployment -n default
Name: magedu-nginx-deployment
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Mon, 27 Mar 2023 14:20:23 +0800
Reference: Deployment/magedu-nginx-deployment
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 0% (0) / 5%
Min replicas: 2
Max replicas: 5
Deployment pods: 2 current / 2 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
ScalingLimited True TooFewReplicas the desired replica count is less than the minimum replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 69s horizontal-pod-autoscaler New size: 2; reason: All metrics below target
验证信息:变成二个pod.
[root@localhost7C kubernetes]# kubectl get hpa magedu-nginx-deployment -n default
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
magedu-nginx-deployment Deployment/magedu-nginx-deployment 0%/5% 2 5 2 7m55s
#删除hpa
[root@localhost7C kubernetes]# kubectl delete hpa magedu-nginx-deployment -n default
#方式二:yaml文件中定义扩缩容配置(kind: HorizontalPodAutoscaler)
[root@localhost7C kubernetes]# cat hpa.yaml
#apiVersion: autoscaling/v2beta1
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
namespace: default
name: magedu-nginx-podautoscaler
labels:
app: magedu-nginx
version: v2beta1
spec:
scaleTargetRef:
apiVersion: apps/v1
#apiVersion: extensions/v1beta1
kind: Deployment #类型
name: magedu-nginx-deployment #nginx-deployment名
minReplicas: 3
maxReplicas: 5
targetCPUUtilizationPercentage: 4
[root@localhost7C kubernetes]# kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/magedu-nginx-podautoscaler created
[root@localhost7C kubernetes]# kubectl describe hpa magedu-nginx-podautoscaler
Name: magedu-nginx-podautoscaler
Namespace: default
Labels: app=magedu-nginx
version=v2beta1
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"labels":{"app":"magedu-nginx","version":"v2b...
CreationTimestamp: Mon, 27 Mar 2023 14:31:43 +0800
Reference: Deployment/magedu-nginx-deployment
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): <unknown> / 4%
Min replicas: 3
Max replicas: 5
Deployment pods: 2 current / 3 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 3
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 11s horizontal-pod-autoscaler New size: 3; reason: Current number of replicas below Spec.MinReplicas
[root@localhost7C kubernetes]# kubectl get hpa magedu-nginx-podautoscaler
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
magedu-nginx-podautoscaler Deployment/magedu-nginx-deployment 0%/4% 3 5 3 88s