16-Kubernetes-Pod控制器详解-Horizontal Pod Autoscaler(HPA)

Pod控制器详解-Horizontal Pod Autoscaler

      • 前言
      • Horizontal Pod Autoscaler
        • 安装metrics-server
        • 准备deployment和servie
        • 部署HPA
        • 测试


前言

  • 本篇来学习Pod控制器-Horizontal Pod Autoscaler

Horizontal Pod Autoscaler

HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

16-Kubernetes-Pod控制器详解-Horizontal Pod Autoscaler(HPA)_第1张图片

安装metrics-server
# 安装git
yum install git -y

# 获取metrics-server, 注意使用的版本
[root@master ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
# 修改deployment, 注意修改的是镜像和初始化参数
[root@master ~]# cd /root/metrics-server/deploy/1.8+/
[root@master ~]# vim metrics-server-deployment.yaml

按图中添加下面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP


# 安装metrics-server
[root@master 1.8+]# kubectl apply -f ./
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged
serviceaccount/metrics-server unchanged
deployment.apps/metrics-server created
service/metrics-server unchanged
clusterrole.rbac.authorization.k8s.io/system:metrics-server unchanged
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server unchanged

# 查看pod
[root@master 1.8+]# kubectl get pod -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-6b976979db-jwqms   1/1     Running   0          8m35s

# 查看资源使用情况
[root@master 1.8+]# kubectl top node
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   158m         7%     1020Mi          59%
node1    35m          1%     423Mi           24%
node2    47m          2%     408Mi           23%
node3    55m          2%     440Mi           25%

[root@master 1.8+]# kubectl top pod -n kube-system
NAME                              CPU(cores)   MEMORY(bytes)
coredns-6955765f44-rb6mz          5m           5Mi
etcd-master                       17m          76Mi
kube-apiserver-master             45m          321Mi
kube-controller-manager-master    34m          57Mi
kube-flannel-ds-m8scb             3m           41Mi
kube-flannel-ds-nstpr             2m           49Mi
kube-flannel-ds-v46tp             2m           23Mi
kube-proxy-4r8jh                  1m           14Mi
kube-proxy-5v5qn                  1m           13Mi
kube-proxy-s4fw2                  1m           15Mi
kube-proxy-tk5bx                  1m           22Mi
kube-scheduler-master             4m           25Mi
metrics-server-6b976979db-jwqms   1m           11Mi

16-Kubernetes-Pod控制器详解-Horizontal Pod Autoscaler(HPA)_第2张图片

  • metrics-server-deployment.yaml 文件修改后如下:
---
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:
      hostNetwork: true
      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/google_containers/metrics-server-amd64:v0.3.6
        imagePullPolicy: Always
        args:
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
准备deployment和servie

创建pc-hpa-pod.yaml文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  strategy: # 策略
    type: RollingUpdate # 滚动更新策略
  replicas: 1
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        resources: # 资源配额
          limits:  # 限制资源(上限)
            cpu: "1" # CPU限制,单位是core数
          requests: # 请求资源(下限)
            cpu: "100m"  # CPU限制,单位是core数
# 创建deployment
[root@master 1.8+]# kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev

# 创建service
[root@master 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev
service/nginx exposed
# 查看
[root@master 1.8+]# kubectl get deployment,pod,svc -n dev
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx    1/1     1            1           20s

NAME                          READY   STATUS    RESTARTS   AGE
pod/nginx-778cb5fb7b-2q6zf    1/1     Running   0          19s


NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx   NodePort   10.110.69.156   <none>        80:31898/TCP   8s

部署HPA

创建pc-hpa.yaml文件,内容如下:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: pc-hpa
  namespace: dev
spec:
  minReplicas: 1  #最小pod数量
  maxReplicas: 10 #最大pod数量
  targetCPUUtilizationPercentage: 3 # CPU使用率指标
  scaleTargetRef:   # 指定要控制的nginx信息
    apiVersion:  /v1
    kind: Deployment
    name: nginx
# 创建hpa
[root@master ~]# kubectl create -f pc-hpa.yaml
horizontalpodautoscaler.autoscaling/pc-hpa created
# 查看hpa
[root@master ~]# kubectl get hpa -n dev
NAME     REFERENCE          TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
pc-hpa   Deployment/nginx   <unknown>/3%   1         10        0          11m

测试

使用压测工具对service地址192.168.96.100:31898进行压测,然后通过控制台查看hpa和pod的变化

# hpa变化
[root@master ~]#  kubectl get hpa -n dev -w

# deployment变化
[root@master ~]# kubectl get deployment -n dev -w

# pod变化
[root@master ~]# kubectl get pods -n dev -w

你可能感兴趣的:(#,Kubernetes,kubernetes)