[toc]

四、Horizontal Pod Autoscaler(HPA)

4.1 概述

我们已经可以通过手动执行kubectl scale命令实现Pod的扩缩容,但是这显然不符合kubernetes的定位目标–自动化和智能化。kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。

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

image.png

4.2 安装metrics-server(v0.3.6)

metrics-server可以用来收集集群中的资源使用情况。

获取metrics-server,需要注意使用的版本(https://www.yuque.com/attachments/yuque/0/2021/gz/513185/1611298743903-fa272977-b681-4f03-9268-4af1b0a4fb24.gz)):

wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.tar.gz

解压v0.3.6.tar.gz文件:

tar -zxvf v0.3.6.tar.gz

进入metrics-server-0.3.6/deploy/1.8+/目录:

cd metrics-server-0.3.6/deploy/1.8+/

修改metrics-server-deployment.yaml文件:

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

image.png

安装metrics-server:

kubectl apply -f ./

image.png

查看metrics-server生成的Pod:

kubectl get pod -n kube-system

image.png
镜像拉取失败,可以换到网络好点的地方,再进行尝试镜像拉取

查看资源使用情况:

kubectl top node

image.png

kubectl top pod -n kube-system

image.png

4.3 安装metrics-server(v0.4.1)

获取metrics-server:

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

修改components.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        # 修改部分
        - --kubelet-insecure-tls
        # 修改部分
        image: registry.cn-shanghai.aliyuncs.com/xuweiwei-kubernetes/metrics-server:v0.4.1

image.png

安装metrics-server:

kubectl apply -f components.yaml

image.png

4.4 准备Deployment和Service

创建Deployment:
创建nginx.yaml文件,内容如下:

apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
  name: nginx # deployment的名称
  namespace: dev # 命名类型
spec: # 详细描述
  selector: # 选择器,通过它指定该控制器可以管理哪些Pod
    matchLabels: # Labels匹配规则
      app: nginx-pod
  template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx # 容器名称
          image: nginx:1.17.1 # 容器需要的镜像地址
          ports:
            - containerPort: 80 # 容器所监听的端口
          resources: # 资源限制
            requests:
              cpu: "100m" # 100m表示100millicpu,即0.1个CPU
  • 创建Deployment:
kubectl create -f nginx.yaml

查看Deployment和Pod:

kubectl get pod,deploy -n dev

image.png

创建Service:
创建Service:

kubectl expose deployment nginx --name=nginx --type=NodePort --port=80 --target-port=80 -n dev
  • 查看Service:
kubectl get svc -n dev

image.png

4.5 部署HPA

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

apiVersion: autoscaling/v1 # 版本号
kind: HorizontalPodAutoscaler # 类型
metadata: # 元数据
  name: pc-hpa # deployment的名称
  namespace: dev # 命名类型
spec:
  minReplicas: 1 # 最小Pod数量
  maxReplicas: 10 # 最大Pod数量
  targetCPUUtilizationPercentage: 3 # CPU使用率指标
  scaleTargetRef:  # 指定要控制的Nginx的信息
    apiVersion: apps/v1
    kind: Deployment
    name: nginx

cpu使用率达到百分之三,就会进行自动扩容最小为1,最大为10

创建hpa:

kubectl create -f pc-hpa.yaml

查看hpa:

kubectl get hpa -n dev

image.png
<unknown>/2%:unknown为正在计算当前cpu使用率情况

4.6 测试

使用压测工具如Jmeter对service的地址http://192.168.18.100:32553进行压测,然后通过控制台查看hpa和pod的变化。

hpa的变化:

kubectl get hpa -n dev -w

image.png

Deployment的变化:

kubectl get deployment -n dev -w

image.png

Pod的变化:

kubectl get pod -n dev -w

image.png

五、DaemonSet(DS)

5.1 概述

DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。

image.png

DaemonSet控制器的特点:

  1. 每向集群中添加一个节点的时候,指定的Pod副本也将添加到该节点上。
  2. 当节点从集群中移除的时候,Pod也会被垃圾回收。

DaemonSet的资源清单:

apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
  name: # 名称
  namespace: #命名空间
  labels: #标签
    controller: daemonset
spec: # 详情描述
  revisionHistoryLimit: 3 # 保留历史版本
  updateStrategy: # 更新策略
    type: RollingUpdate # 滚动更新策略
    rollingUpdate: # 滚动更新
      maxUnavailable: 1 # 最大不可用状态的Pod的最大值,可用为百分比,也可以为整数
  selector: # 选择器,通过它指定该控制器管理那些Pod
    matchLabels: # Labels匹配规则
      app: nginx-pod
    matchExpressions: # Expressions匹配规则
      - key: app
        operator: In
        values:
          - nginx-pod
  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:1.17.1
           ports:
             - containerPort: 80

5.2 创建DaemonSet

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

apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
  name: pc-damonset # 名称
  namespace: dev #命名空间
spec: # 详情描述
  selector: # 选择器,通过它指定该控制器管理那些Pod
    matchLabels: # Labels匹配规则
      app: nginx-pod
  template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:1.17.1
           ports:
             - containerPort: 80

创建DaemonSet:

kubectl create -f pc-daemonset.yaml

5.3 查看DaemonSet

查看DaemonSet:

kubectl get ds -n dev -o wide

image.png

5.4 删除DaemonSet

删除DaemonSet:

kubectl delete ds pc-damonset -n dev

image.png

Q.E.D.


只有创造,才是真正的享受,只有拚搏,才是充实的生活。