从Kubernetes 1.11开始,不推荐从Heapster获取指标。

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod


k8s的statefulset怎么在线扩容 k8s扩容pod_php_02

metrics-server目前支持的api版本

  • autoscaling/v1
  • autoscaling/v2beta1
  • autoscaling/v2beta2
我这边镜像/yaml上传到码云仓库,直接拉取创建即可。但不建议这样熟悉下操作流程与问题最好。
git clone  https://gitee.com/cainiao555/metrics-server.git && \
cd metrics-server && \
docker load < metrics-server.tar.gz && \
kubectl apply -f components.yaml

一、下载metrics-server插件

metrics-server插件

git clone  https://github.com/kubernetes-sigs/metrics-server.git

你会发现git下来速度比较慢,直接找需要的文件吧,登录到github上找到components.yaml文件

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_03

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_04


k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_05


OK,接下就是下载文件即可

wget  https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

二、修改下载下来的文件

1、修改components.yaml镜像名称

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_06

registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3

2、获取阿里的metrics-server-amd64镜像

获取容器服务的阿里云仓账号并且登录

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_07


k8s的statefulset怎么在线扩容 k8s扩容pod_apache_08


登录成功。

3、镜像加速

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://vgljcdk8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4、拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_09

三、生成metrics-server插件清单

1、执行yaml文件命令

kubectl  apply -f components.yaml

2、查看是否生成

kubectl  get  po,svc  -A |grep metrics-server

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_10

3、执行查看是否生效

kubectl top nodes

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_11


提示信息: error: metrics not available yet

4、修改components.yaml文件:

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_12

  • –kubelet-preferred-address-types -确定连接到特定节点的地址时使用的节点地址类型的优先级(默认[主机名,内部DNS,内部IP,外部DNS,外部IP]),直接使用节点IP地址获取数据
  • –kubelet-insecure-tls-不要验证Kubelets提供的服务证书的CA。仅用于测试目的,不验证客户端证书
  • –requestheader-client-ca-file -指定根证书捆绑包,以验证传入请求上的客户端证书。

最后components.yaml文件格式如下:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods", "nodes"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding        #集群绑定
metadata:
  name: metrics-server:system:auth-delegator   #集群绑定名称
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole             #集群角色名称
  name: system:auth-delegator   #允许代理身份认证和鉴权, 它通常用在插件式 API 服务器上,以实现统一的身份认证和鉴权。
subjects:
- kind: ServiceAccount          #绑定sa
  name: metrics-server          #sa的名称叫做metrics-server
  namespace: kube-system        #kube-system名称空间
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding               #角色绑定
metadata:
  name: metrics-server-auth-reader  #角色绑定名称
  namespace: kube-system            #名称空间
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role                        #角色
  name: extension-apiserver-authentication-reader #以你命令空间中的服务账号创建一个 Kubernetes 集群角色绑定,绑定到 extension-apiserver-authentication-reader 角色。 这将让你的扩展 api-server 能够访问 extension-apiserver-authentication configmap。
subjects:
- kind: ServiceAccount          #绑定sa
  name: metrics-server          #sa的名称叫做metrics-server
  namespace: kube-system        #kube-system名称空间
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
      # mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        image: registry.cn-hangzhou.aliyuncs.com/kubernets-imags/metrics-server-amd64:v0.3.3
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - --metric-resolution=30s
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
          - --logtostderr
        ports:
        - name: main-port
          containerPort: 4443
          protocol: TCP
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
      nodeSelector:
        kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: main-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system

再次执行

kubectl  apply -f components.yaml

四、kubernetes配置文件(超级注意点切勿修改)

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_13

五、等待几分钟再次执行

kubectl top nodes

k8s的statefulset怎么在线扩容 k8s扩容pod_php_14

六、Horizontal Pod Autoscaler 演示

Horizontal Pod Autoscaler 演练

1、定义了一个index.php 页面来执行一些 CPU 密集型计算:

vim  index.php
<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

2、定制 Docker 镜像

cat << EOF | tee php-apache.df
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
EOF
docker build  -f   php-apache.df  -t  phpapache:latest  ./

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_15

3、镜像分发给节点(没有上传镜像仓库,节点无法拉取镜像)

打包:

docker  save   phpapache:latest > phpapache.tar.gz

分发所有节点:

scp -r phpapache.tar.gz   用户@IP:绝对路径

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_16

4、无状态资源清单(HPA autoscaling/v1 API 版本)

vim deployment_pha.yaml
apiVersion: apps/v1      #api版本
kind: Deployment         #控制器
metadata:
  labels:
    app: phpapache
  name: phpapache               #Pod名称
