K8S的伸缩应用程序-扩缩容,版本回滚
应用程序探索
概述
- 创建 Deployment 之后,Kubernetes 会创建一个 Pod(容器组)来放置应用程序实例(container 容器)。
Pod
- Pod(容器组)是一个 Kubernetes 中的一个抽象概念,用于存放一组 Container(可以包含一个或多个 Container 容器,如:上图中的小正方体)以及这些 Container(容器)的一些共享资源。这些资源包括:
- 共享存储,称为卷(Volume),如:上图中的紫色圆柱体。
- 网络,每个 Pod(容器组)在集群中有一个唯一的 IP,Pod(容器组)中的 Container(容器)共享该 IP 地址。
- Container(容器)的基本新,如:容器的镜像版本、对外暴露的端口等。
- Pod(容器组)是 Kubernetes 集群上的最基本的单元。当我们在 Kubernetes 集群上创建 Deployment 的时候,会在 Kubernetes 集群上创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都和运行它的 Node 节点绑定,并保持在哪里直到终止或被删除。如果 Node 节点发生了故障,则会在集群中的其他可用的 Node 节点上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名称不同)。
温馨提示:
- Pod 是一组容器(可包含一个或多个应用程序容器),以及共享存储(卷 Volumes)、IP 地址和有关如何运行容器的信息。
- 如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中。
Node
- Pod(容器组)总是在 Node(节点)上运行。Node(节点)是 Kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 Master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes 的 Master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。
- 每个 Kubernetes 的 Node(节点)至少运行:
- Kubelet,负责 Master节点和 Node 节点之间通信的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。
- kube-proxy,负责进行流量转发。
- 容器运行环境(如:Docker)负责下载镜像、创建和运行容器等。
扩缩容
- 当创建了一个 Deployment,然通过 Service 提供访问 Pod 的方式,但是当流量增加的时候,需要对应用程序进行伸缩操作以满足系统性能的需求。
- 命令:
kubectl scale --replicas=3 deployment nginx
kubectl edit deployment nginx-deploy
执行滚动升级
- 滚动升级允许通过使用新的示例逐步更新 Pod 实例,从而实现 Deployment 更新,0 停机。
- 与应用程序扩展类似,如果暴露了 Deployment,服务(Service)将在更新期间仅对可用的 pod 进行负载均衡,可用 Pod 是应用程序可用的实例。
滚动更新允许以下操作:
① 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)。
② 回滚到以前的版本。
③ 持续集成和持续交付应用程序,无需停机。
● 命令:
# 镜像升级 nginx:1.17 到 nginx:latest
# --record 表示记录变更
kubectl set image deployment 应用部署名称 Pod中容器的名称=容器的镜像 --record
# 查看历史记录
kubectl rollout history deployment 应用部署名称
# 默认回滚到上一个版本
kubectl rollout undo deployment 应用部署名称
# 默认回滚到第一个版本
kubectl rollout undo deployment 应用部署名称 --to-revision=1
示例:
创建nginx控制器,副本数为3,当前nginx版本为1.17.1
[root@k8s-master ~]# kubectl create deployment nginx-deploy --image=nginx:1.17.1 --replicas=3
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-fcd74c97b-852wr 0/1 ContainerCreating 0 11s
nginx-deploy-fcd74c97b-jzffw 0/1 ContainerCreating 0 11s
nginx-deploy-fcd74c97b-mppmj 0/1 ContainerCreating 0 11s
[root@k8s-master ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx-deploy-fcd74c97b-852wr 0/1 ContainerCreating 0 15s
nginx-deploy-fcd74c97b-jzffw 0/1 ContainerCreating 0 15s
nginx-deploy-fcd74c97b-mppmj 0/1 ContainerCreating 0 15s
nginx-deploy-fcd74c97b-mppmj 1/1 Running 0 61s
nginx-deploy-fcd74c97b-jzffw 1/1 Running 0 62s
nginx-deploy-fcd74c97b-852wr 1/1 Running 0 66s
^C[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-fcd74c97b-852wr 1/1 Running 0 70s
nginx-deploy-fcd74c97b-jzffw 1/1 Running 0 70s
nginx-deploy-fcd74c97b-mppmj 1/1 Running 0 70s
一个deploy对应一个rs,一个rs对应三个pod
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-7c6f569b4b 0 0 0 37m
nginx-deploy-fb74b55d4 0 0 0 40m
nginx-deploy-fcd74c97b 3 3 3 42m
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 42m
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-fcd74c97b-4qfjh 1/1 Running 0 34m
nginx-deploy-fcd74c97b-tqnrf 1/1 Running 0 34m
nginx-deploy-fcd74c97b-v7s6b 1/1 Running 0 34m
将nginx版本升级为1.19,执行如下命令
[root@k8s-master ~]# kubectl set image deployment nginx-deploy nginx=nginx:1.19 --record
deployment.apps/nginx-deploy image updated
[root@k8s-master ~]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 3/3 3 3 57m nginx nginx:1.19 app=nginx-deploy
将nginx升级为latest
[root@k8s-master ~]# kubectl set image deployment nginx-deploy nginx=nginx --record
deployment.apps/nginx-deploy image updated
[root@k8s-master ~]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 3/3 3 3 59m nginx nginx app=nginx-deploy
查看历史记录
[root@k8s-master ~]# kubectl rollout history deployment nginx-deploy
deployment.apps/nginx-deploy
REVISION CHANGE-CAUSE
4 <none>
5 kubectl set image deployment nginx-deploy nginx=nginx:1.18 --record=true
6 kubectl set image deployment nginx-deploy nginx=nginx:1.19 --record=true
7 kubectl set image deployment nginx-deploy nginx=nginx --record=true
将nginx版本回滚到1.18
root@k8s-master ~]# kubectl rollout undo deployment nginx-deploy --to-revision=5
deployment.apps/nginx-deploy rolled back
[root@k8s-master ~]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 3/3 3 3 60m nginx nginx:1.18 app=nginx-deploy