最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

k8s中如何實現(xiàn)pod自動擴縮容詳解

 更新時間:2022年08月11日 15:30:44   作者:大風車兒  
在實際生產(chǎn)系統(tǒng)中,經(jīng)常會遇到某個服務需要擴容的場景,可能會遇到由于資源緊張或者工作負載降低而需要減少服務實例數(shù)量的場景,下面這篇文章主要給大家介紹了關于k8s中如何實現(xiàn)pod自動擴縮容的相關資料,需要的朋友可以參考下

k8s應用自動擴縮容概述

為什么要自動擴縮容

在實際的業(yè)務場景中,我們經(jīng)常會遇到某個服務需要擴容的場景(例如:測試對服務壓測、電商平臺秒殺、大促活動、或由于資源緊張、工作負載降低等都需要對服務實例數(shù)進行擴縮容操作)。

擴縮容分類

按對象層面

  • node擴縮容
    在使用 kubernetes 集群經(jīng)常問到的一個問題是,我應該保持多大的節(jié)點規(guī)模來滿足應用需求呢?cluster-autoscaler 的出現(xiàn)解決了這個問題, 可以通過 cluster-autoscaler 實現(xiàn)節(jié)點級別的動態(tài)添加與刪除,動態(tài)調整容器資源池,應對峰值流量。
  • pod層面
    我們一般會使用 Deployment 中的 replicas 參數(shù),設置多個副本集來保證服務的高可用,但是這是一個固定的值,比如我們設置 10 個副本,就會啟 10 個 pod 同時 running 來提供服務。
    如果這個服務平時流量很少的時候,也是 10 個 pod 同時在 running,而流量突然暴增時,又可能出現(xiàn) 10 個 pod 不夠用的情況。針對這種情況怎么辦?就需要自動擴縮容。

按方式分類

  • 手動模式::通過 kubectl scale 命令,這樣需要每次去手工操作一次,而且不確定什么時候業(yè)務請求量就很大了,所以如果不能做到自動化的去擴縮容的話,這也是一個很麻煩的事情。
  • 自動模式
    1、kubernetes HPA(Horizontal Pod Autoscaling):根據(jù)監(jiān)控指標(cpu 使用率、磁盤、自定義的等)自動擴容或縮容服務中的pod數(shù)量,當業(yè)務需求增加時,系統(tǒng)將無縫地自動增加適量 pod 容器,提高系統(tǒng)穩(wěn)定性。
    2、kubernetes KPA(Knative Pod Autoscaler):基于請求數(shù)對 Pod 自動擴縮容,KPA 的主要限制在于它不支持基于 CPU 的自動擴縮容。
    3、kubernetes VPA(Vertical Pod Autoscaler):基于 Pod 的資源使用情況自動設置 pod 的 CPU 和內(nèi)存的 requests,從而讓集群將 Pod 調度到有足夠資源的最佳節(jié)點上。

如何實現(xiàn)自動擴縮容

HPA運作方式

  • 整體邏輯:K8s 的 HPA controller 已經(jīng)實現(xiàn)了一套簡單的自動擴縮容邏輯,默認情況下,每 15s 檢測一次指標,只要檢測到了配置 HPA 的目標值,則會計算出預期的工作負載的副本數(shù),再進行擴縮容操作。同時,為了避免過于頻繁的擴縮容,默認在 5min 內(nèi)沒有重新擴縮容的情況下,才會觸發(fā)擴縮容。
  • 缺陷:HPA 本身的算法相對比較保守,可能并不適用于很多場景。例如,一個快速的流量突發(fā)場景,如果正處在 5min 內(nèi)的 HPA 穩(wěn)定期,這個時候根據(jù) HPA 的策略,會導致無法擴容。
  • pod數(shù)量計算方式:通過現(xiàn)有 pods 的 CPU 使用率的平均值(計算方式是最近的 pod 使用量(最近一分鐘的平均值,從 metrics-server 中獲得)除以設定的每個 Pod 的 CPU 使用率限額)跟目標使用率進行比較,并且在擴容時,還要遵循預先設定的副本數(shù)限制:MinReplicas <= Replicas <= MaxReplicas。
    計算擴容后 Pod 的個數(shù):sum(最近一分鐘內(nèi)某個 Pod 的 CPU 使用率的平均值)/CPU 使用上限的整數(shù)+1

指標信息來源

K8S 從 1.8 版本開始,各節(jié)點CPU、內(nèi)存等資源的 metrics 信息可以通過 Metrics API 來獲取,用戶可以直接獲取這些 metrics 信息(例如通過執(zhí)行 kubect top 命令),HPA 使用這些 metics 信息來實現(xiàn)動態(tài)伸縮。

部署HPA實現(xiàn)pod自動擴縮容

基于1.23.1版kubernetes

HPA官網(wǎng):https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/

數(shù)據(jù)采集組件metrics-server

概述

metrics-server 是一個集群范圍內(nèi)的資源數(shù)據(jù)集和工具,同樣的,metrics-server 也只是顯示數(shù)據(jù),并不提供數(shù)據(jù)存儲服務,主要關注的是資源度量 API 的實現(xiàn),比如 CPU、文件描述符、內(nèi)存、請求延時等指標,metric-server 收集數(shù)據(jù)給 k8s 集群內(nèi)使用,如 kubectl,hpa,scheduler 等。

github地址:https://github.com/kubernetes-sigs/metrics-server/

不同k8s版本根據(jù)官網(wǎng)安裝對應版本的metrics-server

部署

1、鏡像下載

所用鏡像可提前自行下載:registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.1

2、導入鏡像

docker load -i metrics-server-0.6.1.tar.gz

3、修改apiserver配置

注意:會中斷業(yè)務,生產(chǎn)環(huán)境謹慎操作!

這個是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。這個參數(shù)的作用是 Aggregation 允許在不修改 Kubernetes 核心代碼的同時擴展 Kubernetes API。

vim /etc/kubernetes/manifests/kube-apiserver.yaml

增加如下內(nèi)容:

- --enable-aggregator-routing=true

添加后的效果如下圖所示:

修改完成后重啟kubelet

systemctl restart kubelet

4、部署metrics-server 服務

kubectl apply -f components.yaml

用到的yaml文件到github下載,地址:https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml

5、驗證metrics-server是否部署成功

kubectl get pods -n kube-system | grep metrics

可以看到pod處于Running狀態(tài):

kubectl top nodes # 查看各節(jié)點資源使用情況

kubectl top pods -n kube-system # 查看kube-system名稱空間下pod資源使用情況

測試環(huán)境準備

創(chuàng)建php-apache服務

1、鏡像準備

使用 dockerfile 構建一個新的鏡像,在 k8s 的 xuegod63 節(jié)點構建

mkdir php
cd php
vim dockerfile

dockerfile內(nèi)容如下:

FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php

創(chuàng)建index.php文件,內(nèi)容如下:

<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000;$i++) {
 $x += sqrt($x);
 }
 echo "OK!";
?>
docker build -t k8s.gcr.io/hpa-example:v1 .                     # 構建鏡像
docker save -o hpa-example.tar.gz k8s.gcr.io/hpa-example:v1     # 打包鏡像
scp hpa-example.tar.gz xuegod64:/root/                          # 將鏡像傳到工作節(jié)點

在工作節(jié)點導入鏡像:

docker load -i hpa-example.tar.gz

2、通過 deployment 部署一個 php-apache 服務

cat 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:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example:v1
        imagePullPolicy: IfNotPresent
        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                                               # 驗證 php 是否部署成功

創(chuàng)建nginx服務

1、通過deployment部署一個nginx服務

cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hpa
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
        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:
    app: nginx
  type: NodePort
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

注意:nginx 的 pod 里需要有如下字段,否則 hpa 會采集不到內(nèi)存指標

resources:
  requests:
    cpu: 0.01
    memory: 25Mi
  limits:
    cpu: 0.05
    memory: 60Mi

創(chuàng)建資源并查看:

kubectl apply -f nginx.yaml                                    # 更新資源清單
kubectl get pods                                               # 查看pod
kubectl get svc                                                # 查看service

HPA基于cpu自動擴縮容

php-apache 服務正在運行,使用 kubectl autoscale 創(chuàng)建自動縮放器,實現(xiàn)對 php-apache 這個deployment 創(chuàng)建的 pod 自動擴縮容,下面的命令將會創(chuàng)建一個 HPA,HPA 將會根據(jù) CPU資源指標增加或減少副本數(shù),創(chuàng)建一個可以實現(xiàn)如下目的的 hpa:

(1)讓副本數(shù)維持在 1-10 個之間(這里副本數(shù)指的是通過 deployment 部署的 pod 的副本數(shù))

(2)將所有 Pod 的平均 CPU 使用率維持在 50%(通過 kubectl run 運行的每個 pod 如果是 200毫核,這意味著平均 CPU 利用率為 100 毫核)

創(chuàng)建HPA基于cpu自動擴縮容

創(chuàng)建:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 

查看:

kubectl get hpa

