kubernetes 用hpa實(shí)現(xiàn) Pod 自動(dòng)擴(kuò)縮容

我們?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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晰甚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子决帖,更是在濱河造成了極大的恐慌,老刑警劉巖蓖捶,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件地回,死亡現(xiàn)場離奇詭異,居然都是意外死亡俊鱼,警方通過查閱死者的電腦和手機(jī)刻像,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來并闲,“玉大人细睡,你說我怎么就攤上這事〉刍穑” “怎么了溜徙?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犀填。 經(jīng)常有香客問我蠢壹,道長,這世上最難降的妖魔是什么九巡? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任图贸,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疏日。我一直安慰自己偿洁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布沟优。 她就那樣靜靜地躺著涕滋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪净神。 梳的紋絲不亂的頭發(fā)上何吝,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音鹃唯,去河邊找鬼爱榕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坡慌,可吹牛的內(nèi)容都是我干的黔酥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼洪橘,長吁一口氣:“原來是場噩夢啊……” “哼跪者!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熄求,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤渣玲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弟晚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忘衍,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年卿城,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枚钓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑟押,死狀恐怖搀捷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情多望,我是刑警寧澤嫩舟,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站怀偷,受9級特大地震影響至壤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枢纠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一像街、第九天 我趴在偏房一處隱蔽的房頂上張望黎棠。 院中可真熱鬧,春花似錦镰绎、人聲如沸脓斩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽随静。三九已至,卻和暖如春吗讶,著一層夾襖步出監(jiān)牢的瞬間燎猛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工照皆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留重绷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓膜毁,卻偏偏與公主長得像昭卓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子瘟滨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.獲取資源 kubectlget 2.查看資源詳情 kubectl describe <reousrce_typ...
    365a3735241a閱讀 865評論 0 0
  • Pod的擴(kuò)縮容 實(shí)際生產(chǎn)系統(tǒng), 會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場景候醒,也可能會(huì)遇到由于資源緊張或者工作負(fù)載降低而需要減少服...
    childhood_1013閱讀 1,447評論 0 1
  • 在實(shí)際生產(chǎn)系統(tǒng)中,我們經(jīng)常會(huì)遇到某個(gè)服務(wù)需要擴(kuò)容的場景杂瘸,也可能會(huì)遇到由于資源緊張或者工作負(fù)載降低而需要減少服務(wù)實(shí)例...
    王勇1024閱讀 3,331評論 0 6
  • Kubernetes有一個(gè)HPA(Horizontal Pod Autoscaler)的資源倒淫,可以實(shí)現(xiàn)基于CPU使...
    Lvxus閱讀 3,040評論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭败玉,有人歡樂有人憂愁敌土,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,547評論 28 53