• Kubernetes资源对象解读之基于HPA实现Pod的自动扩缩容


    Pod

    Pod是kubernetes的最小操作单元,一个Pod里面可以包含多个容器(如Docker容器),每个容器共享Pod的网络、Volume等资源。

    Pod-配置文件示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      namespace: default
      labels:
        name: pod-demo-redis
    spec:
      containers:
        name: pod-demo-redis
        image: kubeguide/redis-master
        port: 6379
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Pod-配置文件解读

    • 创建一个name为pod-demo的pod资源对象
    • 命名空间为默认命名空间default
    • 为该pod定义一个标签为 name=pod-demo-redis的标签
    • 根据kubeguide/redis-master镜像创建一个name为pod-demo-redis的容器,且端口为6379。

    Deployment

    Deployment主要起到管理Pod部署的作用,包括后面的HPA也是通过监控Deployment的目的实现Pod的自动扩缩容。

    Deployment-配置文件示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pod-demo-redis
      labels:
        name: pod-demo-redis
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: pod-demo-redis
      template:
        metadata:
          labels:
            app: pod-demo-redis
        spec:
          containers:
            name: pod-demo-redis
            image: kubeguide/redis-master
            ports: 
              - containerPort: 6379
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Deployment-配置文件解读

    • 创建一个Deployment的资源对象,并且赋值name和labels(标签)为pod-demo-redis。
    • 选择器匹配带有label为pod-demo-redis的pod进行部署管理,并且保证kubernetes集群内这些被管理的pod至少要存在3个运行正常的pod(负载均衡)。
    • 定义标签为pod-demo-redis的pod模板,并且改pod内部运行redis容器,当集群数量少于3的时候,会根据template的模板创建pod知道达到replicas的值。

    Service

    Kubernetes的实现服发现离开不了Service资源对象,Service自带一种全局唯一的虚拟IP地址-ClusterIP,Kubernetes通过把ClusterIP和Service的name绑定在一起就能简单粗暴地解决了服务发现功能。例如在kubernetes集群内部,不同宿主机的Pod内部都可以使用serviceName:port实现访问,Service的创建往往依赖Pod。

    Service-配置文件示例

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-redis-service
    spec:
      selector:
        app: demo-boot-redis
      type: NodePort
      ports:
        - port: 8082
          targetPort: 8082
          protocol: TCP
          nodePort: 32088
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Service-配置文件解读

    创建一个Service类型的资源对象,并且name为demo-redis-service
    选择标签(label)为 app: pod-demo-redis 的Pod资源对象进行管理创建服务。
    该Service的端口类型为NodePort(可以直接通过宿主机的ip+nodePort访问),targetPort是用来确定提供该服务的容器的端口,Port是该Service的端口,通常设置targetPort和port一样。

    Volume

    Volume(存储卷)是Kubernetes的存储类资源对象,常用的类型有emptyDir和hostPath,其他类型有iscsi、nfs、glusterfs、rbd、gitRepo、configmap、sercret等。同一个Pod内部共享volume。

    Volume-配置文件示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pod-demo-redis
      labels:
        name: pod-demo-redis
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: pod-demo-redis
      template:
        metadata:
          labels:
            app: pod-demo-redis
        spec:
          containers:
            name: pod-demo-redis
            image: kubeguide/redis-master
            ports: 
              - containerPort: 6379
            volumeMounts:
              - name: demo-emptydir
                mountPath: /usr/demo-empty
              - name: demo-hostpath
                mountPath: /usr/logs
          volumes:
            - name: demo-emptydir
              emptyDir: {}
            - name: demo-hostpath
              hostPath:
                path: /usr/local/logs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Volume-配置文件解读

    • 在Deployment的示例中添加了2个volumes资源对象,并且类型依次为emptyDir和hostPath(主义hostPath的前提是宿主机存在/user/local/logs等文件路径)。
    • pod-demo-redis的Pod容器内部挂载这两个存储卷,挂载这两个存储卷之后,容器内部对该存储卷的内部修改会影响到对应的Volume资源。

    Ingress

    Ingress是Kubernetes的网关规则配置资源对象,需要和IngressController、实际的网关服务器(例如Nginx、Apisix等)等结合使用。Ingress负责管理Service的访问路由规则、IngressController用以实时监控资源对象Ingress、Service、Endpoint、Secret、Node、Sercret等变化,自动对Nginx进行对应操作。而实现具体的应用层负载均衡则有类似Nginx的服务器负责。

    Ingress的配置比较繁琐复杂、通常使用Helm进行配置,该单元另开文章讲述。

    HPA

    HPA全称HorizontalPodAutoscaler,是kubernetes里面的一种资源对象,主要作用是可以对Deployment的pod资源配置水平、垂直扩缩容。

    HPA-配置文件示例

    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: my-web-app-hpa
      namespace: default
    spec:
      maxReplicas: 10
      minReplicas: 1
      scaleTargetRef
        kind: Deployment
        name: my-web-app-deploy
      targetCPUUtilizationPercentage: 90
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    HPA-配置文件解读

    • 当前这个name为 my-web-app-hpa 的HPA资源对象控制的目标对象是一个name为 my-web-app-deploy 的Deployment里的Pod副本。
    • 当这些Pod副本里面的CPU利用率的值都超过90%时,会触发自动动态扩容,限定Pod的数量范围为1~10。

    ++参考书籍为《Kubernetes零基础快速入门》《Kubernetes权威指南》《Nginx应用与运维实战》++

  • 相关阅读:
    在 HBuilderX 中使用 tailwindcss
    LeetCode //C - 117. Populating Next Right Pointers in Each Node II
    机器学习实战—集成学习
    JavaScript ES6函数触发方式,解构和class构造函数
    android Room初步使用
    2021年中国研究生数学建模竞赛C题——帕金森病的脑深部电刺激治疗建模研究
    当三代测序遇到肿瘤基因组研究
    数据仓库及ETL的理论基础
    Java idea查看自定义注解的调用地方
    携职教育:注会和中级哪个在体制内有用?
  • 原文地址:https://blog.csdn.net/qq_36871369/article/details/128063862