回顾什么是RS#

在 Kubernetes 中,RS 是 ReplicaSet 的缩写,它是一种 API 对象,用于确保指定数量的 Pod 副本始终运行并处于可用状态。ReplicaSet 负责维护 Pod 副本的稳定运行,如果由于某些原因(如节点故障或 Pod 崩溃)导致 Pod 副本数量减少,ReplicaSet 将替换这些 Pod 以维持期望的副本数量。

ReplicaSet 通常与 Deployment 一起使用,Deployment 控制器使用 ReplicaSet 来管理 Pod 副本的声明周期。Deployment 负责声明 Pod 模板的期望状态,而 ReplicaSet 负责实现这个状态。

ReplicaSet 的主要特点包括:

  1. 副本数量保证:确保指定数量的 Pod 副本始终运行。
  2. 选择器(Selector):ReplicaSet 使用选择器来识别和管理它应该管理的 Pod。选择器是一个标签查询,用于匹配 Pod 的标签。
  3. 更新和替换:当 Pod 模板发生变化时,ReplicaSet 可以替换旧的 Pod 副本,以确保所有 Pod 都符合新的模板。

ReplicaSet 与 Deployment 的关系可以这样理解:Deployment 定义了应用程序的期望状态,而 ReplicaSet 确保这个状态得以实现。当 Deployment 需要更新时,它会创建一个新的 ReplicaSet 并逐步替换旧的 ReplicaSet 中的 Pod。这样,Deployment 可以实现零停机更新和回滚。

回顾什么是Deployment#

在Kubernetes中,Deployment(部署)是一种高级API对象,用于声明式地管理无状态应用的生命周期,包括应用的声明、更新和扩展。Deployment控制器负责Pod的声明周期,确保在任何给定时间,都运行着指定数量的Pod副本。

以下是Deployment的一些关键特性:

  1. 声明式更新:Deployment允许你定义应用的期望状态,Kubernetes会自动将当前状态更改为期望状态。
  2. 自我修复:如果Pod由于节点故障或其他原因失败,Deployment会自动替换失败的Pod。
  3. 水平扩展:Deployment支持使用kubectl scale命令或在Deployment定义中指定副本数来扩展Pod的数量。
  4. 滚动更新:Deployment支持滚动更新,这意味着你可以逐步推出更新,一次更新一个或多个Pod,直到所有Pod都更新到新版本。
  5. 回滚:如果新版本的应用出现问题,Deployment允许你回滚到以前的版本。
  6. 暂停和恢复:你可以暂停Deployment的更新,进行调试或其他操作,然后在准备好后恢复更新。
  7. 最小可用性:在更新过程中,Deployment可以配置为保持一定数量的Pod始终可用,以确保服务的连续性。
  8. 进度和状态:Deployment对象提供进度和状态信息,以便你可以了解Deployment的状态和任何相关问题。

这是GPT的生成-__-

简单来说Deployment就是控制器,用来管理Pod,同时在原生的pod基础上添加了很多强大的功能

因此我们只是单独创建一个Pod的时候,只是一个pod,她没有扩容缩容,暂停恢复等强大的功能,一点都不行,我们就需要用Deployment来创建管理pod

什么是LabelSelector#

在使用Deployment之前我们需要明白什么是Label`和`Selector

label是标签,Selector是选择器

选择器可以选择某些标签进行某些操作,比如说就像Mysql中的where name = 1 and id != 2,标签中的值是可以随意设置的,只要能够被选择器筛选就可以

label 可以写在metadata中,也可以写在 spec中

1
2
3
4
5
6
metadata:
labels:
type: app
spec:
labels:
name: nginx

如果要临时创建label#

1
kubectl label po <资源名称> labelName=labelValue

如果要修改label#

1
kubectl label po <资源名称> app=hello22 --overwrite

如果要查看label#

1
kubectl get po --show-labels

例如

1
2
3
4
5
kubectl get po --show-labels
kubectl label po nginx-pod app = v1
kubectl get po --show-labels
kubectl label po nginx-pod app=hello22 --overwrite
kubectl get po --show-labels

以上的方式不适用于Deployment,适合原生Pod

加上选择器#

1
2
3
4
5
kubectl get po -l app=v1  # -l 相当于加上标签匹配

