菜鸟学Kubernetes(K8s)系列——(番外)实现Deployment的动态扩缩容能力(HPA)


Kubernetes系列文章主要内容
菜鸟学Kubernetes(K8s)系列——(一)关于Pod和Namespace通过本文你将学习到:
(1)什么是Pod,为什么需要它、如何创建Pod、Pod的健康检查机制(三种探针)
(2)什么是标签、标签选择器
(3)什么是Namespace、他能做什么、如何创建它等等
菜鸟学Kubernetes(K8s)系列——(二)关于Deployment、StatefulSet、DaemonSet、Job、CronJob通过本文你将学习到:
(1)什么是Deployment,如何创建它、它的扩缩容能力是什么、自愈机制,滚动升级全过程、如何进行回滚
(2)什么是ReplicaSet、它和Deployment的关系是什么
(3)动态扩缩容能力(HPA)、蓝绿部署、金丝雀部署
(4)什么是DaemonSet/Job/CronJob、它们的功能是什么、如何创建使用等等
菜鸟学Kubernetes(K8s)系列——(三)关于Service、Ingress通过本文你将学习到:
(1)什么是Service,如何创建它、它的服务发现能力、对外暴露方式
(2)什么是NodePort类型的Service,它的使用方式、工作原理
(3)什么是Ingress,如何创建它、为什么需要Ingress
(4)什么的Ingress-Nginx、他和Nginx是什么关系、Ingress的各种功能
(5)什么是headless服务等等
菜鸟学Kubernetes(K8s)系列——(四)关于Volume卷(PV、PVC、StorageClass等)通过本文你将学习到:
(1)什么是Volume卷、它的几种类型(emptyDir、hostPath、NFS)、这几种类型是使用方式
(2)什么是PV-PVC、为什么要用他们、他们是怎么协作的、如何使用PV-PVC
(3)动态配置持久卷是什么,它是怎么工作的、如何实现动态的分配PV等等
菜鸟学Kubernetes(K8s)系列——(五)关于ConfigMap和Secret通过本文你将学习到:
(1)什么是ConfigMap,如何创建它、它能用来做什么事情、在实战中怎么使用ConfigMap
(2)什么是Secret,如何创建它,怎么使用它等等
菜鸟学Kubernetes(K8s)系列——(七)关于Kubernetes底层工作原理通过本文你将学习到:
(1)Kubernetes的核心组件:Etcd、Api-Server、Scheduler、Controller-Manager、Kubelet、Kube-proxy的工作方式,工作原理。
(2)Kubernetes集群中核心组件的协作方式、运行原理。
菜鸟学Kubernetes(K8s)系列——(八)关于Kubernetes的认证机制(RBAC)通过本文你将学习到:
(1)Api-Server的认证授权流程(2)什么是ServiceAccount(3)什么是Role、ClusterRole、RoleBinding、ClusterRoleBinding,如何使用他们,他们之间是如何关联协作的。等等
菜鸟学Kubernetes(K8s)系列——(番外)安装Ingress-Nginx(工作原理)通过本文你将学会安装Ingress-Nginx

我们知道通过Deployment可以对Pod副本数进行动态扩缩容,但是这毕竟还是需要人为检测我们部署的服务的压力状况,然后去手动调整Pod的副本数量。**在Kubernetes中,有一种感知能力,可以在请求高峰期的时候动态扩容Pod的数量,在高峰期过去后动态缩容。**完全不需要人为干预。

想要实现动态扩缩容需要先准备一个Metrics服务器,这个服务器可以监控当前系统的指标。

安装Metrics

  • 首先部署下面的资源(下面文件做了一些特殊修改,比如修改镜像地址等,可以直接使用)

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        k8s-app: metrics-server
        rbac.authorization.k8s.io/aggregate-to-admin: "true"
        rbac.authorization.k8s.io/aggregate-to-edit: "true"
        rbac.authorization.k8s.io/aggregate-to-view: "true"
      name: system:aggregated-metrics-reader
    rules:
    - apiGroups:
      - metrics.k8s.io
      resources:
      - pods
      - nodes
      verbs:
      - get
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        k8s-app: metrics-server
      name: system:metrics-server
    rules:
    - apiGroups:
      - ""
      resources:
      - nodes/metrics
      verbs:
      - get
    - apiGroups:
      - ""
      resources:
      - pods
      - nodes
      verbs:
      - get
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server-auth-reader
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: extension-apiserver-authentication-reader
    subjects:
    - kind: ServiceAccount
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server:system:auth-delegator
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:auth-delegator
    subjects:
    - kind: ServiceAccount
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      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
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server
      namespace: kube-system
    spec:
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: https
      selector:
        k8s-app: metrics-server
    ---
    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:
          nodeName: k8s-node1   ### 新增,为master节点的hostname
          containers:
          - args:
            - --cert-dir=/tmp
            - --secure-port=4430   ### 由原来的4443改为4430
            - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname ### 进行了修改,添加InternalDNS、ExternalDNS
            - --kubelet-use-node-status-port
            - --metric-resolution=15s
            - --kubelet-insecure-tls  ### 新增
            image: bitnami/metrics-server:0.6.1
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /livez
                port: https
                scheme: HTTPS
              periodSeconds: 10
            name: metrics-server
            ports:
            - containerPort: 4430        ### 由原来的4443改为4430
              name: https
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /readyz
                port: https
                scheme: HTTPS
              initialDelaySeconds: 20
              periodSeconds: 10
            resources:
              requests:
                cpu: 100m
                memory: 200Mi
            securityContext:
              allowPrivilegeEscalation: false
              readOnlyRootFilesystem: true
              runAsNonRoot: true
              runAsUser: 1000
            volumeMounts:
            - mountPath: /tmp
              name: tmp-dir
          nodeSelector:
            kubernetes.io/os: linux
          priorityClassName: system-cluster-critical
          serviceAccountName: metrics-server
          volumes:
          - emptyDir: {}
            name: tmp-dir
    ---
    apiVersion: apiregistration.k8s.io/v1
    kind: APIService
    metadata:
      labels:
        k8s-app: metrics-server
      name: v1beta1.metrics.k8s.io
    spec:
      group: metrics.k8s.io
      groupPriorityMinimum: 100
      insecureSkipTLSVerify: true
      service:
        name: metrics-server
        namespace: kube-system
      version: v1beta1
      versionPriority: 100
    
    
  • kubectl apply -f metrics.yaml 即可

  • 测试:kubectl top node

    • 这里可能会报错
    Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
    
    • 解决

      • 在/etc/kubernetes/manifests 里面改一下apiserver的配置

        • vim /etc/kubernetes/manifests/kube-apiserver.yaml

        • 在command下新增 - --enable-aggregator-routing=true
          在这里插入图片描述

        • kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

        • kubectl delete pods kube-apiserver -n kube-system

        • kubectl apply -f metrics.yaml

动态扩缩容的原理

在这里插入图片描述

首先Deployment会控制一个RS,RS控制各个Pod。Kubernetes通过HPA资源来实现实现对目标资源的监控,然后自动扩缩容。

Logo

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

更多推荐