1、概述

1.1、创建方式

在kubernetes中,按照Pod的创建方式可以将其分为两类:

  • 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
  • 控制器创建Pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。

    1.2、控制器说明

    Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod。

1.3 、控制器种类

在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:

  • ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
  • ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
  • Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
  • DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
  • Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
  • CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
  • StatefulSet:管理有状态的应用。

3、控制器说明

3.1、ReplicationController

比较原始的pod控制器,已经被废弃,由ReplicaSet替代

3.2、ReplicaSet

ReplicaSet的主要作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容和版本镜像的升级。
4_Pod控制器 - 图1
ReplicaSet的资源清单文件

  1. apiVersion: apps/v1 # 版本号
  2. kind: ReplicaSet # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: rs
  8. spec: # 详情描述
  9. replicas: 3 # 副本数量
  10. selector: # 选择器,通过它指定该控制器管理哪些po
  11. matchLabels: # Labels匹配规则
  12. app: nginx-pod
  13. matchExpressions: # Expressions匹配规则
  14. - {key: app, operator: In, values: [nginx-pod]}
  15. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  16. metadata:
  17. labels:
  18. app: nginx-pod
  19. spec:
  20. containers:
  21. - name: nginx
  22. image: nginx:1.17.1
  23. ports:
  24. - containerPort: 80

在这里,需要新了解的配置项就是spec下面几个选项:

  • replicas:指定副本数量,其实就是当然rs创建出来的Pod的数量,默认为1.
  • selector:选择器,它的作用是建立Pod控制器和Pod之间的关联关系,采用了Label Selector机制(在Pod模块上定义Label,在控制器上定义选择器,就可以表明当前控制器能管理哪些Pod了)。
  • template:模板,就是当前控制器创建Pod所使用的模板,里面其实就是前面学过的Pod的定义。

功能说明

  • 保证一定数量的Pod能够正常运行
  • Pod数量的扩缩容
  • 版本镜像的升级

1、创建

自动化保持 Pod 数量
示例:使用 rs 控制器创建 Pod

  • rs:在命名空间 dev 中创建一个 rs,并且名称为 pod-rs,并且匹配标签为:nginx-pod
  • pod:在命令空间 dev 中创建以 容器镜像为 nginx 的3个 pod 副本,并且设置标签:nginx-pod 使其能被 rs 绑定,pod 名称为 pod-rs-xxxx

    1. apiVersion: apps/v1
    2. kind: ReplicaSet
    3. metadata:
    4. name: pod-rs
    5. namespace: dev
    6. spec:
    7. replicas: 3
    8. selector:
    9. matchLabels:
    10. # 需要和下面 pod 标签相关联,才能管理上
    11. app: nginx-pod
    12. template:
    13. # pod 模板
    14. metadata:
    15. labels:
    16. app: nginx-pod
    17. spec:
    18. containers:
    19. - name: pod-rs-pod-container
    20. image: nginx

    2、功能

    2.1 、副本数量维持在期望值
    运行结果:

  • 查看 rs

image.png

  • 查看 pod

image.png

2.2、(动态)Pod 数量扩缩容
可以在Pod 运行中,动态修改 Pod 数量。以下有两种方式进行 Pod 数量动态扩缩容。
指令

  1. kubectl scale rs rs名称 --replicas=副本数 -n 命名空间

示例:将原有 3个副本扩展到5个

  1. kubectl sacle rs pod-rs --replicas=5 -n dev

未扩容之前:
image.png
扩容之后
image.png

2.3 、(动态)镜像版本升级
可以在Pod 运行中,动态修改 Pod 下容器镜像版本信息。以下有两种方式进行 Pod 数量动态扩缩容

  • 修改文件方式

    1. kubectl edit rs rs名称 -n 命名空间

    image.png
    修改方式和 vim 相同,i 输入,esc wq 保存退出,保存退出后即立即自动生效

  • 指令方式

    1. kubectl set image rs rs名称 容器名称=镜像名称:镜像版本 -n 命名空间

    示例:修改容器名为 pod-rs-pod-container 的镜像为 nginx:1.17.13

    1. kubectl set image rs pod-rs pod-rs-pod-container=nginx:1.17.13 -n dev

    指令:

    1. kubectl scale rs rs名称 容器名称 --replicas=副本数量 -n 命名空间


    3、删除 RS

    1. kubectl delete rs rs名称 -n 命名空间

    3.3、Deployment

    为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大

