1 . HPA介绍

HPA,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。

Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

实际生产中,广泛使用这四类指标:

Resource metrics - CPU核内存利用率指标
Pod metrics - 例如网络利用率和流量
Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

2. HPA实例

2.1. 运行php-apache 服务器

首先拉取需要的镜像,上传到私有仓库

docker pull mirrorgooglecontainers/hpa-example
docker tag mirrorgooglecontainers/hpa-example reg.westos.org/library/hpa-example
docker push reg.westos.org/library/hpa-example

在这里插入图片描述

我们创建一个存放hpa文件的目录

cd
mkdir hpa
cd hpa/
vim deploy.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: hpa-example
        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

执行hpa-apache.yaml 清单,并查看信息:

kubectl apply -f hpa-apache.yaml 
kubectl  get svc php-apache
kubectl  get pod

在这里插入图片描述
访问生成的IP

curl  10.244.179.80

在这里插入图片描述

2.2. 创建 Horizontal Pod Autoscaler

php-apache 服务器已经运行,我们将通过 kubectl autoscale 命令创建 Horizontal Pod Autoscaler。 以下命令将创建一个 Horizontal Pod Autoscaler 用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右(由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核)。自动扩缩完成副本数量的改变可能需要几分钟的时间。Hpa会根据Pod的CPU使用率动态调节Pod的数量

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

kubectl get hpa
 kubectl top pod

在这里插入图片描述

2.3. 增加负载

kubectl run -i --tty load-generator --rm --image=busyboxplus --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://php-apache; done"

因为执行命令后,会一直在运作,所以我们需要再打开一个终端来查cpu的战用量信息:
查看pod,top,hpa的信息
Hpa会根据Pod的CPU使用率动态调节Pod的数量。

kubectl top pod  
kubectl top hpa

在这里插入图片描述

我们不断查看他们的信息,可以看到hpa会自动扩容replicas,从开始的一个到最后八个!继续等待会开到最大程度.
top pod节点也逐渐开启,负载越来越大!
在这里插入图片描述

我们打断负载(ctrl + c)后

hpa会自动缩容,但是缩的速度比扩的速度慢很多,等待一段时间之后,就可以看到节点又降低了!!

kubectl get hpa
kubectl get pod

在这里插入图片描述

2.4. 基于多项指标的自动扩缩

HPA伸缩过程:
收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
对比在扩容条件里记录的cpu限额(CPUUtilization)
调整实例数(必须要满足不超过最大/最小实例数)
每隔30s做一次自动扩容的判断
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。

HPA进行伸缩算法:
计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
ceil()表示取大于或等于某数的最近一个整数
每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。
当前Pod Cpu使用率与目标使用率接近时,不会触发扩容或缩容:
触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9

vi hpav2.yaml


apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-example
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-example
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue: 100Mi
        type: AverageValue
 kubectl apply -f hpav2.yaml 

3. Helm

Helm是Kubernetes 应用的包管理工具,主要用来管理 Charts,类似Linux系统的yum。

Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。

对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。

对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。

Helm V3 与 V2 最大的区别在于去掉了tiller:

创建目录用来存放helm的配置文件
设置helm的环境变量

mkdir helm
cd helm/
tar zxf helm-v3.7.1-linux-amd64.tar.gz  
cd linux-amd64/
mv helm /usr/local/bin/   ##设置环境变量

设置补齐命令,这样在使用指令的时候会很方便
helm 然后按tab建可以补齐就OK
cd
echo “source <(helm completion bash)” >> ~/.bashrc ##设置补齐命令
source .bashrc
helm
在这里插入图片描述

添加仓库

helm repo add bitnami https://charts.bitnami.com/bitnami 

3.1. 实验:部署nginx

从仓库中拉取nginx文件

helm search repo redis
helm pull bitnami/nginx

拉取下来的是tar包解压它
将拉取得包移到helm/里面方便管理,将前面helm的包删掉!

mv nginx-9.5.12.tgz helm/
cd helm/
rm -fr linux-adm64/  helm-v3.7.1-linux*

