Replication Controller

RC定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值。

RC的定义包括如下几个部分。
◎ Pod期待的副本数量。
◎ 用于筛选目标Pod的Label Selector。
◎ 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)。

Replica Set

Replica Set 是 Replication Controller 的升级新概念。RS与RC区别是,RS支持基于集合的Label selector(Set-based selector),而RC只支持基于等式的Label Selector(equality-based selector)。

RS主要被更高层的资源对象Deployment所使用,从而形成一套Pod创建、删除、更新的编排机制。

Deployment

介绍

Deployment 内部使用 Replica Set 来实现目的。由于一个Pod的创建、调度、启动的过程需要一定的时间,所以系统启动N个Pod副本的目标状态,实际上是一个连续变化的“部署过程”导致的最终状态。

Deployment 资源类型(nginx-deploy.yaml)

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deploy
  5. namespace: default
  6. spec:
  7. replicas: 3 # 期望的 Pod 副本数量,默认值为1
  8. selector: # Label Selector,必须匹配 Pod 模板中的标签
  9. matchLabels:
  10. app: nginx
  11. template: # Pod 模板
  12. metadata:
  13. labels:
  14. app: nginx
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx
  19. ports:
  20. - containerPort: 80

创建

$ kubectl apply -f nginx-deploy.yaml

$ kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           58s

$ kubectl get pods -l app=nginx
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7848d4b86f-blhlm   1/1     Running   0          80s
nginx-deploy-7848d4b86f-fbw7x   1/1     Running   0          80s
nginx-deploy-7848d4b86f-qgbhm   1/1     Running   0          80s

查看 pod 信息

$ kubectl describe pod nginx-deploy-7848d4b86f-blhlm
Name:         nginx-deploy-7848d4b86f-blhlm
Namespace:    default
Priority:     0
Node:         m1/10.23.34.9
Start Time:   Thu, 18 Nov 2021 14:09:02 +0800
Labels:       app=nginx
              pod-template-hash=7848d4b86f
Annotations:  <none>
Status:       Running
IP:           10.244.0.45
IPs:
  IP:           10.244.0.45
Controlled By:  ReplicaSet/nginx-deploy-7848d4b86f
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  97s   default-scheduler  Successfully assigned default/nginx-deploy-7848d4b86f-blhlm to m1
  Normal  Pulling    97s   kubelet            Pulling image "nginx"
  Normal  Pulled     75s   kubelet            Successfully pulled image "nginx" in 21.018297668s
  Normal  Created    75s   kubelet            Created container nginx
  Normal  Started    75s   kubelet            Started container nginx

#信息显示 Controlled By: ReplicaSet/nginx-deploy-7848d4b86f,表示当前 Pod 的控制器是一个 ReplicaSet 对象。

查看 rs 信息

$ kubectl describe ReplicaSet/nginx-deploy-7848d4b86f
Name:           nginx-deploy-7848d4b86f
Namespace:      default
Selector:       app=nginx,pod-template-hash=7848d4b86f
Labels:         app=nginx
                pod-template-hash=7848d4b86f
Annotations:    deployment.kubernetes.io/desired-replicas: 3
                deployment.kubernetes.io/max-replicas: 4
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx-deploy
...
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  4m40s  replicaset-controller  Created pod: nginx-deploy-7848d4b86f-blhlm
  Normal  SuccessfulCreate  4m40s  replicaset-controller  Created pod: nginx-deploy-7848d4b86f-qgbhm
  Normal  SuccessfulCreate  4m40s  replicaset-controller  Created pod: nginx-deploy-7848d4b86f-fbw7x

#Controlled By: Deployment/nginx-deploy,说明 Pod 依赖的控制器 RS 被 Deployment 控制。

操作

水平伸缩
#命令行指定副本数
$ kubectl scale deploy ng-dp —replicas=10

滚动更新
#添加更新策略,更改镜像版本 ng-dp.yaml

apiVersion: apps/v1
kind: Deployment  
metadata:
  name:  nginx-deploy
  namespace: default
spec:
  replicas: 3  
  selector:  
    matchLabels:
      app: nginx
  minReadySeconds: 5
  strategy:  
    type: RollingUpdate  # 指定更新策略:RollingUpdate和Recreate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:  
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  • minReadySeconds
    • 表示 Kubernetes 在等待设置的时间后才提供服务,默认值是0
  • type=RollingUpdate
    • 设置更新策略为滚动更新。Recreate表示全部重新创建,默认值就是RollingUpdate
  • maxSurge
    • 设置升级过程中最多可以比原先设置多出的 Pod 数量。例如:maxSurage=1,replicas=5 表示 Kubernetes 会先启动一个新的 Pod,然后才删掉一个旧的 Pod,整个升级过程中最多会有5+1个 Pod
  • maxUnavaible
    • 设置升级过程中 pod 不可用的最大数量。例如:maxUnavaible=1 表示升级过程中最多有1个 Pod 处于无法服务的状态

应用

$ kubectl apply -f ng-dp.yaml --record  # --record参数会记录下操作所执行的命令

# 查看滚动更新状态,输出信息显示已经有 2pod更新完成
$ kubectl rollout status deployment/nginx-deploy
Waiting for deployment "nginx-deploy" rollout to finish: 2 out of 3 new replicas have been updated...

# 暂停更新
$ kubectl rollout pause deployment/nginx-deploy

# 恢复更新
$ kubectl rollout resume deployment/nginx-deploy

$ kubectl rollout status deployment/nginx-deploy
Waiting for deployment "nginx-deploy" rollout to finish: 2 of 3 updated replicas are available...
deployment "nginx-deploy" successfully rolled out

# 查看历史版本
$ kubectl rollout history deployment nginx-deploy
deployment.apps/nginx-deploy 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

# 查看具体版本信息
$ kubectl rollout history deployment nginx-deploy --revision=1 
deployment.apps/nginx-deploy with revision #1
Pod Template:
  Labels:       app=nginx
        pod-template-hash=85ff79dd56
  Containers:
   nginx:
    Image:      nginx
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

# 回退到当前版本的上一个版本
$ kubectl rollout undo deployment nginx-deploy

# 回退到指定版本
$ kubectl rollout undo deployment nginx-deploy --to-revision=1