可以看到cpu目標及當前狀態(tài),最大、最小、當前副本數(shù)。

壓測php-apache服務,看擴容

重新打開一個master節(jié)點的終端,進行如下操作:

kubectl run v1 -it --image=busybox --image-pull-policy=IfNotPresent /bin/sh
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

在原master終端查看hpa情況:

kubectl get hpa
kubectl get pods

可以看到平均cpu使用率達到了98%,副本數(shù)已經(jīng)變?yōu)?個。

注意:可能需要幾分鐘來穩(wěn)定副本數(shù)。由于不以任何方式控制負載量,因此最終副本數(shù)可能會與此示例不同。

停止對 php-apache 服務壓測,看縮容

停止向 php-apache 這個服務發(fā)送查詢請求,在 busybox 鏡像創(chuàng)建容器的終端中,通過 Ctrl+ C 把剛才 while 請求停止,然后,我們將驗證結果狀態(tài)(大約一分鐘后):

kubectl get hpa

可以看到平均cpu使用率降為0%,副本數(shù)降為1。

HPA基于內(nèi)存自動擴縮容

nginx 服務正在運行,使用 kubectl autoscale 創(chuàng)建自動縮放器,實現(xiàn)對 nginx 這個deployment 創(chuàng)建的 pod 自動擴縮容,下面的命令將會創(chuàng)建一個 HPA,HPA 將會根據(jù)內(nèi)存資源指標增加或減少副本數(shù),創(chuàng)建一個可以實現(xiàn)如下目的的 hpa:

(1)讓副本數(shù)維持在 1-10 個之間(這里副本數(shù)指的是通過 deployment 部署的 pod 的副本數(shù))

(2)將所有 Pod 的平均內(nèi)存使用率維持在 60%

創(chuàng)建HPA基于內(nèi)存自動擴縮容

hpa-v1.yaml 內(nèi)容如下:

apiVersion: autoscaling/v2
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
        target:
          type: Utilization
          averageUtilization: 60
kubectl apply -f hpa-v1.yaml                                  # 更新資源清單
kubectl get hpa nginx-hpa                                     # 查看創(chuàng)建的hpa

可以看到當前內(nèi)存使用率、目標內(nèi)存使用率,最大、最小、當前副本數(shù)。

壓測nginx服務,看擴容

使用master節(jié)點的終端2登錄到上面通過 pod 創(chuàng)建的 nginx,并生成一個文件,增加內(nèi)存

kubectl exec -it nginx-hpa-7f5d6fbfd9-4d95f -- /bin/bash
dd if=/dev/zero of=/tmp/a

使用終端1查看hpa情況:

kubectl get hpa nginx-hpa

可以看到平均內(nèi)存使用率達到了238%,,副本數(shù)達到了4個。

取消壓測,看縮容

到終端2使用 Ctrl + C 中斷dd進程,刪除/tmp/a這個文件

rm -rf /tmp/a

在終端1查看hpa的情況:

kubectl get hpa nginx-hpa

可以看到平均內(nèi)存使用率已經(jīng)降到5%,副本數(shù)也降為1。(需要等幾分鐘才能看到)

kubernetes cluster-autoscaler概述

什么是 cluster-autoscaler呢?

Cluster Autoscaler (CA)是一個獨立程序,是用來彈性伸縮 kubernetes 集群的。它可以自動根據(jù)部署應用所請求的資源量來動態(tài)的伸縮集群。當集群容量不足時,它會自動去 Cloud Provider (支持GCE、GKE 和 AWS)創(chuàng)建新的 Node,而在 Node 長時間資源利用率很低時自動將其刪除以節(jié)省開支。

項目地址:https://github.com/kubernetes/autoscaler

Cluster Autoscaler 什么時候伸縮集群?

在以下情況下,集群自動擴容或者縮放:

擴容:由于資源不足,某些 Pod 無法在任何當前節(jié)點上進行調度。

縮容: Node 節(jié)點資源利用率較低時,且此 node 節(jié)點上存在的 pod 都能被重新調度到其他 node節(jié)點上運行。

什么時候集群節(jié)點不會被 CA 刪除?

1、節(jié)點上有 pod 被 PodDisruptionBudget 控制器限制。

2、節(jié)點上有命名空間是 kube-system 的 pods。

3、節(jié)點上的 pod 不是被控制器創(chuàng)建,例如不是被 deployment, replica set, job, stateful set 創(chuàng)建。

4、節(jié)點上有 pod 使用了本地存儲。

5、節(jié)點上 pod 驅逐后無處可去,即沒有其他 node 能調度這個 pod。