spec:
  replicas: 3                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: phpapache            #必须匹配.spec.template.metadata标签相同,查看标签(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 3       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新
    rollingUpdate:              #滚动更新
      maxSurge: 1               #滚动升级时会先启动1个pod
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:
        app: phpapache             #必须匹配match .spec.selector.matchLabels标签相同。
    spec:
      terminationGracePeriodSeconds: 60  #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:                        #模板(容器模板)
      - image: phpapache:latest          #镜像名字
        name: phpapache                  #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
        imagePullPolicy: IfNotPresent    #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
        - name: phpapache                #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
          containerPort: 80              #容器开放的监听端口
        resources:                       #资源
          limits:                        #限制
            memory: 500Mi
            cpu: 200m                    #0.2代表200m
          requests:                      #请求
            memory: 250Mi
            cpu: 100m                    #0.1代表100m
      restartPolicy: Always              #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service                   #控制器
metadata:
  labels:
    app: phpapache              #svc的标签名称
  name: phpapache               #svc名称
spec:
  ports:
  - name: phpapache             #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    port: 80                    #Port 的请求端口
    protocol: TCP               #TCP协议
    targetPort: 80              #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
    nodePort: 30080             #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
  selector:
    app: phpapache              #具有标签"app=phpapache" 的Pod加入到该svc中
  type: NodePort                #对外集群的外部访问
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  targetCPUUtilizationPercentage: 10  #触发HPA值

5、资源清单生成

kubectl apply -f  deployment_pha.yaml

6、查看各资源信息(hpa、svc、pod)

kubectl  top pod && kubectl  get hpa

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_17

7、增加Pod负载

  • 获取svc的IP:
kubectl  get svc

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_18

  • 通过一个循环向 php-apache 服务器发送无限的查询请求
while true; do wget -q -O- http://10.99.144.228; done
  • 另外一个窗口观看情况

k8s的statefulset怎么在线扩容 k8s扩容pod_php_19

8、停止负载

输入 + C 来终止负载的产生。

然后我们可以再次查看负载状态(自动扩缩完成副本数量的改变可能需要几分钟的时间):

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_20

kubectl get hpa

这时,CPU 利用率已经降到1%,所以 HPA 将自动缩减副本数量至 3。

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_21

七、基于多项度量指标和自定义度量指标自动扩缩

自定义度量指标自动扩缩 利用 autoscaling/v2beta2 API 版本,你可以在自动扩缩 php-apache 这个 Deployment 时使用其他度量指标。

cpu测试:

1、新建文件目录

mkdir -p /root/kubernetes/HPA/metrics-server/hpav2beta2/cpu

2、书写资源清单

vim deployment_phav2_cpu.yaml
apiVersion: apps/v1      #api版本
kind: Deployment         #控制器
metadata:
  labels:
    app: phpapache
  name: phpapache               #Pod名称
spec:
  replicas: 3                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: phpapache            #必须匹配.spec.template.metadata标签相同,查看标签(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 3       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新
    rollingUpdate:              #滚动更新
      maxSurge: 1               #滚动升级时会先启动1个pod
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:
        app: phpapache             #必须匹配match .spec.selector.matchLabels标签相同。
    spec:
      terminationGracePeriodSeconds: 60  #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:                        #模板(容器模板)
      - image: phpapache:latest          #镜像名字
        name: phpapache                  #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
        imagePullPolicy: IfNotPresent    #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
        - name: phpapache                #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
          containerPort: 80              #容器开放的监听端口
        resources:                       #资源
          limits:                        #限制
            memory: 500Mi
            cpu: 200m                    #0.2代表200m
          requests:                      #请求
            memory: 250Mi
            cpu: 100m                    #0.1代表100m
      restartPolicy: Always              #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service                   #控制器
metadata:
  labels:
    app: phpapache              #svc的标签名称
  name: phpapache               #svc名称
spec:
  ports:
  - name: phpapache             #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    port: 80                    #Port 的请求端口
    protocol: TCP               #TCP协议
    targetPort: 80              #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
    nodePort: 30080             #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
  selector:
    app: phpapache              #具有标签"app=phpapache" 的Pod加入到该svc中
  type: NodePort                #对外集群的外部访问
---
apiVersion: autoscaling/v2beta2  #api版本 autoscaling/v2beta2
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource              #资源度量指标
    resource:
      name: cpu
      target:
        type: Utilization       #利用率
        averageUtilization: 10  #资源的百分比显示

3、生成资源清单

kubectl  apply -f deployment_phav2_cpu.yaml

4、增加Pod负载

while true; do wget -q -O- http://10.110.149.220; done

k8s的statefulset怎么在线扩容 k8s扩容pod_php_22

5、停止负载

如上结果,不多说明

k8s的statefulset怎么在线扩容 k8s扩容pod_php_23

内存测试:

1、新建文件目录

mkdir -p /root/kubernetes/HPA/metrics-server/hpav2beta2/mem