tar zxf redis-cluster-6.3.2.tgz
cd nginx

编辑文件

vi values.yaml

只需要将仓库名写进去
在这里插入图片描述

查看sc
将之前实验的pvc都删掉!

kubectl get sc
kubectl get pvc
kubectl delete deployments.apps php-apache
kubectl delete hpa php-example
kubectl delete pvc --all

在这里插入图片描述

接下来我们需要将需要的镜像nginx拉取下来
首先需要在自己的私有仓库中新建项目bitnami,一定要选择公开!

server1上拉取镜像,并上传

docker pull bitnami/nginx:1.21.3-debian-10-r50
docker tag docker.io/bitnami/nginx:1.21.3-debian-10-r50 reg.westos.org/bitnami/nginx:1.21.3-debian-10-r50
docker push reg.westos.org/bitnami/nginx:1.21.3-debian-10-r50 

在这里插入图片描述

安装测试:
查看pod节点,可以看到redis-cluster节点已经拉起了!

 helm install nginx .
  kubectl get pod

在这里插入图片描述

可以看到svc已经出现了nginx
在这里插入图片描述测试:
curl 172.25.76.11
在这里插入图片描述

接着卸载nginx

helm uninstall nginx

3.2. 搭建Helm Chart

3.2.1创建chart

cd helm/
helm  create mychart   ##创建

进入刚才创建的mychart中
cd mychart/
先修改values.yaml文件,修改镜像为myapp
vi values.yaml

repository: myapp
  tag: "v1"

修改打包文件Chart.yaml

vi Chart.yaml

appVersion: v1

修改之后用helm lint .查看是否正确
helm lint .
在这里插入图片描述

在harbor仓库公开新建项目charts
将mychart打包上传到这

cd ..
helm package mycart/
helm repo add local https://reg.westos.org/chartrepo/charts
  ## chartrepo是默认地址必须加

在添加的时候报错了因为没有证书,我们需要添加证书:
在这里插入图片描述

cd /etc/pki/ca-trust/source/anchors/
cp etc/docker/certs.d/reg.westos.org/ca.crt .

添加证书之后要更新,不然还是无法添加:

update-ca-trust
helm repo add local https://reg.westos.org/chartrepo/charts

如果还是不行并出现如下报错是因为证书本身的问题 则我们只能
在这里插入图片描述helm repo add local https://reg.westos.org/chartrepo/charts --insecure-skip-tls-verify

helm repo list  ##列出仓库
cd /root/helm/

在这里插入图片描述

接着需要上传包,所以需要安装push的插件
有两种安装方式,在线/离线安装,因为在线速度较慢,所以本人选择离线安装!

在线安装

helm plugin install https://github.com/chartmuseum/helm-push

离线安装

helm env	//获取插件目录

在这里插入图片描述

mkdir ~/.local/share/helm/plugins/push
tar zxf helm-push_0.10.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/push

上传helm

helm cm-push mychart-0.1.0.tgz local -u admin -p westos --insecure

上传之后更新仓库并查看

helm  repo  update 	local      ##更新仓库
helm  search repo mychart   ##搜索

在这里插入图片描述

现在可以可以下载上传的仓库了!

helm install nginx local/mychart --insecure-skip-tls-verify
helm list
kubectl get svc
curl  ******* #访问生成的IP

在这里插入图片描述可以看到访问结果为myapp:v1代表成功

3.2.2 版本更新

设置image的tag为v2,修改打包的版本

cd mychart/
vi values.yaml  ##设置image的tag为v2
tag: "v2"

vi Chart.yaml # 修改打包的版本
version: 0.2.0
appVersion: v2

打包并上传,更新仓库

 cd ..
 helm lint mychart #查看是否出错
helm package mychart
helm cm-push mychart-0.2.0.tgz local --insecure -u admin -p westos
helm repo update

查看仓库mychart的版本,加 -L之后可以查看到全部的版本!

 helm search repo mychart
 helm search repo mychart -l 