Deployment概述.png
功能说明

  • 支持ReplicaSet的所有功能。
  • 支持发布的停止、继续。
  • 支持版本滚动更新和版本回退。

Deployment的资源清单

  1. apiVersion: apps/v1 # 版本号
  2. kind: Deployment # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: deploy
  8. spec: # 详情描述
  9. replicas: 3 # 副本数量
  10. revisionHistoryLimit: 3 # 保留历史版本,默认为10
  11. paused: false # 暂停部署,默认是false
  12. progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
  13. strategy: # 策略
  14. type: RollingUpdate # 滚动更新策略
  15. rollingUpdate: # 滚动更新
  16. maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  17. selector: # 选择器,通过它指定该控制器管理哪些pod
  18. matchLabels: # Labels匹配规则
  19. app: nginx-pod
  20. matchExpressions: # Expressions匹配规则
  21. - {key: app, operator: In, values: [nginx-pod]}
  22. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  23. metadata:
  24. labels:
  25. app: nginx-pod
  26. spec:
  27. containers:
  28. - name: nginx
  29. image: nginx:1.17.1
  30. ports:
  31. - containerPort: 80

1、创建

创建一个 Deployment 控制器,下属一个 Rs 控制器,和3个 Pod 副本

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: dev
  5. ---
  6. apiVersion: apps/v1
  7. kind: Deployment
  8. metadata:
  9. name: pod-deployment
  10. namespace: dev
  11. spec:
  12. replicas: 2
  13. selector:
  14. matchLabels:
  15. app: nginx
  16. template:
  17. metadata:
  18. name: nginx-pod
  19. namespace: dev
  20. labels:
  21. app: nginx
  22. spec:
  23. containers:
  24. - name: nginx-container
  25. image: nginx:1.17.1
  • 查看命名空间

image.png

  • 查看 Deployment

image.png

  • 查看 Rs

Rs 名称是由 Deployment名称+xxx
image.png

  • 查看 Pod

Pod 名称是由 Rs 名称+xx
image.png

2、功能

2.1、镜像更新
Deployment支持两种镜像更新的策略:**重建更新****滚动更新(默认)**,可以通过strategy选项进行配置。

  1. strategy: 指定新的Pod替代旧的Pod的策略,支持两个属性
  2. type: 指定策略类型,支持两种策略
  3. Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
  4. RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
  5. rollingUpdate:当typeRollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:
  6. maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。
  7. maxSurge 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。
  • 重建更新

在创建出新的Pod之前会先杀掉所有已经存在的Pod
image.png

  • 滚动更新

滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
image.png

2.2、发布停止、继续
2.3、版本更新和版本回退
Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看:

  1. # 版本升级相关功能
  2. kubetl rollout 参数 deploy xx # 支持下面的选择
  3. # status 显示当前升级的状态
  4. # history 显示升级历史记录
  5. # pause 暂停版本升级过程
  6. # resume 继续已经暂停的版本升级过程
  7. # restart 重启版本升级过程
  8. # undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
  • 状态查看

    1. kubectl rollout status deployment pod-deployment -n dev

    image.png

  • 升级历史记录

    1. kubectl rollout history deployment pod-deployment -n dev

    image.png

  • 版本回退

    1. kubectl rollout undo deployment pod-deployment --to-revision=3 -n dev

    image.png

3、删除

  1. kubectl delete deployment dev名称
  2. 或者
  3. kubectl delete -f deployment文件名

3.3 、Horizontal Pod Autoscaler(HPA)

根据请求量(指标)进行 自动 的 Pod 扩缩容。也即当请求量大于一直指标(指标可自定义)时,会自动创建一定数量的 Pod ,等到请求量下降到一定指标(指标可自定义)时,会自动删除多余数量的 Pod。
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数。
image.png

1、metrics-server 安装(v0.3.6)

k8s 本身不支持对于 Pod 利用率的监控,需要额外引入 metrics-server
软件(安装包):

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

    1. tar -zxvf v0.3.6.tar.gz
  • 修改配置文件

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

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

修改metrics-server-deployment.yaml文件

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

