目錄
為什么要自動(dòng)擴(kuò)縮容?
再K8S中擴(kuò)容分為兩種:
一、Node層面:
二、Pods層面:
自動(dòng)擴(kuò)縮容的方案有哪些
Kubernetes HPA (Horizontal Pod Autoscaling)
Kubernetes KPA (Knative Pod Autoscaler)
Kubernetes VPA (Vertical Pod Autoscaler)
基于HPA進(jìn)行POD的擴(kuò)縮容
kube-apiserver 配置:
安裝metrcs-server與addon-resizer
創(chuàng)建一個(gè)用于測(cè)試hpa的鏡像 Dockerfile
使用Deployment部署一個(gè) php-apache 服務(wù)
創(chuàng)建HPA-基于CPU
測(cè)試擴(kuò)容-CPU
創(chuàng)建HPA-基于內(nèi)存
同時(shí)基于內(nèi)存與CPU
HPA官方文檔地址:官方文檔地址
為什么要自動(dòng)擴(kuò)縮容?
? ? 在實(shí)際的業(yè)務(wù)場(chǎng)景中,我們經(jīng)常會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場(chǎng)景(例如:測(cè)試對(duì)服務(wù)器壓測(cè),電商平臺(tái)秒殺、大促活動(dòng)、或由于資源緊張、工作負(fù)載降低等都需要對(duì)服務(wù)實(shí)例數(shù)量擴(kuò)容操作)。
再K8S中擴(kuò)容分為兩種:
一、Node層面:
? ? ? ? 再使用kubenetes 集群經(jīng)常問(wèn)道的一個(gè)問(wèn)題是,我應(yīng)該保持多大的節(jié)點(diǎn)規(guī)模來(lái)滿足應(yīng)用需求呢?cluster-autoscaler 的出現(xiàn)解決了這個(gè)問(wèn)題,可以通過(guò)cluster-autoscaler 實(shí)現(xiàn)節(jié)點(diǎn)級(jí)別的動(dòng)態(tài)添加與刪除,動(dòng)態(tài)調(diào)整容器資源池,應(yīng)對(duì)峰值流量
二、Pods層面:
? ? ? ??一般會(huì)使用Deployment中的 replicas參數(shù),設(shè)置多個(gè)副本集來(lái)保證服務(wù)的高可用,但是這是一個(gè)固定的值,比如我們?cè)O(shè)置10個(gè)副本,就會(huì)啟動(dòng)10個(gè)pod 同時(shí) running 來(lái)提供服務(wù)。
? ? ? ? 如果這個(gè)服務(wù)平時(shí)流量很少的時(shí)候,也是10個(gè)pod同時(shí)running,就會(huì)造成資源浪費(fèi),而流量突然暴增時(shí),又出現(xiàn)了10個(gè)pod 不夠用的情況。針對(duì)這種情況怎么辦》 就需要自動(dòng)擴(kuò)縮容。
自動(dòng)擴(kuò)縮容的方案有哪些
Kubernetes HPA (Horizontal Pod Autoscaling)
? ? 通過(guò)此功能,只需要簡(jiǎn)單的配置,便可以利用監(jiān)控指標(biāo)(CPU、內(nèi)存、磁盤(pán)、自定義等) 自動(dòng)的擴(kuò)容或者縮容服務(wù)中的POD數(shù)量,當(dāng)業(yè)務(wù)需求增加時(shí),系統(tǒng)將無(wú)縫地自動(dòng)增加適量的pod容器,提升系統(tǒng)穩(wěn)定性。
Kubernetes KPA (Knative Pod Autoscaler)
? ? 基于請(qǐng)求數(shù)對(duì)POD自動(dòng)擴(kuò)縮容,KPA的主要限制在于它不支持基于CPU的自動(dòng)擴(kuò)縮容。
Kubernetes VPA (Vertical Pod Autoscaler)
? ? 垂直 Pod 自動(dòng)擴(kuò)縮容,VPA會(huì)基于Pod的資源使用情況自動(dòng)為集群設(shè)置資源占用的限制,從而讓集群將Pod 調(diào)度到有足夠資源的最佳節(jié)點(diǎn)上。VPA也會(huì)保持最初容器定義中資源request 和 limit的占比。
? ? 它會(huì)根據(jù)容器資源使用率自動(dòng)設(shè)置POD 的CPU 和內(nèi)存的 requests,從而允許再節(jié)點(diǎn)上進(jìn)行適當(dāng)?shù)恼{(diào)度,以便為每個(gè)Pod 提供適當(dāng)?shù)目捎玫墓?jié)點(diǎn)。它既可以縮小過(guò)度請(qǐng)求資源的容器,也可以根據(jù)其使用情況隨時(shí)提升資源的容量。
基于HPA進(jìn)行POD的擴(kuò)縮容
? ? K8S的HPA controller 已經(jīng)實(shí)現(xiàn)了一套簡(jiǎn)單的自動(dòng)擴(kuò)縮容邏輯,默認(rèn)情況下,每30s檢測(cè)一次指標(biāo),只要檢測(cè)到了配置HPA的目標(biāo)值,則會(huì)計(jì)算出預(yù)期的工作負(fù)載的副本數(shù),再進(jìn)行擴(kuò)容操作。同時(shí)為了避免過(guò)于頻繁的擴(kuò)縮容,默認(rèn)再 5min 內(nèi)沒(méi)有重新擴(kuò)縮容的情況下,才會(huì)觸發(fā)擴(kuò)縮容。
? ? HPA 本身的算法相對(duì)比較保守,可能并使用與很多場(chǎng)景。例如,一個(gè)快速流量突發(fā)場(chǎng)景,如果正處在5min內(nèi)的HPA穩(wěn)定器,這個(gè)時(shí)候很具HPA的策略,會(huì)導(dǎo)致無(wú)法擴(kuò)容(通過(guò)實(shí)驗(yàn)擴(kuò)容是很快速的,并非等了5分鐘,但是縮容等了5分鐘,這個(gè)時(shí)間是可以更改的)
kube-apiserver 配置:
注意:這個(gè)是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。這個(gè)參 數(shù)的作用是 Aggregation 允許在不修改 Kubernetes 核心代碼的同時(shí)擴(kuò)展 Kubernetes API。?
vim kube-apiserver.yaml
- --enable-aggregator-routing=true #添加該行內(nèi)容
重新更新ApiServer 配置(?。?!):
#查看下配置
ps -ef |grep ? enable-aggregator-routing
#不存在則更新下
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl delete pods kube-apiserver -n kube-system
#再次查看配置
ps -ef |grep ? enable-aggregator-routing
安裝metrcs-server與addon-resizer
kubectl apply -f metrics.yaml
kubectl get pod -n kube-system
metrics-server-7f546bc689-7m2zm 2/2 Running 0
?metrics.yaml:
#RBAC授權(quán)
#集群綁定角色到SA賬號(hào)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: metrics-server:system:auth-delegator
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
#角色綁定SA賬號(hào)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metrics-server-auth-reader
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
#定義SA賬號(hào)
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
---
#定義集群權(quán)限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:metrics-server
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- deployments
verbs:
- get
- list
- update
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:metrics-server
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
#ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: metrics-server-config
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: EnsureExists
data:
NannyConfiguration: |-
apiVersion: nannyconfig/v1alpha1
kind: NannyConfiguration
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
version: v0.4.1
spec:
selector:
matchLabels:
k8s-app: metrics-server
version: v0.4.1
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
version: v0.4.1
spec:
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
containers:
- name: metrics-server
image: rancher/metrics-server:v0.4.1-amd64 #dockerhub鏡像
imagePullPolicy: IfNotPresent
command:
- /metrics-server
- --metric-resolution=30s
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
- --cert-dir=/tmp
- --secure-port=4443
ports:
- containerPort: 4443
name: https
protocol: TCP
- name: metrics-server-nanny
image: k8s.gcr.io/addon-resizer:1.8.4 #
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 100m
memory: 300Mi
requests:
cpu: 5m
memory: 50Mi
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: metrics-server-config-volume
mountPath: /etc/config
command:
- /pod_nanny
- --config-dir=/etc/config
- --cpu=300m
- --extra-cpu=20m
- --memory=200Mi
- --extra-memory=10Mi
- --threshold=5
- --deployment=metrics-server
- --container=metrics-server
- --poll-period=300000
- --estimator=exponential
- --minClusterSize=2
volumes:
- name: metrics-server-config-volume
configMap:
name: metrics-server-config
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/cluster-service: "true"
kubernetes.io/name: "Metrics-server"
spec:
selector:
k8s-app: metrics-server
ports:
- port: 443
protocol: TCP
targetPort: https
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
查看POD與Node資源使用情況
#查看ingress-nginx名稱(chēng)空間下的pod資源使用
kubectl top pod -n ingress-nginx
NAME CPU(cores) MEMORY(bytes)
ingress-nginx-controller-5cd767794b-qqrms 3m 91Mi
#查看node節(jié)點(diǎn)的資源使用
kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
test-master 207m 5% 3923Mi 53%
test-slave-1 187m 4% 5096Mi 69%
創(chuàng)建一個(gè)用于測(cè)試hpa的鏡像 Dockerfile
FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
# index.php 文件內(nèi)容
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000;$i++) {
$x += sqrt($x);
}
echo "OK!";
?>
#構(gòu)建Docker 鏡像
docker build -t k8s.gcr.io/hpa-example:v1 .
docker save -o hpa-example.tar.gz k8s.gcr.io/hpa-example:v1
可以把鏡像傳到 k8s 的工作節(jié)點(diǎn),通過(guò) docker load -i hpa-example.tar.gz 進(jìn)行解壓:
docker load -i hpa-example.tar.gz
使用Deployment部署一個(gè) php-apache 服務(wù)?php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
nodeName: test-slave-1 #再指定節(jié)點(diǎn)上創(chuàng)建Pod
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
limits:
cpu: 500m #最大使用0.5核CPU
memory: 200Mi
requests:
cpu: 200m #調(diào)用節(jié)點(diǎn)最小要有 0.2核CPU
memory: 200Mi
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
更新資源清單文件
kubectl apply -f php-apache.yaml
#查看pod狀態(tài)
kubectl get pod |grep php-apache
NAME READY STATUS RESTARTS AGE
php-apache-5cbf8c9567-cfq6q 1/1 Running 0 5s
創(chuàng)建HPA-基于CPU
php-apache 服務(wù)正在運(yùn)行,使用 kubectl autoscale 創(chuàng)建自動(dòng)縮放器,實(shí)現(xiàn)對(duì) php-apache 這個(gè)Deployment創(chuàng)建的Pod 自動(dòng)擴(kuò)縮容下面的命令將會(huì)創(chuàng)建一個(gè)HPA,HPA將會(huì)根據(jù)CPU。內(nèi)存等資源指標(biāo)增加或者減少副本數(shù),創(chuàng)建一個(gè)可以實(shí)現(xiàn)如下目的的HPA:
1) 讓副本數(shù)維持再1-10 個(gè)之間 (這里副本數(shù)指的是通過(guò)Deployment 部署 pod 的副本數(shù))
2) 將所有 pod 的平均CPU 使用率位置在 50% (通過(guò) kubectl run 運(yùn)行的Pod 如果是200毫核,這意味著平均CPU利用率為100毫核)
為 php-apache 這個(gè) deployment 創(chuàng)建一個(gè)HPA
#基于CPU
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
參數(shù)解析:
--cpu-percent=50 標(biāo)識(shí)CPU使用率不超過(guò)50%
--min=1 最少一個(gè)pod
--max=10 最多是個(gè)pod
驗(yàn)證HPA是否創(chuàng)建成功
kubectl get hpa
?注:由于我們沒(méi)有向服務(wù)器發(fā)送任何請(qǐng)求,因此當(dāng)前 CPU 消耗為 0%(TARGET 列顯示了由相應(yīng) 的 deployment 控制的所有 Pod 的平均值)
測(cè)試擴(kuò)容-CPU
#運(yùn)行一個(gè)pod
kubectl run v1 -it --image=busybox --image-pull-policy=IfNotPresent /bin/sh
#登錄到容器之后,執(zhí)行如下命令
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
#在一分鐘左右的時(shí)間內(nèi),我們通過(guò)執(zhí)行以下命令來(lái)看到更高的 CPU 負(fù)載
kubectl top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-5cbf8c9567-cfq6q 502m 8Mi
v1 6m 0Mi
#查看hpa
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 251%/50% 1 10 1 6m39s
#查看POD數(shù)量
[root@test-master ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-5cbf8c9567-2g9rh 111m 9Mi
php-apache-5cbf8c9567-c46mw 102m 8Mi
php-apache-5cbf8c9567-cfq6q 105m 8Mi
php-apache-5cbf8c9567-d7clq 106m 8Mi
php-apache-5cbf8c9567-hcjqt 112m 8Mi
php-apache-5cbf8c9567-jhmx7 105m 8Mi
php-apache-5cbf8c9567-rnkxf 112m 8Mi
php-apache-5cbf8c9567-tkhfr 108m 8Mi
#停止壓測(cè)觀察5分鐘后pod是否縮容
[root@test-master ~]# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
php-apache-5cbf8c9567-cfq6q 1m 8Mi
v1 0m 0Mi
創(chuàng)建HPA-基于內(nèi)存
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-v2
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
metrics:
- resource:
name: memory
target:
type: Utilization
averageUtilization: 50
type: Resource
kubectl exec -it php-apache-7d8fdb687c-b78m9 -- /bin/bash
#進(jìn)行壓測(cè)
dd if=/dev/zero of=/tmp/a
同時(shí)基于內(nèi)存與CPU-定義擴(kuò)縮容策略
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-v2
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
metrics:
- resource:
name: memory
target:
type: Utilization
averageUtilization: 50
type: Resource
- resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
type: Resource
#定義擴(kuò)縮容策略
behavior:
#縮容策略(縮容是每5分鐘縮容1個(gè)pods)
scaleDown:
policies:
- type: pods
value: 1
periodSeconds: 300 #單位是秒
#擴(kuò)容策略(觸發(fā)擴(kuò)容時(shí),立即新增9(900%*100%)倍的副本數(shù),即立即擴(kuò)容pod到當(dāng)前的10倍的pod數(shù)量)
scaleUp:
policies:
- type: percent
value: 900%
擴(kuò)展:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-455747.html
其他參數(shù)參考官方文檔: controller-manager啟動(dòng)文件hpa參數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-455747.html
--horizontal-pod-autoscaler-initial-readiness-delay=30s,這是首次探測(cè)Pod是否Ready的延時(shí)時(shí)間,默認(rèn)30s
--horizontal-pod-autoscaler-cpu-initialization-period=10s,設(shè)置首次采集pod的CPU使用率延遲時(shí)間,默認(rèn)5分鐘
--horizontal-pod-autoscaler-downscale-stabilization=1m0s,這個(gè)配置可以讓系統(tǒng)更平滑的進(jìn)行縮容操作,默認(rèn)值5min
到了這里,關(guān)于k8s 1.23.10 動(dòng)態(tài)POD擴(kuò)縮容(HPA )的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!