在这里插入图片描述

更新版本,并查看svc,访问ip

helm upgrade nginx local/mychart --insecure-skip-tls-verify
kubectl get svc
curl ******
可以看到已经更新为v2版本!!
在这里插入图片描述

3.2.3 回滚

查看mychart的历史,回滚到第一个版本,再次访问IP

helm history nginx
helm rollback nginx 1
helm history nginx
kubectl get svc
curl ********

可以看到又回到了v1版本
在这里插入图片描述

3.3. Helm部署nfs

在外网hub先搜索nfs-subdir-external-provisioner,将仓库加入本地,再此查看本地仓库可以看到 nfs-subdir-external-provisioner即可

helm search  hub nfs-subdir-external-provisioner  ##外网搜索
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm search repo nfs-subdir-external-provisioner ##本地

新建目录用来放配置文件,拉取nfs文件

cd /root/helm
mkdir nfs-subdir-external-provisioner
cd nfs-subdir-external-provisioner/
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner 
tar zxf nfs-subdir-external-provisioner-4.0.14.tgz
cd nfs-subdir-external-provisioner/

仓库内需要此项目sig-storage
在这里插入图片描述

修改values.yaml文件

vi values.yaml

 repository: sig-storage/nfs-subdir-external-provisioner
 tag: v4.0.2
 server: 172.25.76.5
  path: /nfsdata
  
 defaultClass: true
 archiveOnDelete: false #若是true则 在删除pvc后留个备份

在这里插入图片描述
在这里插入图片描述

将之前实验的nfs记录namespace清除

cd /root/volumes/
cd nfs/
kubectl delete -f nfs-client-provisioner.yaml
kubectl get ns

在这里插入图片描述

kubectl -n  nfs-client-provisioner get all
kubectl delete pvc --all
kubectl delete pv --all

将前面实验的mychart清除

helm list --all-namespaces
helm uninstall nginx

创建一个namespace,安装nfs

kubectl create namespace nfs-client-provisioner
cd /root/helm/nfs-subdir-external-provisioner/nfs-subdir-external-provisioner/
helm install nfs-client-provisioner . -n nfs-client-provisioner
kubectl -n nfs-client-provisioner get all
kubectl get sc

在这里插入图片描述

测试
之前实验有一个pvc的清单文件:
cd /root/volumes/nfs/
cat pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  #storageClassName: managed-nfs-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

执行清单并查看pvc

kubectl apply -f pvc.yaml
kubectl get pvc

在server5中查看
在这里插入图片描述

kubectl delete -f pvc.yaml
kubectl get pvc
kubectl get pv

在这里插入图片描述
在这里插入图片描述

3.4.Helm部署metrics-server

首先拉取需要的文件:

cd /root/helm/
helm pull bitnami/metrics-server
tar zxf metrics-server-5.10.7.tgz
cd  metrics-server/

vi values.yaml
imageRegistry: "reg.westos.org"
apiService:
  create: true

在这里插入图片描述
在测试之前先将之前做的metrics-server清除

cd /root/metrics-server/
kubectl delete -f components.yaml

创建namespace: metrics-server
kubectl create namespace metrics-server

在server5上拉取需要的镜像,修改标签,上传到私有仓库

docker pull bitnami/metrics-server:0.5.1-debian-10-r30
docker tag docker.io/bitnami/metrics-server:0.5.1-debian-10-r30 reg.westos.org/bitnami/metrics-server:0.5.1-debian-10-r30
docker push reg.westos.org/bitnami/metrics-server:0.5.1-debian-10-r30

在这里插入图片描述

用helm安装metrics-server

helm install metrics-server . -n metrics-server

查看log后若出现此类报错
在这里插入图片描述则需要作解析
kubectl -n kube-system edit cm coredns

data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        hosts {
           172.25.76.1 server1
           172.25.76.2 server2
           172.25.76.3 server3
           fallthrough
        }
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

测试:
可以看到节点的top信息

kubectl top node

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