k8s 使用HPA 进行弹性扩容pod节点,

弹性扩容分为三种,内存,cpu,自定义指标:

使用hpa之前要进行添加Kubernetes Metrics Server 从集群中的 kubelets 收集资源指标
这个的安装请自行百度,可以考虑官网文档:https://github.com/kubernetes-sigs/metrics-server#deployment

基于CPU进行弹性扩容pod节点:

概述:当一个业务压力过大的时候可能出现一系列问题,所有k8s引用了一个hpa的概念进行弹性扩容,pod节点,cpu只是参考的一种,建议按照业务情况进行选择

yaml文件:

vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment   # k8s的资源类型
metadata:
  name: nginx     # deploy的名字
spec:
  selector:
    matchLabels:
      app: nginx # deploy的标签
  replicas: 1     # 副本数
  template:
    metadata:
      labels:
        app: nginx # 管理的pod节点的标签
    spec:
      containers:
      - name: nginx    # images的名字
        image: nginx   # nginx的地址
        ports:
        - containerPort: 80 # pod暴露的端口号
        resources:
          limits:
            cpu: 500m # cpu配置,添加cpu之类也是为了使用hpa进行弹性扩容,生成环境中配置的更加麻烦,这边把yaml进行简单化,方便进行理解。
          requests:
            cpu: 200m # cpu配置

开始进行配置HPA

kubectl autoscale deployment nginx  --cpu-percent=50 --min=1 --max=10 --dry-run=client  -oyaml  # 整体的这个命令相当于当cpu使用率到达50%的时候进行弹性扩容,最高扩容到10个版本,最低缩容到1个版本, 后面的 --dry-run=client  -oyaml 的意思是进行输出成一个yaml,这边方便进行查看 ## 注意HPA有命名空间隔离性
[root@hecs-266792 HPA]# kubectl autoscale deployment nginx  --cpu-percent=50 --min=1 --max=10 --dry-run=client  -oyaml
apiVersion: autoscaling/v1   # hpa的版本
kind: HorizontalPodAutoscaler  # 资源类型
metadata:
  creationTimestamp: null  
  name: nginx   # hpa的名称,可以使用kubectl get hpa 进行查看到的
spec:
  maxReplicas: 10    # 弹性扩容的最大副本数
  minReplicas: 1     # 弹性缩容的最小副本数
  scaleTargetRef:
    apiVersion: apps/v1   # deploy的版本可以使用kubectl api-resources |grep deploy进行查看到
    kind: Deployment  # deploy的资源  
    name: nginx    # deploy的名称
  targetCPUUtilizationPercentage: 10
status:
  currentReplicas: 0
  desiredReplicas: 0

配置完整之后,咱们这边可以进行测试一下,是否达到效果:

[root@hecs-266792 HPA]# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
nginx-5fc6fd5469-bwls6   1/1     Running   0          47h   172.20.255.221   hecs-266792              
[root@hecs-266792 HPA]# cat lll.sh 
#!/bin/bash
a=0
while [ $a -le 10 ]
do 
 curl  http://172.20.255.221 
echo "正常测试" 
done


进行执行lll.sh并进行观察pod是否进行扩容成功:
[root@hecs-266792 HPA]# kubectl top po 
NAME                     CPU(cores)   MEMORY(bytes)   
nginx-5fc6fd5469-bwls6   31m          3Mi             
[root@hecs-266792 HPA]# kubectl get po 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5fc6fd5469-bwls6   1/1     Running   0          47h
nginx-5fc6fd5469-ffgzm   0/1     Pending   0          31s
nginx-5fc6fd5469-jssll   1/1     Running   0          31s
[root@hecs-266792 HPA]# kubectl get hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   15%/10%   1         10        3          51s
发现已经进行扩容成功了,扩容到了3个,后面还会进行扩容,这边就暂停演示了,当压力降低的时候就回把刚刚扩容的进行弹性缩容
[root@hecs-266792 HPA]# kubectl get po 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5fc6fd5469-bwls6   1/1     Running   0          47h
nginx-5fc6fd5469-ffgzm   0/1     Pending   0          2m12s
nginx-5fc6fd5469-jssll   1/1     Running   0          2m12s
[root@hecs-266792 HPA]# kubectl get hpa # 注意默认检测时间是5分钟,此参数是可以进行修改的
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/10%    1         10        3          2m52s

基于内存进行弹性扩容pod节点:

deploy的yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
            memory: 1000Mi
          requests:
            cpu: 200m
            memory: 1000Mi
# hpa的yaml,这边配置和cpu和内存的2方式进行扩容,作为参考
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx  # hpa的名字,可以使用kubectl get hpa 进行查看的
spec:
  scaleTargetRef:
    apiVersion: apps/v1   # deploy的版本可以使用kubectl api-resources |grep deploy进行查看到
    kind: Deployment      # deploy资源
    name: nginx           # deploy名称
  minReplicas: 1          # 最小副本数  
  maxReplicas: 10         # 最大副本数
  metrics:                # 采集的类型
  - type: Resource        #   资源
    resource:
      name: cpu           # cpu资源
      targetAverageUtilization: 80  # cpu使用率到达80%
  - type: Resource        # 资源
    resource:
      name: memory        # 内存资源
      targetAverageValue: 30Mi    # 当使用内存到达30M的是时候就是

进行验证是否扩容成功:
进入pod中:kubectl exec -it nginx-664fc7cf5f-s6bsg – sh
进入之后执行:
dd if=/dev/zero of=/1.txt # 执行几分钟之后,进行退出ctrl+c即可
进行打开1.txt文件
cat 1.txt
k8s 使用HPA 进行弹性扩容pod节点,_第1张图片

[root@hecs-266792 HPA]# kubectl get po && kubectl top po && kubectl get hpa
# 这边pod处于Pending的状态是因为我服务器内存不够导致的
NAME                     READY   STATUS    RESTARTS   AGE
nginx-664fc7cf5f-2g7k2   0/1     Pending   0          12m
nginx-664fc7cf5f-bln2l   0/1     Pending   0          12m
nginx-664fc7cf5f-cnjkw   0/1     Pending   0          12m
nginx-664fc7cf5f-p6zxt   0/1     Pending   0          12m
nginx-664fc7cf5f-s6bsg   1/1     Running   0          34m
nginx-664fc7cf5f-slw7c   0/1     Pending   0          12m
nginx-664fc7cf5f-spn5j   0/1     Pending   0          12m
nginx-664fc7cf5f-vjxhp   0/1     Pending   0          12m
nginx-664fc7cf5f-z4dbl   0/1     Pending   0          12m
nginx-664fc7cf5f-zn6d4   0/1     Pending   0          12m
NAME                     CPU(cores)   MEMORY(bytes)   
nginx-664fc7cf5f-s6bsg   0m           418Mi           
NAME    REFERENCE          TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   438513664/30Mi   1         10        10         28m

# 发现是可以进行弹性扩容的

使用自定义的监控指标进行弹性扩容:

这个后期会进行更新

你可能感兴趣的:(k8s,linux,kubernetes,docker,运维)