4_Pod控制器 - 图18

  • 安装metrics-server

    1. kubectl apply -f ./

    image.png

  • 信息查看(测试)

    • 查看metrics-server生成的Pod

      1. kubectl get pod -n kube-system

      image.png

    • 查看资源使用情况

      1. kubectl top node

      image.png

      1. kubectl top pod -n kube-system

      image.png

      2、准备 Deployment 和 Service

  • 准备 Deployment

    1. apiVersion: apps/v1 # 版本号
    2. kind: Deployment # 类型
    3. metadata: # 元数据
    4. name: nginx # deployment的名称
    5. namespace: dev # 命名类型
    6. spec: # 详细描述
    7. selector: # 选择器,通过它指定该控制器可以管理哪些Pod
    8. matchLabels: # Labels匹配规则
    9. app: nginx-pod
    10. template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
    11. metadata:
    12. labels:
    13. app: nginx-pod
    14. spec:
    15. containers:
    16. - name: nginx # 容器名称
    17. image: nginx:1.17.1 # 容器需要的镜像地址
    1. kubectl create -f nginx.yaml
  • 准备 Service(暴露端口)

    1. kubectl expose deployment pod-deployment --type=NodePort --port=80 -n dev

    3、部署HPA

  • autoscaling/v1 版本

    1. apiVersion: autoscaling/v1
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: pc-hpa
    5. namespace: dev
    6. spec:
    7. minReplicas: 1 #最小pod数量
    8. maxReplicas: 10 #最大pod数量
    9. targetCPUUtilizationPercentage: 3 # CPU使用率指标
    10. scaleTargetRef: # 指定要控制的nginx信息
    11. apiVersion: apps/v1
    12. kind: Deployment
    13. name: nginx

    注意:新的版本 autoscaling/v2 中去掉了 targetCPUUtilizationPercentage
    参考链接:【文档】官方说明

    请注意,该targetCPUUtilizationPercentage字段已替换为名为 的数组metrics。CPU 利用率指标是一个资源指标,因为它表示为 pod 容器上指定的资源的百分比。请注意,您可以指定除 CPU 之外的其他资源指标。默认情况下,唯一支持的其他资源指标是内存。这些资源不会在集群之间更改名称,并且只要metrics.k8s.ioAPI可用,就应该始终可用。

    您还可以使用直接值而不是请求值的百分比来指定资源度量,方法是使用target.typeofAverageValue代替Utilization,并设置相应的target.averageValue字段而不是target.averageUtilization. 还有另外两种类型的指标,它们都被认为是自定义指标:pod 指标和对象指标。这些指标可能具有特定于集群的名称,并且需要更高级的集群监控设置。

    这些替代指标类型中的第一个是pod 指标。这些指标描述 Pod,并在 Pod 之间进行平均,并与目标值进行比较以确定副本数。他们的工作很像资源指标,不同的是它们支持一个target类型的AverageValue。

  1. # 创建
  2. kubectl create -f pc-hpa.yaml
  3. # 查看
  4. kubectl get hpa -n dev

4、测试

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

  • hpa 变化

    1. kubectl get hpa -n dev -w
  • deployment 变化

    1. kubectl get deployment -n dev -w
  • pod 变化

    1. kubectl get pods -n dev -w

    3.4、DaemonSet(DS)

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

特点功能:

  • 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
  • 当节点从集群中移除时,Pod 也就被垃圾回收了

下面先来看下DaemonSet的资源清单文件

  1. apiVersion: apps/v1 # 版本号
  2. kind: DaemonSet # 类型
  3. metadata: # 元数据
  4. name: # rs名称
  5. namespace: # 所属命名空间
  6. labels: #标签
  7. controller: daemonset
  8. spec: # 详情描述
  9. revisionHistoryLimit: 3 # 保留历史版本
  10. updateStrategy: # 更新策略
  11. type: RollingUpdate # 滚动更新策略
  12. rollingUpdate: # 滚动更新
  13. maxUnavailable: 1 # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  14. selector: # 选择器,通过它指定该控制器管理哪些pod
  15. matchLabels: # Labels匹配规则
  16. app: nginx-pod
  17. matchExpressions: # Expressions匹配规则
  18. - {key: app, operator: In, values: [nginx-pod]}
  19. template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
  20. metadata:
  21. labels:
  22. app: nginx-pod
  23. spec:
  24. containers:
  25. - name: nginx
  26. image: nginx:1.17.1
  27. ports:
  28. - containerPort: 80

1、创建

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: pc-daemonset
  5. namespace: dev
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: nginx-pod
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx-pod
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.17.1

2、运行

  1. # 运行
  2. # 查看 daemonSet
  3. # 查看 Pod 创建的节点
  4. # 删除