6、節(jié)點有注解:“cluster-autoscaler.kubernetes.io/scale-down-disabled”: “true”(在 CA 1.0.3 或更高版本中受支持)。

 kubectl annotate node <nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled=true

HPA 如何與 Cluster Autoscaler 一起使用?

Horizontal Pod Autoscaler 會根據(jù)當前 CPU 負載更改部署或副本集的副本數(shù)。如果負載增加,則 HPA 將創(chuàng)建新的副本,集群中可能有足夠的空間,也可能沒有足夠的空間。如果沒有足夠的資源,CA將嘗試啟動一些節(jié)點,以便 HPA 創(chuàng)建的 Pod 可以運行。如果負載減少,則 HPA 將停止某些副本。結果,某些節(jié)點可能變得利用率過低或完全為空,然后 CA 將終止這些不需要的節(jié)點。

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
  • OpenStack Magnum https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/magnum/README.md
  • DigitalOcean https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/digitalocean/README.md
  • CloudStack https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/cloudstack/README.md
  • Exoscale https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/exoscale/README.md
  • Packet https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/packet/README.md
  • OVHcloud https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/ovhcloud/README.md
  • Linode https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/linode/README.md
  • Hetzner https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/hetzner/README.md
  • Cluster API https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/clusterapi/README.md

總結

到此這篇關于k8s中如何實現(xiàn)pod自動擴縮容的文章就介紹到這了,更多相關k8s實現(xiàn)pod自動擴縮容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • IPVS下CoreDNS滾動更新解析失敗原理探究

    IPVS下CoreDNS滾動更新解析失敗原理探究

    這篇文章主要為大家介紹了IPVS下CoreDNS滾動更新解析失敗原理探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • k8s中如何實現(xiàn)pod自動擴縮容詳解

    k8s中如何實現(xiàn)pod自動擴縮容詳解

    在實際生產(chǎn)系統(tǒng)中,經(jīng)常會遇到某個服務需要擴容的場景,可能會遇到由于資源緊張或者工作負載降低而需要減少服務實例數(shù)量的場景,下面這篇文章主要給大家介紹了關于k8s中如何實現(xiàn)pod自動擴縮容的相關資料,需要的朋友可以參考下
    2022-08-08
  • 關于k8s?使用?Service?控制器對外暴露服務的問題

    關于k8s?使用?Service?控制器對外暴露服務的問題

    這篇文章主要介紹了k8s使用Service控制器對外暴露服務,包括部署deploy,部署?service及查看?service?和?pod?的關系,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • 詳解consul的安裝和配置

    詳解consul的安裝和配置

    這篇文章主要介紹了詳解consul的安裝和配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 云原生Kubernetes初始化容器Init使用教程

    云原生Kubernetes初始化容器Init使用教程

    這篇文章主要為大家介紹了云原生Kubernetes初始化容器Init使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步早日升職加薪
    2022-03-03
  • kubelet為cadvisor添加namespace/pod/container標簽示例詳解

    kubelet為cadvisor添加namespace/pod/container標簽示例詳解

    這篇文章主要為大家介紹了kubelet為cadvisor添加namespace/pod/container標簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • K8S部署lnmp項目全過程

    K8S部署lnmp項目全過程

    這篇文章主要介紹了K8S部署lnmp項目全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • kubectl?命令詳解

    kubectl?命令詳解

    這篇文章主要介紹了kubectl?命令的相關資料,包括常用命令,基本命令和使用說明,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • Jenkins打包、發(fā)布、部署完整驟記錄

    Jenkins打包、發(fā)布、部署完整驟記錄

    這篇文章主要介紹了Jenkins的基本概念,服務器環(huán)境檢查,以及如何安裝和配置Jenkins,包括安裝FTP服務、Maven、Git和Jenkins本身,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Kubernetes(K8S)基礎知識

    Kubernetes(K8S)基礎知識

    本文詳細講解了Kubernetes(K8S)的基礎知識,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04

最新評論

澄迈县| 新郑市| 兴安县| 尼木县| 班戈县| 尼玛县| 凤冈县| 平凉市| 托克逊县| 永泰县| 通河县| 循化| 瑞安市| 衡南县| 大洼县| 连南| 大英县| 普定县| 兰溪市| 门头沟区| 凤冈县| 五河县| 南皮县| 海丰县| 东宁县| 灵石县| 金华市| 柳州市| 北宁市| 上思县| 天镇县| 勐海县| 邓州市| 永清县| 改则县| 谷城县| 阿克苏市| 河南省| 临高县| 新疆| 云安县|