k8s入门-使用deployment部署nginx进行滚动升级和回滚操作


一、Deployment简介

Deployment为Pod和ReplicaSet提供了一个声明式定义方法,在Kubernets中是一种资源控制器,用来替代以前的ReplicationController来方便管理应用,典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

二、使用Deployment部署nginx

实验环境:

  • K8s集群可以正常使用
  • K8s可以正常从镜像仓库拉取镜像

1.编写yaml文件使用Deployment

代码如下:

[root@k8s-master test]# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
 selector:                                    #定义标签选择器
  matchLabels:                                #定义匹配的标签,必须要设置
   app: nginx                                 #匹配的目标标签     
 replicas: 3                                  #开启Pod的数量
 template:                                    #定义模板,必须定义,模板是起到描述要创建的pod的作用
  metadata:                                   #定义模板元数据
    labels:                                   #定义模板label,Deployment.spec.template.metadata.labels   
     app : nginx                              #定义标签,必须等于 matchLabels 定义的标签

  spec:                                     
   containers:
   - image: msxt.harbor.com/k8s/nginx:1.18.0    #我的镜像是从本地的Harbor上拉取
     name: nginx                                 #镜像名称
     ports:
     - containerPort: 80                         #定义容器使用的端口

上面是使用Deployment控制器部署nginx

运行yaml文件

kubectl apply -f nginx-deployment.yaml 

查看Deployment状态

kubectl get deployment

在这里插入图片描述
查看pod

kubectl get pods

在这里插入图片描述
pod正在运行,接下来暴露端口,让用户可以通过外网进行访问。


2、使用Service暴露nginx端口

代码如下:

[root@k8s-master test]# cat service.yaml 
apiVersion: v1        
kind: Service              #kind类型Service
metadata:                  #类型元数据
 name: nginx-service       #元数据名称
spec: 
 selector:                 #定义标签选择器
  app: nginx               #这里填写的nginx要跟Deployment的标签名称一致才能进行匹配
 ports:                     #开启一个端口参数
 - protocol: TCP            #定义TCP协议
   port: 80                 #定义Service端口
   targetPort: 80           #目标Pod的端口
   nodePort: 31000          #node节点暴露的SSL端口
 type: NodePort             ##NodePort表示在宿主机打开一个监听端口;service的类型,定义服务的访问方式,默认为ClusterIP(不会再宿主机打开一个监听端口,只为k8s内部提供服务),service.spec.type
 

运行Service.yaml文件暴露端口

kubectl apply -f service.yaml

获取service信息

kubectl get svc

在这里插入图片描述
之后在任意节点上访问http://127.0.0.1:31000端口即可
在这里插入图片描述

三、滚动升级和回滚版本

1、滚动升级

复制部署Deployment的yaml文件

 [root@k8s-master test]# cp nginx-deployment.yaml nginx-deployment-v2.yaml

在这里插入图片描述
编辑nginx-deployment-v2.yaml文件
代码如下:

[root@k8s-master test]# cat  nginx-deployment-v2.yaml 
apiVersion: apps/v1                
kind: Deployment                         
metadata:
  name: nginx-deploy                         
spec:      
 minReadySeconds: 5                        #在原有的基础上新增
 strategy:                                 #在原有的基础上新增  
 type: RollingUpdate                       #在原有的基础上新增
  rollingUpdate:                           #在原有的基础上新增
    maxSurge: 1                            #在原有的基础上新增
    maxUnavailable: 1                      #在原有的基础上新增
 selector:
  matchLabels:
   app: nginx
 replicas: 3
 template:
  metadata:
    labels:
     app : nginx

  spec:
   containers:
   - image: msxt.harbor.com/k8s/nginx:1.18.0          #改成要升级的镜像版本,其他不变
     name: nginx        
     ports:
     - containerPort: 80

字段解释:
minReadySeconds
Kubernetes在等待设置的时间后才进行升级
如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了,所以这个可以设置的保守一些,比如我们的服务启动从3-20秒不等,我可以设置成30秒,这样防止pod启动了但是服务还没准备好导致系统不可用。

maxSurge
升级过程中最多可以比原先设置多出的POD数量
例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。

maxUnavaible
升级过程中最多有多少个POD处于无法提供服务的状态,当maxSurge不为0时,该值也不能为0,最好和maxSurge保持一致。
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态,可以保证有足够的pod(或者认为是足够的性能)提供服务。


滚动升级命令

修改了Yaml文件执行:

kubectl apply -f nginx-deployment-v2.yaml

查看滚动升级状态

kubectl rollout status deployment nginx-deploy

在这里插入图片描述

暂停升级

kubectl rollout pause deployment nginx-deploy

恢复升级

kubectl rollout resume deployment nginx-deploy

升级后查看Pod和Rs的信息

[root@k8s-master test]# kubectl get pods