kubectl get po -l `test in (1.0.0,1.0.1,1.0.2)' #多值匹配

kubectl get po -l version!=1.2.0,type=app #多值匹配

Deployment操作#

  • 创建

    • 最简单的创建

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      sudo kubectl create deploy nginx-deploy --image=nginx:1.7.9

      hhhyc@hhhyc:~/deployments$ sudo kubectl get deployments
      NAME READY UP-TO-DATE AVAILABLE AGE
      nginx-deploy 0/1 1 0 113s

      hhhyc@hhhyc:~/deployments$ sudo kubectl get replicaset
      NAME DESIRED CURRENT READY AGE
      nginx-deploy-68c658776b 1 1 0 7m45s

      hhhyc@hhhyc:~/deployments$ sudo kubectl get pods
      NAME READY STATUS RESTARTS AGE
      nginx-deploy-68c658776b-qq6hl 0/1 CrashLoopBackOff 5 (34s ago) 3m46s

      可以看到 nginx-deploy-68c658776b-qq6hl 这个名字的嵌套关系

      可以看出Deploymenet - RS - Pod 的顶级嵌套关系,由此可以作为其唯一标识

  • 查看Deploy的配置信息

    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
    33
    34
    35
    36
    37
    38
    39
    hhhyc@hhhyc:~/deployments$ sudo kubectl get deploy nginx-deploy -o yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    .......

    kubectl describe deploy nginx-deploy
    Name: nginx-deploy
    Namespace: default
    CreationTimestamp: Tue, 09 Jul 2024 14:51:45 +0800
    Labels: app=nginx-deploy
    Annotations: deployment.kubernetes.io/revision: 1
    Selector: app=nginx-deploy
    Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
    StrategyType: RollingUpdate
    MinReadySeconds: 0
    RollingUpdateStrategy: 25% max unavailable, 25% max surge
    Pod Template:
    Labels: app=nginx-deploy
    Containers:
    nginx:
    Image: nginx:1.7.9
    Port: <none>
    Host Port: <none>
    Environment: <none>
    Mounts: <none>
    Volumes: <none>
    Conditions:
    Type Status Reason
    ---- ------ ------
    Available False MinimumReplicasUnavailable
    Progressing False ProgressDeadlineExceeded
    OldReplicaSets: <none>
    NewReplicaSet: nginx-deploy-68c658776b (1/1 replicas created)
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal ScalingReplicaSet 45m deployment-controller Scaled up replica set nginx-deploy-68c658776b to 1
    # 这个event就表示这几次的更新回滚的事件记录
  • 修改配置

    首先通过刚才的查看原先配置信息获取配置,复制并粘贴到新的yaml文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    annotations:
    deployment.kubernetes.io/revision: "1"
    creationTimestamp: "2024-07-09T06:51:45Z"
    generation: 1
    labels:
    app: nginx-deploy
    name: nginx-deploy
    namespace: default
    resourceVersion: "21427"
    uid: f9b46890-3e5d-4964-961c-5f11fcf5ed86
    # ....
    restartPolicy: Always
    schedulerName: default-scheduler
    securityContext: {}
    terminationGracePeriodSeconds: 30
    # 粘贴到 status 前即可

    然后删除一些不需要的数据,比如说时间,版本,uid等数据.

    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
    apiVersion: apps/v1  #deploy api版本
    kind: Deployment # 资源类型
    metadata: # 元信息
    labels:
    app: nginx-deploy
    name: nginx-deploy
    namespace: default
    spec: # 期望状态
    progressDeadlineSeconds: 600
    replicas: 1
    revisionHistoryLimit: 10 # 经过滚动更新后的历史版本数
    selector: # 选择器,匹配标签相对的RS--也是一个选择器
    matchLabels:
    app: nginx-deploy
    strategy: # 更新策略
    rollingUpdate: # 采用滚动更新
    maxSurge: 25%
    maxUnavailable: 25%
    type: RollingUpdate
    template: #描述我们的pod如何创建
    metadata:
    labels:
    app: nginx-deploy
    spec:
    containers:
    - image: nginx:1.7.9
    imagePullPolicy: IfNotPresent
    name: nginx
    terminationGracePeriodSeconds: 30

    最后输入命令实现更新

    1
    kubectl apply -f nginx-deploy.yaml

    也可以这样:

    这样可以直接修改deploy.yaml中的内容,不过需要打开这个文件

    1
    kubectl edit deploy nginx-deploy

    也可以这样:

    1
    bectl set image deployment/nginx-deploy nginx=nginx:1.7.9

Deployment功能调整#

  • 滚动更新

    只要修改了deployment 配置文件中的 template 中的属性后,才会触发更新操作

  • 扩容缩容

    只要修改template中的raplica中的数据继续ing(不方便)

    直接用下面的命令(方便)

    1
    2
    kubectl scale --replicas=9 deploy nginx-deploy
    # 但是这个操作RS并不会扩容,而是Pod会扩容
  • 版本回滚

    1
    kubectl roolout status deployments nginx-deploy
    • 查看之前的版本历史
    1
    kubectl rollout history deployment/<deployment-name>
  • 暂停与恢复

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx