我們?yōu)榱斯?jié)省資源,k8s?只需要一個(gè)控制節(jié)點(diǎn)一個(gè)工作節(jié)點(diǎn)即可:
kubectl delete nodes 節(jié)點(diǎn)名稱
kubectl get nodes
NAME? ? ? STATUS? ROLES? ? ? ? ? ? ? ? ? AGE? VERSION
god63? Ready? ? control-plane,master? 33d? v1.20.4
god64? Ready? ? <none>? ? ? ? ? ? ? ? 33d? v1.20.4
為什么要自動(dòng)擴(kuò)縮容? 在實(shí)際的業(yè)務(wù)場景中,我們經(jīng)常會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場景(例如:測試對服務(wù)壓測非剃、電商平臺(tái) 秒殺姑子、大促活動(dòng)苦掘、或由于資源緊張襟衰、工作負(fù)載降低等都需要對服務(wù)實(shí)例數(shù)進(jìn)行擴(kuò)縮容操作)驮瞧。
在 k8s?中擴(kuò)縮容分為兩種:
1腊敲、Node?層面:
在使用 kubernetes?集群經(jīng)常問到的一個(gè)問題是击喂,我應(yīng)該保持多大的節(jié)點(diǎn)規(guī)模來滿足應(yīng)用需求呢??cluster-autoscaler?的出現(xiàn)解決了這個(gè)問題, 可以通過?cluster-autoscaler?實(shí)現(xiàn)節(jié)點(diǎn)級別的動(dòng)態(tài)添 加與刪除碰辅,動(dòng)態(tài)調(diào)整容器資源池懂昂,應(yīng)對峰值流量
2、Pod?層面:
我們一般會(huì)使用 Deployment?中的?replicas?參數(shù)没宾,設(shè)置多個(gè)副本集來保證服務(wù)的高可用凌彬,但是這是 一個(gè)固定的值,比如我們設(shè)置?10?個(gè)副本循衰,就會(huì)啟?10?個(gè)?pod?同時(shí)?running?來提供服務(wù)铲敛。 如果這個(gè)服務(wù)平時(shí)流量很少的時(shí)候,也是?10?個(gè)?pod?同時(shí)在?running会钝,而流量突然暴增時(shí)伐蒋,又可能 出現(xiàn)?10?個(gè)?pod?不夠用的情況。針對這種情況怎么辦?就需要自動(dòng)擴(kuò)縮容:
Kubernetes?對?Pod?的擴(kuò)縮容分為:
手動(dòng)和自動(dòng)兩種
1迁酸、手動(dòng)模式:通過?kubectl scale?命令先鱼,這樣需要每次去手工操作一次,而且不確定什么時(shí)候業(yè)務(wù) 請求量就很大了奸鬓,所以如果不能做到自動(dòng)化的去擴(kuò)縮容的話焙畔,這也是一個(gè)很麻煩的事情?
2、自動(dòng)模式:如果?Kubernetes?系統(tǒng)能夠根據(jù)?Pod?當(dāng)前的負(fù)載的變化情況來自動(dòng)的進(jìn)行擴(kuò)縮容就 好了串远,因?yàn)檫@個(gè)過程本來就是不固定的宏多,頻繁發(fā)生的,所以純手工的方式不是很現(xiàn)實(shí)
自動(dòng)擴(kuò)縮容的方案有哪些?
1.1 Kubernetes HPA(Horizontal Pod Autoscaling) 通過此功能抑淫,只需簡單的配置绷落,便可以利用監(jiān)控指標(biāo)(cpu?使用率、磁盤始苇、自定義的等)自動(dòng)的擴(kuò)容 或縮容服務(wù)中?Pod?數(shù)量砌烁,當(dāng)業(yè)務(wù)需求增加時(shí),系統(tǒng)將無縫地自動(dòng)增加適量?pod?容器催式,提高系統(tǒng)穩(wěn)定 性函喉。
1.2 ?kubernetes KPA(Knative Pod Autoscaler)基于請求數(shù)對 Pod?自動(dòng)擴(kuò)縮容,KPA?的主要限制在于它不支持基于?CPU?的自動(dòng)擴(kuò)縮容荣月。
1.3 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)坷襟。它既可以縮小過度請求資源的容器奸柬,也可以根據(jù)其 使用情況隨時(shí)提升資源不足的容量。
3.1 基于?HPA
要想實(shí)現(xiàn)自動(dòng)擴(kuò)縮容婴程,需要先考慮如下幾點(diǎn):
1.通過哪些指標(biāo)決定擴(kuò)縮容?
HPA v1?版本可以根據(jù)?CPU?使用率來進(jìn)行自動(dòng)擴(kuò)縮容:但是并非所有的系統(tǒng)都可以僅依靠 CPU?或者?Memory?指標(biāo)來擴(kuò)容廓奕,對于大多數(shù)?Web?應(yīng)用的后端 來說,基于每秒的請求數(shù)量進(jìn)行彈性伸縮來處理突發(fā)流量會(huì)更加的靠譜档叔,所以對于一個(gè)自動(dòng)擴(kuò)縮容系 統(tǒng)來說桌粉,我們不能局限于?CPU、Memory?基礎(chǔ)監(jiān)控?cái)?shù)據(jù)衙四,每秒請求數(shù)?RPS?等自定義指標(biāo)也是十分 重要铃肯。
HPA v2?版本可以根據(jù)自定義的指標(biāo)進(jìn)行自動(dòng)擴(kuò)縮容
注意:hpa v1?只能基于?cpu?做擴(kuò)容所用
hpa v2?可以基于內(nèi)存和自定義的指標(biāo)做擴(kuò)容和縮容
2.如何采集資源指標(biāo)?
如果我們的系統(tǒng)默認(rèn)依賴?Prometheus,自定義的?Metrics?指標(biāo)則可以從各種數(shù)據(jù)源或者?exporter?中獲取届搁,基于拉模型的?Prometheus?會(huì)定期從數(shù)據(jù)源中拉取數(shù)據(jù)缘薛。 也可以基于?metrics- server?自動(dòng)獲取節(jié)點(diǎn)和?pod?的資源指標(biāo)
3.如何實(shí)現(xiàn)自動(dòng)擴(kuò)縮容?
K8s?的?HPA controller?已經(jīng)實(shí)現(xiàn)了一套簡單的自動(dòng)擴(kuò)縮容邏輯,默認(rèn)情況下卡睦,每?30s?檢測一次指 標(biāo)宴胧,只要檢測到了配置?HPA?的目標(biāo)值,則會(huì)計(jì)算出預(yù)期的工作負(fù)載的副本數(shù)表锻,再進(jìn)行擴(kuò)縮容操作恕齐。 同時(shí),為了避免過于頻繁的擴(kuò)縮容瞬逊,默認(rèn)在?5min?內(nèi)沒有重新擴(kuò)縮容的情況下悍手,才會(huì)觸發(fā)擴(kuò)縮容未斑。
HPA?本身的算法相對比較保守,可能并不適用于很多場景。例如逸绎,一個(gè)快速的流量突發(fā)場景艾猜,如果 正處在?5min?內(nèi)的?HPA?穩(wěn)定期姑裂,這個(gè)時(shí)候根據(jù)?HPA?的策略糟秘,會(huì)導(dǎo)致無法擴(kuò)容。
3.2 基于?KPA
1旨巷、根據(jù)并發(fā)請求數(shù)實(shí)現(xiàn)自動(dòng)擴(kuò)縮容
2巨缘、設(shè)置擴(kuò)縮容邊界實(shí)現(xiàn)自動(dòng)擴(kuò)縮容
擴(kuò)縮容邊界指應(yīng)用程序提供服務(wù)的最小和最大?
Pod?數(shù)量。通過設(shè)置應(yīng)用程序提供服務(wù)的最小和最大?Pod?數(shù)量實(shí)現(xiàn)自動(dòng)擴(kuò)縮容采呐。
相比 HPA若锁,KPA?會(huì)考慮更多的場景,其中一個(gè)比較重要的是流量突發(fā)的時(shí)候
3.3 ?基于?VPA
當(dāng)目前運(yùn)行?pod?的節(jié)點(diǎn)資源達(dá)不到?VPA?的推薦值斧吐,就會(huì)執(zhí)行?pod?驅(qū)逐又固,重新部署新的足夠資源的 服務(wù)仲器。VPA?是?Kubernetes?比較新的功能,還沒有在生產(chǎn)環(huán)境大規(guī)模實(shí)踐過仰冠,不建議在線上環(huán)境使 用自動(dòng)更新模式娄周,但是使用推薦模式你可以更好了解服務(wù)的資源使用情況。
利用?HPA?基于?CPU?指標(biāo)實(shí)現(xiàn)?pod?自動(dòng)擴(kuò)縮容
HPA?全稱是?Horizontal Pod Autoscaler沪停,翻譯成中文是?POD?水平自動(dòng)伸縮,?HPA?可以基于?CPU?利用率對?deployment?中的?pod?數(shù)量進(jìn)行自動(dòng)擴(kuò)縮容(除了?CPU?也可以基于自定義的指標(biāo) 進(jìn)行自動(dòng)擴(kuò)縮容)裳涛。pod?自動(dòng)縮放不適用于無法縮放的對象木张,比如?DaemonSets。
HPA?由?Kubernetes API?資源和控制器實(shí)現(xiàn)端三∠侠瘢控制器會(huì)周期性的獲取平均?CPU?利用率,并與目標(biāo) 值相比較后調(diào)整?deployment?中的副本數(shù)量郊闯。
利用?HPA?基于?CPU?指標(biāo)實(shí)現(xiàn)?pod?自動(dòng)擴(kuò)縮容
HPA?全稱是?Horizontal Pod Autoscaler妻献,翻譯成中文是?POD?水平自動(dòng)伸縮,?HPA?可以基于?CPU?利用率對?deployment?中的?pod?數(shù)量進(jìn)行自動(dòng)擴(kuò)縮容(除了?CPU?也可以基于自定義的指標(biāo) 進(jìn)行自動(dòng)擴(kuò)縮容)团赁。pod?自動(dòng)縮放不適用于無法縮放的對象育拨,比如?DaemonSets。
HPA?由?Kubernetes API?資源和控制器實(shí)現(xiàn)欢摄“旧ィ控制器會(huì)周期性的獲取平均?CPU?利用率,并與目標(biāo) 值相比較后調(diào)整?deployment?中的副本數(shù)量怀挠。
1析蝴、HPA?工作原理
HPA?是根據(jù)指標(biāo)來進(jìn)行自動(dòng)伸縮的,目前?HPA?有兩個(gè)版本–v1?和?v2beta
HPA?的?API?有三個(gè)版本绿淋,通過?kubectl api-versions | grep autoscal?可看到?autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
autoscaling/v1?只支持基于?CPU?指標(biāo)的縮放;
autoscaling/v2beta1?支持?Resource Metrics(資源指標(biāo)闷畸,如?pod?的?CPU,內(nèi)存)和?Custom Metrics(自定義指標(biāo))的縮放;
autoscaling/v2beta2?支持?Resource Metrics(資源指標(biāo)吞滞,如?pod?的?CPU佑菩,內(nèi)存)和?Custom Metrics(自定義指標(biāo))和?ExternalMetrics(額外指標(biāo))的縮放,但是目前也僅僅是處于?beta?階段 指標(biāo)從哪里來?
K8S?從?1.8?版本開始冯吓,CPU倘待、內(nèi)存等資源的?metrics?信息可以通過?Metrics API?來獲取,用戶可以 直接獲取這些?metrics?信息(例如通過執(zhí)行?kubect top?命令)组贺,HPA?使用這些?metics?信息來實(shí) 現(xiàn)動(dòng)態(tài)伸縮凸舵。
Metrics server:
1、Metrics server?是?K8S?集群資源使用情況的聚合器
2失尖、從?1.8?版本開始啊奄,Metrics server?可以通過?yaml?文件的方式進(jìn)行部署?3渐苏、Metrics server?收集所有?node?節(jié)點(diǎn)的?metrics?信息
HPA?如何運(yùn)作?
HPA?的實(shí)現(xiàn)是一個(gè)控制循環(huán),由?controller manager?的--horizontal-pod-autoscaler-sync- period?參數(shù)指定周期(默認(rèn)值為?15?秒)菇夸。每個(gè)周期內(nèi)琼富,controller manager?根據(jù)每個(gè)?HorizontalPodAutoscaler?定義中指定的指標(biāo)查詢資源利用率。controller manager?可以從?resource metrics API(pod?資源指標(biāo))和?custom metrics API(自定義指標(biāo))獲取指標(biāo)庄新。
然后鞠眉,通過現(xiàn)有?pods?的?CPU?使用率的平均值(計(jì)算方式是最近的?pod?使用量(最近一分鐘的平均 值,從?metrics-server?中獲得)除以設(shè)定的每個(gè)?Pod?的?CPU?使用率限額)跟目標(biāo)使用率進(jìn)行比 較择诈,并且在擴(kuò)容時(shí)械蹋,還要遵循預(yù)先設(shè)定的副本數(shù)限制:MinReplicas <= Replicas <= MaxReplicas。
計(jì)算擴(kuò)容后?Pod?的個(gè)數(shù):sum(最近一分鐘內(nèi)某個(gè)?Pod?的?CPU?使用率的平均值)/CPU?使用上限的 整數(shù)+1
流程:
1羞芍、創(chuàng)建?HPA?資源哗戈,設(shè)定目標(biāo)?CPU?使用率限額,以及最大荷科、最小實(shí)例數(shù)?2唯咬、收集一組中(PodSelector)每個(gè)?Pod?最近一分鐘內(nèi)的?CPU?使用率,并計(jì)算平均值
3畏浆、讀取?HPA?中設(shè)定的?CPU?使用限額
4胆胰、計(jì)算:平均值之和/限額,求出目標(biāo)調(diào)整的實(shí)例個(gè)數(shù)
5全度、目標(biāo)調(diào)整的實(shí)例數(shù)不能超過?1?中設(shè)定的最大煮剧、最小實(shí)例數(shù),如果沒有超過将鸵,則擴(kuò)容;超過勉盅,則擴(kuò) 容至最大的實(shí)例個(gè)數(shù)
6、回到?2顶掉,不斷循環(huán)
2草娜、安裝數(shù)據(jù)采集組件?metrics-server
metrics-server?是一個(gè)集群范圍內(nèi)的資源數(shù)據(jù)集和工具,同樣的痒筒,metrics-server?也只是顯示數(shù) 據(jù)宰闰,并不提供數(shù)據(jù)存儲(chǔ)服務(wù),主要關(guān)注的是資源度量?API?的實(shí)現(xiàn)簿透,比如?CPU移袍、文件描述符、內(nèi)存老充、 請求延時(shí)等指標(biāo)葡盗,metric-server?收集數(shù)據(jù)給?k8s?集群內(nèi)使用,如?kubectl,hpa,scheduler?等?1.部署?metrics-server?組件
#通過離線方式獲取鏡像
需要的鏡像是:k8s.gcr.io/metrics-server-amd64:v0.3.6?和?k8s.gcr.io/addon-resizer:1.8.4 啡浊,可自行下載觅够,如果大家機(jī)器不能訪問外部網(wǎng)絡(luò)胶背,可以把鏡像上傳到?k8s?的各 個(gè)節(jié)點(diǎn),按如下方法手動(dòng)解壓:
docker load -i metrics-server-amd64-0-3-6.tar.gz
docker load -i addon.tar.gz
#部署?metrics-server?服務(wù)
#在/etc/kubernetes/manifests?里面改一下?apiserver?的配置
注意:這個(gè)是?
k8s?在?1.7?的新特性喘先,如果是?1.16?版本的可以不用添加钳吟,1.17?以后要添加。這個(gè)參 數(shù)的作用是?Aggregation?允許在不修改?Kubernetes?核心代碼的同時(shí)擴(kuò)展?Kubernetes API窘拯。?
# vim /etc/kubernetes/manifests/kube-apiserver.yaml?增加如下內(nèi)容:
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml ? ?#添加pod啟動(dòng)參數(shù)
#查看之前的apiserver已經(jīng)沒用了
kubectl get pods -n kube-system
#刪除之前的apiserver
kubectl delete pods kube-apiserver -n kube-system
#驗(yàn)證?metrics-server?是否部署成功
vim ?metrics-server.yaml
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
---
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
---
apiVersion: v1
kind: ServiceAccount
metadata:
? name: metrics-server
? namespace: kube-system
? labels:
? ? kubernetes.io/cluster-service: "true"
? ? addonmanager.kubernetes.io/mode: Reconcile
---
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
---
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.3.6
spec:
? selector:
? ? matchLabels:
? ? ? k8s-app: metrics-server
? ? ? version: v0.3.6
? template:
? ? metadata:
? ? ? name: metrics-server
? ? ? labels:
? ? ? ? k8s-app: metrics-server
? ? ? ? version: v0.3.6
? ? ? annotations:
? ? ? ? scheduler.alpha.kubernetes.io/critical-pod: ''
? ? ? ? seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
? ? spec:
? ? ? priorityClassName: system-cluster-critical
? ? ? serviceAccountName: metrics-server
? ? ? containers:
? ? ? - name: metrics-server
? ? ? ? image: k8s.gcr.io/metrics-server-amd64:v0.3.6
? ? ? ? imagePullPolicy: IfNotPresent
? ? ? ? command:
? ? ? ? - /metrics-server
? ? ? ? - --metric-resolution=30s
? ? ? ? - --kubelet-preferred-address-types=InternalIP
? ? ? ? - --kubelet-insecure-tls
? ? ? ? ports:
? ? ? ? - containerPort: 443
? ? ? ? ? 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
# kubectl get pods -n kube-system | grep metrics
metrics-server-6595f875d6-ml5pc 2/2 ? ? ??Running 0
#測試?kubectl top?命令
kubectl top nodes
kubectl top pods -n kube-system
3红且、創(chuàng)建?php-apache?服務(wù),利用?HPA?進(jìn)行自動(dòng)擴(kuò)縮容涤姊。
#基于?dockerfile?構(gòu)建一個(gè)?PHP-apache?項(xiàng)目
1)創(chuàng)建并運(yùn)行一個(gè)?php-apache?服務(wù)
mkdir php ??
cd php
cat dockerfile
FROM php:5-apache
ADD index.php /var/www/html/index.php?
RUN chmod a+rx index.php
cat index.php?
$x = 0.0001;
for ($i = 0; $i <= 1000000;$i++) {
$x += sqrt($x);
}
echo "OK!";
?>
#構(gòu)建鏡像
docker build -t k8s.gcr.io/hpa-example:v1 .
#打包鏡像
docker save -o hpa-example.tar.gz k8s.gcr.io/hpa-example:v1
#解壓鏡像
可以把鏡像傳到 k8s?的各個(gè)工作節(jié)點(diǎn)直焙,通過?docker load -i hpa-example.tar.gz?進(jìn)行解壓
#通過?deployment?部署一個(gè)?php-apache?服務(wù)
cat php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata: php-apache
spec:
? selector:
? ? matchLabels:
? ? ? run: php-apache
? replicas: 1
? template:
? ? metadata:
? ? ? labels:
? ? ? ? run: php-apache
? ? spec:
? ? ? containers:
? ? ? - name: php-apache
? ? ? ? image: k8s.gcr.io/hpa-example:v1
? ? ? ? ports:
? ? ? ? - containerPort: 80
? ? ? ? resources:
? ? ? ? ? limits:
? ? ? ? ? ? cpu: 500m
? ? ? ? ? requests:
? ? ? ? ? ? cpu: 200m
---
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
# 看一哈
kubectl get pods
NAME? ? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE
php-apache-7d8fdb687c-dms2b? 1/1? ? Running? 0? ? ? ? ? 12s
kubectl get svc
NAME? ? ? ? TYPE? ? ? ? CLUSTER-IP? ? ? EXTERNAL-IP? PORT(S)? AGE
kubernetes? ClusterIP? 10.96.0.1? ? ? <none>? ? ? ? 443/TCP? 35d
php-apache? ClusterIP? 10.105.98.226? <none>? ? ? ? 80/TCP? ? 2m49s
4、創(chuàng)建?HPA
php-apache?服務(wù)正在運(yùn)行砂轻,使用?kubectl autoscale?創(chuàng)建自動(dòng)縮放器,實(shí)現(xiàn)對?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ù)指的是通過?deployment?部署的?pod?的副本數(shù))?2)將所有?Pod?的平均?CPU?使用率維持在?50%(通過?kubectl run?運(yùn)行的每個(gè)?pod?如果是?200毫核庄呈,這意味著平均?CPU?利用率為?100?毫核)
#給上面?php-apache?這個(gè)?deployment?創(chuàng)建?HPA
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
#上面命令解釋說明
kubectl autoscale deployment php-apache?(php-apache?表示?deployment?的名字)?-- cpu-percent=50(表示?cpu?使用率不超過?50%)?--min=1(最少一個(gè)?pod)?--max=10(最多?10?個(gè)?pod)
#驗(yàn)證?HPA?是否創(chuàng)建成功
?~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache? Deployment/php-apache? 0%/50%? ? 1? ? ? ? 10? ? ? ? 1? ? ? ? ? 2m12s
注:由于我們沒有向服務(wù)器發(fā)送任何請求,因此當(dāng)前?CPU?消耗為?0%(TARGET?列顯示了由相應(yīng) 的?deployment?控制的所有?Pod?的平均值)派阱。
5诬留、壓測?php-apache?服務(wù),只是針對?CPU?做壓測
#把?busybox.tar.gz?和?nginx-1-9-1.tar.gz?上傳到 god64?上贫母,手動(dòng)解壓:
docker load -i busybox.tar.gz
docker load -i nginx-1-9-1.tar.gz
啟動(dòng)一個(gè)容器文兑,并將無限查詢循環(huán)發(fā)送到?php-apache?服務(wù)(復(fù)制?k8s?的?master?節(jié)點(diǎn)的終端,也 就是打開一個(gè)新的終端窗口):
kubectl run v1 -it --image=busybox /bin/sh
登錄到容器之后腺劣,執(zhí)行如下命令
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done?在一分鐘左右的時(shí)間內(nèi)绿贞,我們通過執(zhí)行以下命令來看到更高的?CPU?負(fù)載
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
php-apache Deployment/php-apache 231%/50% 1 10 4
上面可以看到,CPU?消耗已經(jīng)達(dá)到?256%橘原,每個(gè)?pod?的目標(biāo)?cpu?使用率是?50%籍铁,所以,php- apache?這個(gè)?deployment?創(chuàng)建的?pod?副本數(shù)將調(diào)整為 5個(gè)副本趾断,為什么是?5?個(gè)副 本拒名,因?yàn)?256/50=5
kubectl get pod
NAME? ? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE
php-apache-7d8fdb687c-46txm? 1/1? ? Running? 0? ? ? ? ? 16m
php-apache-7d8fdb687c-76kvf? 1/1? ? Running? 0? ? ? ? ? 16m
php-apache-7d8fdb687c-9bmk6? 1/1? ? Running? 0? ? ? ? ? 16m
php-apache-7d8fdb687c-dms2b? 1/1? ? Running? 0? ? ? ? ? 83m
php-apache-7d8fdb687c-fbb2c? 1/1? ? Running? 0? ? ? ? ? 15m
kubectl get deployment php-apache
NAME? ? ? ? READY? UP-TO-DATE? AVAILABLE? AGE
php-apache ?5/5 ? ? 5 ? ? ? ? ? ?5 ? ? ? ? ? 84m
注意:可能需要幾分鐘來穩(wěn)定副本數(shù)。由于不以任何方式控制負(fù)載量芋酌,因此最終副本數(shù)可能會(huì)與此示 例不同增显。
停止對?
php-apache?服務(wù)壓測,HPA?會(huì)自動(dòng)對?php-apache?這個(gè)?deployment?創(chuàng)建的?pod?做縮 容
停止向?php-apache?這個(gè)服務(wù)發(fā)送查詢請求隔嫡,在?busybox?鏡像創(chuàng)建容器的終端中甸怕,通過+ C?把剛才?while?請求停止甘穿,然后,我們將驗(yàn)證結(jié)果狀態(tài)(大約一分鐘后):
kubectl get hpa
顯示如下:
kubectl get hpa
NAME? ? ? ? REFERENCE? ? ? ? ? ? ? TARGETS? MINPODS? MAXPODS? REPLICAS? AGE
php-apache? Deployment/php-apache? 0%/50%? ? 1? ? ? ? 10? ? ? ? 7? ? ? ? ? 58m
kubectl get deployment php-apache
顯示如下:
kubectl get deployment php-apache
NAME? ? ? ? READY? UP-TO-DATE? AVAILABLE? AGE
php-apache ?1/1 ? ? ? ?1 ? ? ? ? ? ?1 ? ? ? ? ? 87m
php-apache 1/1 1 1 5s?通過上面可以看到梢杭,CPU?利用率下降到?0温兼,因此?HPA?自動(dòng)將副本數(shù)縮減到?1。 注意:自動(dòng)縮放副本可能需要幾分鐘武契。
利用?HPA?基于內(nèi)存指標(biāo)實(shí)現(xiàn)?pod?自動(dòng)擴(kuò)縮容
1募判、創(chuàng)建一個(gè)?nginx?的?pod
cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
? name: nginx
spec:
? selector:
? ? matchLabels:
? ? ? app: nginx
? replicas:
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: nginx
? ? spec:
? ? ? containers:
? ? ? - name: nginx
? ? ? ? image: nginx:1.9.1
? ? ? ? ports:
? ? ? ? - containerPort: 80
? ? ? ? ? name: http
? ? ? ? ? protocol: TCP
? ? ? ? resources:
? ? ? ? ? requests:
? ? ? ? ? ? cpu: 0.01
? ? ? ? ? ? memory: 25Mi
? ? ? ? ? limits:
? ? ? ? ? ? cpu: 0.05
? ? ? ? ? ? memory: 60Mi
---
apiVersion: v1
kind: Service
metadata:
? name: nginx
? labels:
? ? app: nginx
spec:
? selector:
? type: NodePort
? ports:
? - targetPort: 80
? ? protocol: TCP
? ? name: http
? ? port: 80
? ? nodePort: 30080
kubectl apply -f nginx.yaml
nginx?的?pod?里需要有如下字段,否則?hpa?會(huì)采集不到內(nèi)存指標(biāo)?resources:
requests:
cpu: 0.01 memory: 25Mi
limits:
cpu: 0.05 memory: 60Mi
kubectl get pods
NAME? ? ? ? ? ? ? ? ? ? ? ? ? READY? STATUS? ? RESTARTS? AGE
nginx-fb74696c-8fmfx? ? ? ? ? 1/1? ? Running? 0? ? ? ? ? 53m
3咒唆、創(chuàng)建一個(gè)?hpa
vim hap-v1.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
? name: nginx-hpa
spec:
? ? maxReplicas: 10
? ? minReplicas: 1
? ? scaleTargetRef:
? ? ? apiVersion: apps/v1
? ? ? kind: Deployment
? ? ? name: nginx-hpa
? ? metrics:
? ? - type: Resource
? ? ? resource:
? ? ? ? name: memory
? ? ? ? targetAverageUtilization: 60
kubectl apply -f hap-v1.yaml
#查看創(chuàng)建的?hpa
kubectl get hpa
NAME? ? ? ? REFERENCE? ? ? ? ? ? ? TARGETS? ? ? ? MINPODS? MAXPODS? REPLICAS? AGE
nginx-hpa? ? Deployment/nginx-hpa? ? <unknown>/60%? 1? ? ? ? 10? ? ? ? 0? ? ? ? ? 106s
4届垫、壓測?nginx?的內(nèi)存,hpa?會(huì)對?pod?自動(dòng)擴(kuò)縮容
登錄到上面通過?
kubectl exec -it?nginx-hpa-fb74696c-6m6st ?-- /bin/sh
? #壓測
dd if=/dev/zero of=/tmp/a
#打開新的終端
pod?創(chuàng)建的?nginx全释,并生成一個(gè)文件装处,增加內(nèi)存
kubectl get hpa NAME REFERENCE TARGETS nginx-hpa Deployment/nginx-hpa
MINPODS ? ? 200%/60%. ? ? ? ? MAXPODS 1 10 ? ? ? ? ? ? ? REPLICAS AGE 1
上面的?targets?列可看到?200%/60%,200%表示當(dāng)前?cpu?使用率浸船,60%表示所有?pod?的?cpu?使 用率維持在?60%妄迁,現(xiàn)在?cpu?使用率達(dá)到?200%,所以?pod?增加到?4?個(gè)
kubectl get deployment
5李命、取消對?nginx?內(nèi)存的壓測登淘,hpa?會(huì)對?pod?自動(dòng)縮容
kubectl exec -it nginx-hpa-fb74696c-6m6st. ?-- /bin/sh
刪除/tmp/a?這個(gè)文件
rm -rf /tmp/a
# kubectl get hpa
顯示如下,可看到內(nèi)存使用率已經(jīng)降到?5%:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEnginx-hpa Deployment/nginx-
hpa 5%/60% ? ? 1 ? ? ? ?1 0 ? ? 1 26m
了解:查看?v2?版本的?hpa?如何定義?
kubectl get hpa.v2beta2.autoscaling -o yaml > 1.yaml
什么是kubernetes cluster-autoscaler
Cluster Autoscaler (CA)是一個(gè)獨(dú)立程序,是用來彈性伸縮?kubernetes?集群的封字。它可以自動(dòng)根據(jù) 部署應(yīng)用所請求的資源量來動(dòng)態(tài)的伸縮集群黔州。當(dāng)集群容量不足時(shí),它會(huì)自動(dòng)去?Cloud Provider?(支持?GCE阔籽、GKE?和?AWS)創(chuàng)建新的?Node流妻,而在?Node?長時(shí)間資源利用率很低時(shí)自動(dòng)將其刪 除以節(jié)省開支。
項(xiàng)目地址:https://github.com/kubernetes/autoscaler
2笆制、Cluster Autoscaler?什么時(shí)候伸縮集群?
在以下情況下合冀,集群自動(dòng)擴(kuò)容或者縮放:
擴(kuò)容:由于資源不足,某些?
Pod?無法在任何當(dāng)前節(jié)點(diǎn)上進(jìn)行調(diào)度
縮容
: Node?節(jié)點(diǎn)資源利用率較低時(shí)项贺,且此?node?節(jié)點(diǎn)上存在的?pod?都能被重新調(diào)度到其他?node?節(jié)點(diǎn)上運(yùn)行
3君躺、什么時(shí)候集群節(jié)點(diǎn)不會(huì)被?CA?刪除?
1)節(jié)點(diǎn)上有?pod?被?PodDisruptionBudget?控制器限制。
2)節(jié)點(diǎn)上有命名空間是?kube-system?的?pods开缎。
3)節(jié)點(diǎn)上的?pod?不是被控制器創(chuàng)建棕叫,例如不是被?deployment, replica set, job, stateful set?創(chuàng) 建。
4)節(jié)點(diǎn)上有?pod?使用了本地存儲(chǔ)
5)節(jié)點(diǎn)上?pod?驅(qū)逐后無處可去奕删,即沒有其他?node?能調(diào)度這個(gè)?pod 6)節(jié)點(diǎn)有注解:"cluster-autoscaler.kubernetes.io/scale-down-disabled": "true"(在?CA 1.0.3?或更高版本中受支持)
擴(kuò)展:什么是?PodDisruptionBudget?
通過?PodDisruptionBudget?控制器可以設(shè)置應(yīng)用?POD?集群處于運(yùn)行狀態(tài)最低個(gè)數(shù)俺泣,也可以設(shè)置 應(yīng)用?POD?集群處于運(yùn)行狀態(tài)的最低百分比,這樣可以保證在主動(dòng)銷毀應(yīng)用?POD?的時(shí)候,不會(huì)一次 性銷毀太多的應(yīng)用?POD伏钠,從而保證業(yè)務(wù)不中斷
4横漏、Horizontal Pod Autoscaler?如何與?Cluster Autoscaler?一起使用?
Horizontal Pod Autoscaler?會(huì)根據(jù)當(dāng)前?CPU?負(fù)載更改部署或副本集的副本數(shù)。如果負(fù)載增加熟掂, 則?HPA?將創(chuàng)建新的副本缎浇,集群中可能有足夠的空間,也可能沒有足夠的空間赴肚。如果沒有足夠的資 源素跺,CA?將嘗試啟動(dòng)一些節(jié)點(diǎn),以便?HPA?創(chuàng)建的?Pod?可以運(yùn)行誉券。如果負(fù)載減少指厌,則?HPA?將停止某 些副本。結(jié)果踊跟,某些節(jié)點(diǎn)可能變得利用率過低或完全為空踩验,然后?CA?將終止這些不需要的節(jié)點(diǎn)。
擴(kuò)展:如何防止節(jié)點(diǎn)被?CA?刪除?
節(jié)點(diǎn)可以打上以下標(biāo)簽:?"cluster-autoscaler.kubernetes.io/scale-down-disabled": "true"
可以使用?kubectl?將其添加到節(jié)點(diǎn)(或從節(jié)點(diǎn)刪除):
$ kubectl annotate node <nodename> cluster-autoscaler.kubernetes.io/scale-down- disabled=true
5商玫、Cluster Autoscaler?支持那些云廠商?
GCE?https://kubernetes.io/docs/concepts/cluster-administration/cluster-management
?GKE?https://cloud.google.com/container-engine/docs/cluster-autoscaler
AWS(微軟)?https://github.com/kubernetes/autoscaler/blob/master/cluster- autoscaler/cloudprovider/aws/README.md
Azure(微軟)?https://github.com/kubernetes/autoscaler/blob/master/cluster- autoscaler/cloudprovider/azure/README.md
Alibaba Cloud?https://github.com/kubernetes/autoscaler/blob/master/cluster- autoscaler/cloudprovider/alicloud/README.md
?擴(kuò)展學(xué)習(xí) :kubernetes KPA
Github:?https://knative.dev/docs/install/
安裝參考:
https://knative.dev/docs/install/install-serving-with-yaml/