可以看到现在查询的Pod运行时间都在40s左右,说明是刚启动的Pod

在这里插入图片描述
再来看看Rs的情况
这里会有两个nginx-Deployment

为什么会有两个?
因为Deployment的回滚操作就是由Rs找到以上的版本,Rs不会删除之前部署的版本,除非人工设置或人工删除掉以前的版本,但长期保留过早的版本会占用系统资源,所有保留的版本历史还是需要设置

现在很显然Rs已经部署了一套新的nginxPod
在这里插入图片描述
也可以查看详细信息

 kubectl describe deployment nginx-deploy

这里的镜像变成1.18.0
底下的信息就是Pod替换掉的信息
在这里插入图片描述
接下来进行访问nginx测试是否升级成功
在任意节点访问http://127.0.0.1:31000
访问可能会有延迟,耐心等待
在这里插入图片描述
进入容器里查看nginx版本
查看pod,随便选取一个pod进入

[root@k8s-master test]# kubectl get pods

在这里插入图片描述
进入容器

[root@k8s-master test]# kubectl exec -it nginx-deploy-7669c9d749-f5dv6 -- /bin/bash

查看nginx版本

nginx -v 

在这里插入图片描述
滚动升级完成

2、回滚版本

我们已经能够滚动平滑的升级我们的Deployment了,但是如果升级后的POD出了问题该怎么办?我们能够想到的最好最快的方式当然是回退到上一次能够提供正常工作的版本,Deployment就为我们提供了回滚机制

查看之前历史版本,在这里我显示3和4,是因为我之前做过所以有保存的历史。

kubectl rollout history deployment nginx-deploy

在这里插入图片描述
查看某一次的revison信息

[root@k8s-master test]# kubectl rollout history deployment nginx-deploy --revision=3

–revision=3 这里表示的是查看第三个历史版本信息

下面就是滚动升级前的版本信息。
在这里插入图片描述
接下来进行回滚操作
回滚到某一版本

kubectl rollout undo deployment nginx-deploy --to-revision=3

如果不加–to-revision=3参数,就默认回滚到上一个版本

在这里插入图片描述

回滚完成后,查看Rs信息
可以看到Rs的deploy已经回到第一个了,代表回滚成功
在这里插入图片描述
接着进行验证
访问nginx地址:http://127.0.0.1:31000
在这里插入图片描述
再进入容器查看nginx版本
要重新查看pod,因为已经把新的Pod更换成之前的了。
在这里插入图片描述
已经回滚回来了。

### 使用 kubectl 更新 Nginx Deployment 的镜像版本 在 Kubernetes (K8s) 中,`kubectl set image` 命令允许您更新现有部署Deployment)或其他工作负载资源所使用的容器镜像。下面是关于如何使用 `kubectl set image` 来修改名为 `nginx-deployment` 的 deployment,并将其 Nginx 容器的镜像更改为 `nginx:1.19.1` 的详细介绍。 #### 1. **准备工作** 确保你已经有一个运行中的 Kubernetes 集群并且能够正常连接它。你需要具备足够的权限去管理集群内的资源。此外,请保证目标 deployment 已经存在;如果还没有创建该 deployment,则需要先通过 YAML 文件或者其他方式完成其初始化。 #### 2. **理解命令结构** 让我们拆解一下完整的命令: ```bash kubectl set image deployments/nginx-deployment nginx=nginx:1.19.1 --record=true ``` - `deployments/nginx-deployment`: 指定你要更新的目标 deployment 及其名称。 - `nginx=nginx:1.19.1`: 表示将当前 deployment 内部名为 `nginx` 的容器替换为新的镜像 `nginx:1.19.1`。 - `--record=true`: 将这次变更记录到 replicaSet 注释中,便于追踪历史变化。(这是一个可选参数) #### 3. **实际操作步骤** 打开终端窗口,输入上述命令即可开始更新过程: ```bash kubectl set image deployments/nginx-deployment nginx=nginx:1.19.1 --record=true ``` 成功执行后会看到类似如下的提示信息: ``` deployment.apps/nginx-deployment image updated ``` 这意味着新镜像已经被设置到了指定的 deployment 下面了。为了验证是否真的生效,可以通过以下几种方式进行检查: ##### a. 查看最新状态 ```bash kubectl rollout status deploy/nginx-deployment ``` 这条命令可以帮助我们了解最新的滚动升级情况。 ##### b. 获取 Pod 列表及其对应的镜像版本 ```bash kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{" "}{end}' ``` 这将会展示每一个 pod 名称与其正在使用的镜像之间的对应关系。 --- **小贴士**: 如果你想回滚到之前的版本或者取消此次更新,在任何时候都可以利用 `rollout undo` 相关功能轻松实现这一点。 通过这种方式,您可以非常便捷地管理控制 Kubernetes 集群里各个应用程序组件的状态依赖项,提高了整个系统的灵活性及可靠性。 --
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值