2、书写资源清单

  • configmap文件
vim configmapmem.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: increase-mem-config
data:
  increase-mem.sh: |
    #!/bin/bash
    mkdir /tmp/memory
    mount -t tmpfs -o size=500M tmpfs /tmp/memory
    dd if=/dev/zero of=/tmp/memory/block
    sleep 60
    rm /tmp/memory/block
    umount /tmp/memory
    rmdir /tmp/memory
  • deployment内存文件
vim deployment_phamem.yaml
apiVersion: apps/v1      #api版本
kind: Deployment         #控制器
metadata:
  labels:
    app: phpapache
  name: phpapache               #Pod名称
spec:
  replicas: 3                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: phpapache            #必须匹配.spec.template.metadata标签相同,查看标签(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 3       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新
    rollingUpdate:              #滚动更新
      maxSurge: 1               #滚动升级时会先启动1个pod
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:
        app: phpapache             #必须匹配match .spec.selector.matchLabels标签相同。
    spec:
      terminationGracePeriodSeconds: 60  #k8s将会给应用发送SIGTERM信号,可以用来正确、优雅地关闭应用,默认为30秒
      containers:                        #模板(容器模板)
      - image: phpapache:latest          #镜像名字
        #command: [ "bash","/etc/scrip/increase-mem.sh" ]
        name: phpapache                  #node节点启动的容器名字,容器名称(docker ps)查看格式k8s_容器名称_Pod名称
        imagePullPolicy: IfNotPresent    #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
        - name: phpapache                #SVC_名称,并且在pod中是唯一的(与svc的ports名称必须对应)
          containerPort: 80              #容器开放的监听端口
        resources:                       #资源
          limits:                        #限制
            memory: 500Mi
            cpu: 200m                    #0.2代表200m
          requests:                      #请求
            memory: 250Mi
            cpu: 100m                    #0.1代表100m
        volumeMounts:
        - name: increase-mem-script
          mountPath: /etc/scrip
        securityContext:                 #特权模式
          privileged: true
      volumes:
      - name: increase-mem-script
        configMap:
          name: increase-mem-config
      restartPolicy: Always              #重新启动pod中所有容器的策略
---
apiVersion: v1
kind: Service                   #控制器
metadata:
  labels:
    app: phpapache              #svc的标签名称
  name: phpapache               #svc名称
spec:
  ports:
  - name: phpapache             #服务中此端口的名称。这必须是DNS标签全部ServiceSpec中的端口必须具有唯一的名称(与Pod的ports名称必须对应)
    # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
    port: 80                    #Port 的请求端口
    protocol: TCP               #TCP协议
    targetPort: 80              #请求代理到使用TCP端口80,并且具有标签"app=phpapache" 的Pod上,默认情况下,targetPort 将被设置为与 port 字段相同的值。
    nodePort: 30080             #宿主机暴露的服务端口,默认情况下随机分配一个端口号(默认:30000-32767)
  selector:
    app: phpapache              #具有标签"app=phpapache" 的Pod加入到该svc中
  type: NodePort                #对外集群的外部访问
---
apiVersion: autoscaling/v2beta2  #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 10

3、 生成资源清单

kubectl  apply -f configmapmem.yaml  -f deployment_phamem.yaml

4、登录容器测试

kubectl  exec  -it phpapache-55d498fd68-mf5wz   -- sh  /etc/scrip/increase-mem.sh

k8s的statefulset怎么在线扩容 k8s扩容pod_php_24

5、观察HPA的更新过程

k8s的statefulset怎么在线扩容 k8s扩容pod_apache_25

其他查看官方简介

九、不同api版本HPA的yaml格式

百分比格式:

autoscaling/v1
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  targetCPUUtilizationPercentage: 10  #触发HPA值
autoscaling/v2beta1
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
      name: memory
      targetAverageUtilization: 50
autoscaling/v2beta2
apiVersion: autoscaling/v2beta2  #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler   #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 10
      name: cpu
      target:
        type: Utilization       #利用率
        averageUtilization: 20  #资源的百分比显示

显示值:

k8s的statefulset怎么在线扩容 k8s扩容pod_Pod_26

apiVersion: autoscaling/v2beta2  #autoscaling/v2beta2 的api
kind: HorizontalPodAutoscaler    #kind控制器
metadata:
  name: phpapache               #HPA的名字
spec:
  scaleTargetRef:
    apiVersion: apps/v1         #api版本
    kind: Deployment            #Deployment控制器
    name: phpapache             #Deployment控制器名字
  minReplicas: 3                #最小的副本数
  maxReplicas: 7                #最大的副本数
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: AverageValue       #利用率
        averageValue: 10         #资源的直接值显示

k8s的statefulset怎么在线扩容 k8s扩容pod_php_27