Kubernetes 基础

四、 Kubernetes 基础

1、 kubernetes 基础使用篇

1.1、 kubernetes 带来的变革

1.1.1、对于开发人员

由于公司业务多,开发环境、测试环境、预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省 成本,其他环境可能是没有日志收集的,在没有用 k8s 的时候,查看线下测试的日志,需要开发或者测试人员, 找到对应的机器,在找到对应的容器,然后才能查看日志,在用了 k8s 之后,开发和测试可以直接在 k8s 的dashboard 到对应的 namespace,即可定位到业务的容器,然后可以直接通过控制台查看到对应的日志,大大降 低了操作时间。

把应用部署到 k8s 之后,代码的发布、回滚,以及蓝绿发布、金丝雀发布等都变得特别简单,不仅加快了业 务代码迭代的速度,而且全程无需人工干预。目前我们使用 jenkins、gitrunner 进行发版或者回滚等,从开发环 境到测试环境,到生产环境,完全遵守一次构建,多集群、多环境部署,通过不同的启动参数、不同的环境变量、 不同的配置文件实现区分不同的环境。目前已经实现 Python、Java、PHP、NodeJS、Go、.NET Core、Python 等多 种语言的一键式发版、一键式回滚,大大提高了开发人员的开发效率。

在使用服务网格后,开发人员在开发应用的过程中,不用再关心代码的网络部分,这些功能都被服务网格实 现,让开发人员可以只关心代码逻辑部分,即可实现网络部分的功能,比如:断流、分流、路由、负载均衡、限 速和触发故障等功能。

测试过程中,可能同时多套环境,当然也会需要再创建一套测试环境,之前测试环境的创建,需要找运维或 者自行手工搭建。在迁移至 k8s 集群后,只需要在 jenkins 上点点鼠标即可在 k8s 集群上创建一套新的

1.1.2、对于运维人员

如果你是一名运维人员,可能经常因为一些重复、繁琐的工作感觉厌倦。比如:这个需要一套新的测试环境, 那个需要一套新的测试环境,之前可能需要装系统、装依赖环境、开通权限等等。而如今,可以直接用镜像直接 部署一套新的测试环境,甚至全程无需自己干预,开发人员通过 jenkins 或者自动化运维平台即可一键式创建, 大大降低了运维成本。

一开始,公司业务故障,可能是因为基础环境不一致、依赖不一致、端口冲突等等问题,现在实现 Docker 镜像部署,k8s 编排,所有的依赖、基础都是一样的,并且环境的自动化扩容、健康检查、容灾、恢复都是全自 动的,大大减少了因为这类基础问题引发的故障。也有可能公司业务是由于服务器宕机、网络等问题,造成服务 不可用,此类情况均需要运维人员及时去修复,而如今,可能在你收到告警信息的时候,k8s 已经帮你恢复了。

一开始,公司业务故障,可能是因为基础环境不一致、依赖不一致、端口冲突等等问题,现在实现 Docker 镜像部署,k8s 编排,所有的依赖、基础都是一样的,并且环境的自动化扩容、健康检查、容灾、恢复都是全自 动的,大大减少了因为这类基础问题引发的故障。也有可能公司业务是由于服务器宕机、网络等问题,造成服务 不可用,此类情况均需要运维人员及时去修复,而如今,可能在你收到告警信息的时候,k8s 已经帮你恢复了。

对于反代配置方面,比如可能你并不会,或者对 nginx 的配置规则并不熟悉,一些高级的功能你也不会实现, 而如今,利用 k8s 的 ingress 即可简单的实现那些复杂的逻辑。并且也不会在遇到 nginx 少加一个斜杠和多加一个 斜杠的问题

对于负载均衡方面,之前负载均衡可能是 Nginx、LVS、HAProxy、F5 等,云上可能是云服务商提供的不在均 衡机制。每次添加删除节点时,都需要手动去配置前端负载均衡,手动去匹配后端节点,而如今,使用 k8s 内部 的 service 可以动态发现实现自动管理节点,并且支持自动扩容缩容。之前遇到高峰流量时,经常服务器性能不 够,需要临时加服务器面对高峰流量,而如今对于高性能 k8s 集群加上 serverless,基本实现无需管理,自动扩 容

对于高可用方面,k8s 天生的高可用功能,彻底释放了双手,无需再去创建各类高可用工具、检测检查脚本。 k8s 支持进程接口级别的健康检查,如发现接口超时或者返回值不正确,会自动处理该问题。

对于中间件搭建方面,根据定义好的资源文件,可以实现秒级搭建各类中间件高可用集群,并且支持一键式 扩缩容,如 Redis、RabbitMQ、Zookeeper 等,并且大大减少了出错的概率。

对于应用端口方面,传统行业中,一个服务器可能跑了很多进程,每个进程都有一个端口,需要人为的去配 置端口,并且还需要考虑端口冲突的问题,如果有防火墙的话,还需要配置防火墙,在 k8s 中,端口统一管理, 统一配置,每个应用的端口都可设置成一样的,之后通过 service 进行负载均衡,大大降低了端口管理的复杂度 和端口冲突。

无论是对于开发人员、测试人员还是运维人员,k8s 的诞生,不仅减少了工作的复杂性,还减少了各种成本。 上述带来的变革只是其中比较小的一部分,更多优点只有用了才能体会到。

1.2、 kubernetes 带来的挑战

首先是对于 k8s 的学习本身就是很难的,概念太多,无从入手,可能学习了一个月也无法入门,甚至连集群 也搭建不出来,使人望而却步。并且 k8s 对运维的技术能力要求比较高,已经不仅仅局限于传统运维,有时候你 可能要修改业务代码等。并且需要掌握的知识也需要很多,你可能需要掌握公司所有使用到的代码,比如代码是 如何进行编译的、如何正确发布、如何修改代码配置文件等,这对于运维人员,也是一种挑战。Kubernetes 之所 以被叫做 k8s,业界有两种说法,通俗的说法是 k 和 s 之间有 8 个字母,另一种比较说法是 k8s 集群至少需要搭 建 8 遍才能搭建成功。当然,在实际使用时,可能不止 8 遍。k8s 的诞生,把运维从传统转变到了 DevOps 方向, 需要面临的问题会更多,需要面临的新技术也有很多,但是当你掌握到了 k8s 的核心使用,就会受益终身

1.3、 Pod

K8s 有很多技术概念,同时对应很多 API 对象,最重要的也是最基础的是微服务 Pod。Pod 是在 K8s 集群中运 行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络 地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod 对多容器的支持是 K8s 最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个 Nginx 容器用来发布软件,另一个容器专 门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服 务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。这 就是 K8S 中的 POD。

1.3.1、Pod 的初体验

apiVersion: v1
kind: Pod
metadata:
  name: first-pod
labels:
  app: bash
spec:
  containers:
  - name: bash-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10]
          
          

1.3.1.1、 执行结果

[root@instance-gvpb80ao docs]# kubectl apply -f test.yaml
pod/first-pod created
[root@instance-gvpb80ao docs]# kubectl get -f test.yaml
NAME READY STATUS RESTARTS AGE
first-pod 0/1 ContainerCreating 0 6s

1.3.2、Pod 带来的好处

  1. Pod 做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极 大的方便。
  2. Pod 做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与 资源的分配。
  3. Pod 中的容器共享相同的数据和网络地址空间,Pod 之间也进行了统一的资源管理与分配。

1.3.3、Pod 是如何管理多个容器的

Pod 中可以同时运行多个进程(作为容器运行)协同工作。同一个 Pod 中的容器会自动的分配到同一个 node 上。同一个 Pod 中的容器共享资源、网络环境和依赖,所以它们总是被同时调度。在一个 Pod 中同时运行多个容 器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

1.3.4、Pod 中的数据持久性

Pod 在设计⽀持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死 掉会被驱逐。通常,我们是需要借助类似于 Docker 存储卷这样的资源来做 Pod 的数据持久化的

1.3.5、Pod 的生命周期和重启策略

Pod 在整个生命周期过程中被系统定义为各种状态,熟悉 Pod 各种状态对于我 理解如何设置 Pod 的调度策 略、重启策略是很有必要的。

1.3.5.1、 Pod 的状态

状态值 描述
挂起(Pending) API Server 创建了 pod 资源对象已存入 etcd 中,但它尚未被调度完成,或者仍处于从仓 库下载镜像的过程中。
运行中(Running) Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成
成功(Succeeded) Pod 中的所有容器都已经成功终止并且不会被重启
失败(Failed) Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。即容器以非 0 状 态退出或者被系统禁止。
未知(Unknown) Api Server 无法正常获取到 Pod 对象的状态信息,通常是由于无法与所在工作节点的 kubelet 通信所致

1.3.5.2、 Pod 的重启策略

Pod 重启策略( RestartPolicy )应用于 Pod 内的所有容器,井且仅在 Pod 所处的 Node 上由 kubelet 进 行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相应的 操作。Pod 的重启策略包括:Always、OnFailure 和 Never,默认值为 Alway

  1. Always:当容器失效时,由 kubelet 自动重启该容器。
  2. OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
  3. Never:不论容器运行状态如何,kubelet 都不会重启该容器。

kubelet 重启失效容器的时间间隔以 sync-frequency 乘以 2n 来计算;例如 1、2、4、8 倍等,最长延时 5min , 并且在成功重启后的 10 min 后重置该时间

kubelet 重启失效容器的时间间隔以 sync-frequency 乘以 2n 来计算;例如 1、2、4、8 倍等,最长延时 5min , 并且在成功重启后的 10 min 后重置该时间

1.RC 和 DaemonSet:必须设置为 Always,需要保证该容器持续运行。

2.Job 和 CronJob:OnFailure 或 Never,确保容器执行完成后不再重启。

3.kubelet:在 Pod 失效时自动重启它,不论将 RestartPolicy 设置为什么值,也不会对 Pod 进行健康检查。

1.3.6、Pod 的资源清单详解

image-20210307204232886

image-20210307204302830

eg:

# 资源类型
kind: Pod
# api版本号
apiVersion: v1

# 定义Pod的元信息

metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: aginx


spec:
  containers:
    - name: nginx
      image: nginx:1.19.2
      imagePullPolicy: IfNotPresent
kubectl apply -f pod-nginx.yaml
    
kubectl get pods -o wide

1.4、 Label

Label 是 Kubernetes 系统中另外一个核心概念。一个 Label 是一个 key=value 的键值对,其中 key 与 vaue 由用 户自己指定。Label 可以附加到各种资源对象上,例如 Node、Pod、Service、RC 等,一个资源对象可以定义任意 数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去,Label 通常在资源对象定义时确定,也可 以在对象创建后动态添加或者删除。

我们可以通过指定的资源对象捆绑一个或多个不同的 Label 来实现多维度的资源分组管理功能,以便于灵活、 方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监控和 分析应用(日志记录、监控、告警)等。一些常用等 label 示例如下。

  • 版本标签:"release" : "stable" , "release" : "canary"
  • 环境标签:"environment" : "dev" , "environment" : "production"
  • 架构标签:"tier" : "frontend" , "tier" : "backend" , "tier" : "middleware"
  • 分区标签:"partition" : "customerA" , "partition" : "customerB" 阿里云
  • 质量管控标签:"track" : "daily" , "track" :

Label 相当于我们熟悉的“标签”,給某个资源对象定义一个 Label,就相当于給它打了一个标签,随后可以 通过 Label Selector(标签选择器)查询和筛选拥有某些 Label 的资源对象,Kubernetes 通过这种方式实现了类似 SQL 的简单又通用的对象查询机制。

[root@kubernetes-master-01 ~]# kubectl get pods --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-86c57db685-xnstd   1/1     Running   2          26d     app=nginx,pod-template-hash=86c57db685
nginx-pod                1/1     Running   1          3h55m   app=aginx

image-20210307204902992

1.4.1、根据标签来查询 Pod

# 根据名称空间查询
[root@kubernetes-master-01 ~]# kubectl get pod --show-labels -n docs
No resources found in docs namespace.
[root@kubernetes-master-01 ~]# kubectl get pod --show-labels -n default
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
nginx-86c57db685-xnstd   1/1     Running   2          26d     app=nginx,pod-template-hash=86c57db685
nginx-pod                1/1     Running   1          3h58m   app=aginx

image-20210307205237560

# 根据标签名称查询
kubectl get pod -l env=dev

image-20210307210756544

1.4.2、增加标签

方式一:

# 直接修改.yml文件label
# 资源类型
kind: Pod
# api版本号
apiVersion: v1

# 定义Pod的元信息

metadata:
  name: nginx-pod
  namespace: default
  labels:
    app: nginx
    env: dev
        
spec:
  containers:
    - name: nginx
      image: nginx:1.19.2
      imagePullPolicy: IfNotPresent

# 执行
kubectl apply -f pod-nginx.yaml
# 查看标签
kubectl get pod --show-labels

image-20210307205816969

方式二:

kubectl label pod pod名称 标签键值对
kubectl label pod nginx-pod dev=test
kubectl get pod --show-labels

image-20210307210150224

1.4.3、删除标签

kubectl label pod pod名称 key名+-
kubectl label pod nginx-pod dev-

image-20210307210523544

1.4.4、可以将标签显示为列

 kubectl get pods -L app -n default

image-20210307211123568

1.5、 service 资源

service 是 k8s 中的一个重要概念,主要是提供负载均衡和服务自动发现。它是 k8s 中最核心的资源之一,每 一个 Service 就是我们平常所说的一个“微服务”。在非 k8s 世界中,管理员可以通过在配置文件中指定 IP 地址 或主机名,容许客户端访问,但在 k8s 中这种方式是行不通的。因为 Pod 是有生命周期的,它们可以被创建或 销毁。虽然通过控制器能够动态地创建 Pod,但当 Pod 被分配到某个节点时,K8s 都会为其分配一个 IP 地址,而 该 IP 地址不总是稳定可依赖的。因此,在 Kubernetes 集群中,如果一组 Pod(称为 backend)为其它 Pod (称 为 frontend)提供服务,那么那些 frontend 该如何发现,并连接到这组 backend 的 Pod 呢?

image-20210307211343121

如上图所示,Kubernetes 的 Service 定义了一个服务的访问入口,前端的应用(Pod)通过这个入口地址访问 其背后的一组由 Pod 副本组成的集群实例,Service 与其后端的 Pod 副本集群之间是通过 Label Selector 来实现关 联的,而 Deployment 则是保证 Service 的服务能力和服务质量始终处于预期的标准。

通过分析,识别并建模系统中的所有服务为微服务,最终我们的系统是由多个提供不同业务能力而彼此独立 的微服务单元所组成,服务之间通过 TCP/IP 进行通信,从而形成了强大而又灵活的弹性网络,拥有强大的分布 式能力、弹性扩展能力、容错能力。

每一个service就是一个对外暴露的一个服务,service通过标签连接每一个pod

说明:

kubectl get pod -o wide
kubectl get svc
kubectl describe svc nginx
kubectl get pod --show-labels # Selector负载均衡的就是nginx-pod、nginx-86c57db685-xnstd这两个pod Endpoints:关联所有的ip和端口

selector负载均衡:labels标签名为:app=nginx

image-20210307213031735

1.5.1、定义 Service

kubectl explain svc # 查看版本

image-20210309214754939


1.5.2、Service 的工作方式

在 Kubernetes 迭代过程中,给 Service 设置里三种工作方式,分别是:Userspace 方式、Iptables 以及 Ipvs, 这三种方式到现在为止,官方推荐使用 IPVS, 当集群不支持 IPVS 的时候,集群会降级到 Iptables

1.5.2.1、 Userspace

Client Pod 要访问 Server Pod 时,它先将请求发给本机内核空间中的 service 规则,由它再将请求,转给监听在指 定套接字上的 kube-proxy,kube-proxy 处理完请求,并分发请求到指定 Server Pod 后,再将请求递交给内核空间中 的 service,由 service 将请求转给指定的 Server Pod。由于其需要来回在用户空间和内核空间交互通信,因此效率 很差。

image-20210309215434621

1.5.2.2、 Iptables 模型

直接由内核中的 iptables 规则,接受 Client Pod 的请求,并处理完成后,直接转发给指定 ServerPod。这种方 式不再将请求转发给 kube-proxy,性能提升很多。

image-20210309215613047

1.5.2.3、 Ipvs 模型

在 ipvs 模式下,kube-proxy 监视 Kubernetes 服务和端点,调用 netlink 接口相应地创建 IPVS 规则, 并定 期将 IPVS 规则与 Kubernetes 服务和端点同步。 该控制循环可确保 IPVS 状态与所需状态匹配。 访问服务时, IPVS 将流量定向到后端 Pod 之一。

IPVS 代理模式基于类似于 iptables 模式的 netfilter 挂钩函数,但是使用哈希表作为基础数据结构,并且在 内核空间中工作。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的 延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS 模式还支持更高的网络流量吞 吐量。

image-20210309215817238

以上不论哪种,kube-proxy 都通过 watch 的方式监控着 kube-APIServer 写入 etcd 中关于 Pod 的最新状态信息, 它一旦检查到一个 Pod 资源被删除了 或 新建,它将立即将这些变化,反应再 iptables 或 ipvs 规则中,以便 iptables 和 ipvs 在调度 Clinet Pod 请求到 Server Pod 时,不会出现 Server Pod 不存在的情况

自 k8s1.1 以后,service 默认使用 ipvs 规则,若 ipvs 没有被激活,则降级使用 iptables 规则. 但在 1.1 以前,service 使用的模式默认为 userspace。

1.5.3、Service 类型

Service 是 Kubernetes 对外访问的窗口,针对不同的场景,kubernetes 为我们设置了四种 Service 的类型。

1.5.3.1、 ClusterIP

kubernetes 默认就是这种方式,是集群内部访问的方式,外部是无法访问的(集群外部是无法访问的)。其主要用于为集群内 Pod 访 问时,提供的固定访问地址,默认是自动分配地址,可使用 ClusterIP 关键字指定固定 IP。

kind: Service
apiVersion: v1

metadata:
  name: clusterip-svc
  namespace: default

spec:
  selector: # 选择器
    env: dev
  ports: # 暴露端口
    - port: 80 # 暴露端口(service端口)
      targetPort: 80 # 容器里面端口
  type: ClusterIP
    
kubectl apply -f clusterip-svc
kubectl get svc

image-20210309221149787

1.5.3.1.1、 Headless Service

kubernates 中还有一种 service 类型:headless serivces 功能,字面意思无 service 其实就是改 service 对外无提 供 IP。一般用于对外提供域名服务的时候,我们在 Ingress 章节详讲。

1.5.3.2、 NodePort

NodePort 是将主机 IP 和端口跟 kubernetes 集群所需要暴露的 IP 和端口进行关联,方便其对外提供服务内 部可以通过 ClusterIP 进行访问,外部用户可以通过 NodeIP:NodePort 的方式单独访问每个 Node 上的实例


image-20210309221130091

1.5.3.3、 LoadBalancer

LoadBalancer 类型的 service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的 k8s 集 群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的 信息将会通过 Service 的 status.loadBalancer 字段被发布出去。

kind: Service
apiVersion: v1

metadata:
  name: pod-svc
  namespace: default

spec:
  selector: # 选择器
    env: dev
  ports: # 暴露端口
    - port: 80 # 暴露端口(service端口)
      targetPort: 80 # 容器里面端口
  type: LoadBalancer


kubectl apply -f loadbalancer.yaml
kubectl get svc

image-20210309221949781

1.5.3.4、 ExternalName

ExternalName Service 是 Service 的一个特例,它没有选择器,也没有定义任何端口或 Endpoints。它的作用是 返回集群外 Service 的外部别名。它将外部地址经过集群内部的再一次封装(实际上就是集群 DNS 服务器将 CNAME 解析到了外部地址上),实现了集群内部访问即可。例如你们公司的镜像仓库,最开始是用 ip 访问,等到后面域 名下来了再使用域名访问。你不可能去修改每处的引用。但是可以创建一个 ExternalName,首先指向到 ip,等后 面再指向到域名。

kind: Service
apiVersion: v1
metadata:
  name: my-svc
spec:
  type: ExternalName
  externalName: www.baidu.com

image-20210309223043718

image-20210309223317747

1.6、 deployment 资源

Deployment 为 Pod 提供声明式更新。在 Deployment 对象中描述所需的状态,然后 Deployment 控制器将实 际状态以受控的速率更改为所需的状态。您可以定义部署以创建新的副本集,或删除现有部署并在新部署中采用 其所有资源。一句话:Deployment 主要功能是保证有足够的 Pod 正常对外提供服

deployment-->pod的控制器
作用保证一定数量的pod副本
eg:
有2个pod
宕机了一个:pod(1)
zabbix--->报警邮件--->运维同学检查哪里有问题-->启动服务pod(2)(太黑下班了)(手动创建)

当deployment发现一个服务宕机了,会自动创建一个服务pod
supcerctl管理进程,进程存在,不能够对外提供服务

1.6.1、创建 Depoyment

# 定义资源类型
kind: Deployment
# 指定API版本号
apiVersion: apps/v1
# 元信息
metadata:
  namespace: default
  name: test-deployment
  labels:
    app: test-deployment
spec:
  # 选择器
  selector:
    # 精确匹配
    matchLabels:
      app: nginx
      dev: pro

  # 定义pod的模板
  template:
    metadata:
      # 跟matchlabels精确匹配只能多不能少
      labels:
        app: nginx
        dev: pro
        name: randysun
    spec:
      containers:
        - name: nginx # 容器名称
          image: nginx:latest
          imagePullPolicy: IfNotPresent # 拉取镜像规则
  # 定义副本pod数量
  replicas: 2

1.6.1.1、 参数示意

nginx-deployment:Deployment 的名称。
replicas: 创建 Pod 的副本数。
selector:定义 Deployment 如何找到要管理的 Pod,与 template 的 label(标签)对应。
template 字段包含以下字段:
  app: nginx 使用 label(标签)标记 Pod
  spec:表示 Pod 运行一个名字为 nginx 的容器。
  image:运行此 Pod 使用的镜像
  Port:容器用于发送和接收流量的端口

1.6.1.2、 执行创建命令

vi deployment.yaml
kubectl apply -f deployment.yaml
kubectl get pod
kubectl get -f deployment.yaml

image-20210309231404200

假设一个pod出现问题

kubectl get -f deployment.yaml
kubectl delete pod test-deployment-69b64b5769-z572k 
kubectl get -f deployment.yaml
kubectl get pod -l dev=pro

[root@kubernetes-master-01 ~]# kubectl get -f deployment.yaml 
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
test-deployment   2/2     2            2           7m19s
[root@kubernetes-master-01 ~]# kubectl delete pod test-deployment-69b64b5769-z572k 
pod "test-deployment-69b64b5769-z572k" deleted
[root@kubernetes-master-01 ~]# kubectl get -f deployment.yaml 
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
test-deployment   2/2     2            2           8m1s
[root@kubernetes-master-01 ~]# kubectl get pod -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-69b64b5769-j8nns   1/1     Running   0          8m19s
test-deployment-69b64b5769-rs8f5   1/1     Running   0          26s

# 删除一个pod则立刻被创建一个pod

image-20210309231730134

升级版deployment对外提供服务

kind: Deployment
# 指定API版本号
apiVersion: apps/v1
# 元信息
metadata:
  namespace: default
  name: test-deployment
  labels:
    app: test-deployment
spec:
  # 选择器
  selector:
    # 精确匹配
    matchLabels:
      app: nginx
      dev: pro

  # 定义pod的模板
  template:
    metadata:
      # 跟matchlabels精确匹配只能多不能少
      labels:
        app: nginx
        dev: pro
        name: randysun
    spec:
      containers:
        - name: nginx # 容器名称
          image: nginx:latest
          imagePullPolicy: IfNotPresent # 拉取镜像规则
  # 定义副本pod数量
  replicas: 2

---
kind: Service
apiVersion: v1
metadata:
  name: test-deployment-svc

spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001
  selector: # 选择器与label一样只能多不能少
    app: nginx
    dev: pro

image-20210309232924406

image-20210309232902184

image-20210309233916343

不间断的对外提供服务

1.6.1.3、 注意

将 kubectl 标志设置--record 为 true 允许您将当前命令记录在正在创建或更新的资源的注释中。这对于将来 的检查很有用。

kubectl rollout history deployment test-deployment
kubectl delete -f deployment.yaml
kubectl get pod -l dev=pro
kubectl apply -f deployment.yaml --record
kubectl rollout history deployment test-deployment


[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         <none>

[root@kubernetes-master-01 ~]# kubectl delete -f deployment.yaml 
deployment.apps "test-deployment" deleted
service "test-deployment-svc" deleted
[root@kubernetes-master-01 ~]# kubectl get pod -l dev=pro
No resources found in default namespace.
[root@kubernetes-master-01 ~]# kubectl apply -f deployment.yaml --rec
--record     --recursive  
[root@kubernetes-master-01 ~]# kubectl apply -f deployment.yaml --record 
deployment.apps/test-deployment created
service/test-deployment-svc created
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml --record=true

[root@kubernetes-master-01 ~]# 

image-20210309234346110

1.6.2、查看部署状态

kubectl get pods -l dev=pro
# 查看部署详情并可以查看部署错误信息
kubectl describe pods test-deployment-69b64b5769-jsmqq
# 编辑控制器
kubectl edit deployments.apps test-deployment

[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-69b64b5769-9nphp   1/1     Running   0          2m19s
test-deployment-69b64b5769-jsmqq   1/1     Running   0          2m19s

image-20210309234551182

1.6.3、查看部署详情

[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-69b64b5769-9nphp   1/1     Running   0          4m36s
test-deployment-69b64b5769-jsmqq   1/1     Running   0          4m36s
[root@kubernetes-master-01 ~]# kubectl describe pods test-deployment-69b64b5769-jsmqq 
Name:         test-deployment-69b64b5769-jsmqq
Namespace:    default
Priority:     0
Node:         kubernetes-node-02/172.16.0.54
Start Time:   Tue, 09 Mar 2021 23:43:10 +0800
Labels:       app=nginx
              dev=pro
              name=randysun
              pod-template-hash=69b64b5769
Annotations:  <none>
Status:       Running
IP:           10.240.144.2
IPs:
  IP:           10.240.144.2
Controlled By:  ReplicaSet/test-deployment-69b64b5769
Containers:
  nginx:
    Container ID:   docker://8136e7ae43b75ae7f392294b70ad68cb084e582e0788c17d5a7648a879fc474c
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 09 Mar 2021 23:43:11 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xt6cs (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-xt6cs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-xt6cs
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 360s
                 node.kubernetes.io/unreachable:NoExecute for 360s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  4m52s  default-scheduler  Successfully assigned default/test-deployment-69b64b5769-jsmqq to kubernetes-node-02
  Normal  Pulled     4m52s  kubelet            Container image "nginx:latest" already present on machine
  Normal  Created    4m52s  kubelet            Created container nginx
  Normal  Started    4m51s  kubelet            Started container nginx

image-20210309235337046

1.6.4、更新

一般对应用程序升级或者版本迭代时,会通过 Deployment 对 Pod 进行滚动更新。

1.6.4.1、 设置

kubectl set image deployment 创建deployment的名字 创建的容器名字=镜像版本
kubectl set image deployment test-deployment nginx=nginx:1.18.0
# 现启动一个在删除,保证永远能够提供服务

image-20210310000530201

image-20210310000555976

1.6.4.2、 修改

# 将nginx版本修改为1.19.2镜像
kubectl edit deployments.apps test-deployment
kubectl get pods -l dev=pro
kubectl get  pods -l dev=pro -w

image-20210309235808717

image-20210310000029849

1.6.4.3、 查看更新状态

kubectl rollout status deployment 创建deploymen的名称
kubectl rollout status deployment test-deploymen

[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment 
deployment "test-deployment" successfully rolled out
[root@kubernetes-master-01 ~]# kubectl set image deployment test-deployment nginx=1.17.10
deployment.apps/test-deployment image updated
[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment 
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "test-deployment" rollout to finish: 1 out of 2 new replicas have been updated...

image-20210310221222423

1.6.5、回滚

当新版本不稳定时,可以对其进行回滚操作,默认情况下,所有 Deployment 的 rollout 历史都保留在系统中, 可以随时回滚。

1.6.5.1、 查看构建历史

kubectl rollout history deployment 创建deployment名称
# 查看当前构建历史
kubectl rollout history deployment test-deployment

[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml --record=true
2         kubectl apply --filename=deployment.yaml --record=true
3         kubectl apply --filename=deployment.yaml --record=true
4         kubectl apply --filename=deployment.yaml --record=true

image-20210310221707451

1.6.5.2、 回滚到上一个版本

# 查看当前构建历史

kubectl rollout history deployment test-deployment
# 开始回滚

kubectl rollout undo deployment test-deployment
# 查看构建状态
kubectl rollout status deployment test-deployment

# 查看 deployment 详细信息
kubectl describe pods test-deployment-5d45d64fdb-7gdlg


[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml --record=true
2         kubectl apply --filename=deployment.yaml --record=true
3         kubectl apply --filename=deployment.yaml --record=true
4         kubectl apply --filename=deployment.yaml --record=true

[root@kubernetes-master-01 ~]# kubectl get pods
NAME                               READY   STATUS             RESTARTS   AGE
nginx-86c57db685-xnstd             1/1     Running            4          29d
nginx-pod                          1/1     Running            3          3d5h
test-deployment-5d45d64fdb-4wtfw   1/1     Running            1          22h
test-deployment-5d45d64fdb-7gdlg   1/1     Running            1          22h
test-deployment-66bf6cc7d-4h7hw    0/1     ImagePullBackOff   0          16m
[root@kubernetes-master-01 ~]# 
[root@kubernetes-master-01 ~]# 
[root@kubernetes-master-01 ~]# kubectl rollout undo deployment test-deployment 
deployment.apps/test-deployment rolled back
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-5d45d64fdb-4wtfw   1/1     Running   1          22h
test-deployment-5d45d64fdb-7gdlg   1/1     Running   1          22h
[root@kubernetes-master-01 ~]# kubectl describe pod
poddisruptionbudgets.policy  pods                         podsecuritypolicies.policy   podtemplates                 
[root@kubernetes-master-01 ~]# kubectl describe pods test-deployment-5d45d64fdb-7gdlg 
Name:         test-deployment-5d45d64fdb-7gdlg
Namespace:    default
Priority:     0
Node:         kubernetes-node-02/172.16.0.54
Start Time:   Wed, 10 Mar 2021 00:03:40 +0800
Labels:       app=nginx
              dev=pro
              name=randysun
              pod-template-hash=5d45d64fdb
Annotations:  <none>
Status:       Running
IP:           10.240.8.2
IPs:
  IP:           10.240.8.2
Controlled By:  ReplicaSet/test-deployment-5d45d64fdb
Containers:
  nginx:
    Container ID:   docker://acfb7e914cd5ef549a99d13789d78d6c5a693f8d0f2313bc17db7dbba5c09bb5
    Image:          nginx:1.18.0
    Image ID:       docker-pullable://nginx@sha256:ebd0fd56eb30543a9195280eb81af2a9a8e6143496accd6a217c14b06acd1419
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 10 Mar 2021 21:58:13 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 10 Mar 2021 00:04:08 +0800
      Finished:     Wed, 10 Mar 2021 21:58:11 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xt6cs (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-xt6cs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-xt6cs
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 360s
                 node.kubernetes.io/unreachable:NoExecute for 360s
Events:
  Type    Reason          Age                From               Message
  ----    ------          ----               ----               -------
  Normal  Scheduled       22h                default-scheduler  Successfully assigned default/test-deployment-5d45d64fdb-7gdlg to kubernetes-node-02
  Normal  Pulling         22h                kubelet            Pulling image "nginx:1.18.0"
  Normal  Pulled          22h                kubelet            Successfully pulled image "nginx:1.18.0"
  Normal  SandboxChanged  26m                kubelet            Pod sandbox changed, it will be killed and re-created.
  Normal  Created         26m (x2 over 22h)  kubelet            Created container nginx
  Normal  Started         26m (x2 over 22h)  kubelet            Started container nginx
  Normal  Pulled          26m                kubelet            Container image "nginx:1.18.0" already present on machine
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml --record=true
2         kubectl apply --filename=deployment.yaml --record=true
4         kubectl apply --filename=deployment.yaml --record=true
5         kubectl apply --filename=deployment.yaml --record=true

image-20210310222708930

image-20210310222729102

image-20210310223106803

1.6.5.3、 回滚指定版本

# 查看当前历史版本
kubectl rollout history deployment test-deployment
# 回滚至指定版本
kubectl rollout undo deployment test-deployment --to-revision=1
# 查看回滚状态
kubectl rollout status deployment test-deployment
# 查看 deployment 详细信息
kubectl describe deployments.apps test-deployment
# 查看当前历史版本
kubectl rollout history deployment test-deployment

[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment.yaml --record=true
2         kubectl apply --filename=deployment.yaml --record=true
4         kubectl apply --filename=deployment.yaml --record=true
5         kubectl apply --filename=deployment.yaml --record=true

[root@kubernetes-master-01 ~]# kubectl rollout undo deployment test-deployment --to-revision=1
deployment.apps/test-deployment rolled back
[root@kubernetes-master-01 ~]# kubectl rollout status deployment test-deployment 
deployment "test-deployment" successfully rolled out
[root@kubernetes-master-01 ~]# kubectl describe deployments.apps test-deployment 
Name:                   test-deployment
Namespace:              default
CreationTimestamp:      Tue, 09 Mar 2021 23:43:10 +0800
Labels:                 app=test-deployment
Annotations:            deployment.kubernetes.io/revision: 6
                        kubernetes.io/change-cause: kubectl apply --filename=deployment.yaml --record=true
Selector:               app=nginx,dev=pro
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
           dev=pro
           name=randysun
  Containers:
   nginx:
    Image:        nginx:latest
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   test-deployment-69b64b5769 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled up replica set test-deployment-69b64b5769 to 2
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled up replica set test-deployment-6f5585566c to 1
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled down replica set test-deployment-69b64b5769 to 1
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled up replica set test-deployment-6f5585566c to 2
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled down replica set test-deployment-69b64b5769 to 0
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled up replica set test-deployment-5d45d64fdb to 1
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled down replica set test-deployment-6f5585566c to 1
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled up replica set test-deployment-5d45d64fdb to 2
  Normal  ScalingReplicaSet  22h   deployment-controller  Scaled down replica set test-deployment-6f5585566c to 0
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled up replica set test-deployment-66bf6cc7d to 1
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled down replica set test-deployment-66bf6cc7d to 0
  Normal  ScalingReplicaSet  28s   deployment-controller  Scaled up replica set test-deployment-69b64b5769 to 1
  Normal  ScalingReplicaSet  27s   deployment-controller  Scaled down replica set test-deployment-5d45d64fdb to 1
  Normal  ScalingReplicaSet  27s   deployment-controller  Scaled up replica set test-deployment-69b64b5769 to 2
  Normal  ScalingReplicaSet  24s   deployment-controller  Scaled down replica set test-deployment-5d45d64fdb to 0
[root@kubernetes-master-01 ~]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nginx-86c57db685-xnstd             1/1     Running   4          29d
nginx-pod                          1/1     Running   3          3d5h
test-deployment-69b64b5769-d55j9   1/1     Running   0          41s
test-deployment-69b64b5769-f5z4t   1/1     Running   0          42s
[root@kubernetes-master-01 ~]# kubectl rollout history deployment test-deployment 
deployment.apps/test-deployment 
REVISION  CHANGE-CAUSE
2         kubectl apply --filename=deployment.yaml --record=true
4         kubectl apply --filename=deployment.yaml --record=true
5         kubectl apply --filename=deployment.yaml --record=true
6         kubectl apply --filename=deployment.yaml --record=true

image-20210310223621994

image-20210310223640989

1.6.6、扩容

当业务的用户越来越多,目前的后端服务已经无法满足业务要求当前的业务要求,传统的解决办法是将其横 向增加服务器,从而满足我们的业务要求。K8S 中也是支持横向扩容的方法的。

第一种方式
# 第一种方式:scale
kubectl scale deployment test-deployment --replicas=7

[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-6f5585566c-7r2gf   1/1     Running   0          15m
test-deployment-6f5585566c-975ch   1/1     Running   0          15m
test-deployment-6f5585566c-vmzrf   1/1     Running   0          8m56s
[root@kubernetes-master-01 ~]# kubectl scale deployment test-deployment --replicas=7
deployment.apps/test-deployment scaled
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS              RESTARTS   AGE
test-deployment-6f5585566c-7r2gf   1/1     Running             0          15m
test-deployment-6f5585566c-975ch   1/1     Running             0          15m
test-deployment-6f5585566c-9hglp   0/1     ContainerCreating   0          8s
test-deployment-6f5585566c-kln8r   1/1     Running             0          7s
test-deployment-6f5585566c-p9xq2   1/1     Running             0          8s
test-deployment-6f5585566c-rsmvf   1/1     Running             0          8s
test-deployment-6f5585566c-vmzrf   1/1     Running             0          9m17s

image-20210310225647955

第二种方式
# 第二种方式: Patch(打标签)
kubectl patch deployments.apps nginx-deployment -p '{"spec": {"replicas": 5}}'

[root@kubernetes-master-01 ~]# kubectl patch deployments.apps test-deployment -p '{"spec": {"replicas": 3}}'
deployment.apps/test-deployment patched
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-6f5585566c-7r2gf   1/1     Running   0          14m
test-deployment-6f5585566c-975ch   1/1     Running   0          14m
test-deployment-6f5585566c-vmzrf   1/1     Running   0          7m59s

image-20210310225505261

第三种方式
# 第三种方式(在线编辑)edit 
kubectl edit deployments.apps test-deployment
[root@kubernetes-master-01 ~]# kubectl edit deployments.apps test-deployment 
deployment.apps/test-deployment edited
# 监听pods
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS             RESTARTS   AGE
test-deployment-5d45d64fdb-4wtfw   1/1     Running            1          22h
test-deployment-5d45d64fdb-7gdlg   1/1     Running            1          22h
test-deployment-66bf6cc7d-4h7hw    0/1     ImagePullBackOff   0          7m56s
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
ku	c	NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-6f5585566c-7r2gf   1/1     Running   0          4m55s
test-deployment-6f5585566c-975ch   1/1     Running   0          4m57s
[root@kubernetes-master-01 ~]# kubectl get pods -o -w
error: unable to match a printer suitable for the output format "-w", allowed formats are: custom-columns,custom-columns-file,go-template,go-template-file,json,jsonpath,jsonpath-file,name,template,templatefile,wide,yaml
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro -w
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-6f5585566c-7r2gf   1/1     Running   0          5m16s
test-deployment-6f5585566c-975ch   1/1     Running   0          5m18s


test-deployment-6f5585566c-vmzrf   0/1     Pending   0          0s
test-deployment-6f5585566c-vmzrf   0/1     Pending   0          0s
test-deployment-6f5585566c-2hj99   0/1     Pending   0          0s
test-deployment-6f5585566c-whvht   0/1     Pending   0          0s
test-deployment-6f5585566c-whvht   0/1     Pending   0          0s
test-deployment-6f5585566c-2hj99   0/1     Pending   0          1s
test-deployment-6f5585566c-vmzrf   0/1     ContainerCreating   0          1s
test-deployment-6f5585566c-2hj99   0/1     ContainerCreating   0          1s
test-deployment-6f5585566c-whvht   0/1     ContainerCreating   0          2s
test-deployment-6f5585566c-vmzrf   1/1     Running             0          18s
test-deployment-6f5585566c-2hj99   1/1     Running             0          32s
test-deployment-6f5585566c-whvht   1/1     Running             0          2m21s
test-deployment-6f5585566c-975ch   1/1     Running             0          8m37s
test-deployment-6f5585566c-975ch   1/1     Running             0          8m47s
test-deployment-6f5585566c-whvht   1/1     Running             0          2m36s
test-deployment-6f5585566c-whvht   1/1     Running             0          2m40s
test-deployment-6f5585566c-975ch   1/1     Running             0          9m8s
test-deployment-6f5585566c-975ch   1/1     Running             0          9m17s
test-deployment-6f5585566c-whvht   1/1     Running             0          3m27s
test-deployment-6f5585566c-whvht   1/1     Running             0          3m29s

# 查看创建的pod
[root@kubernetes-master-01 ~]# kubectl get pods -l dev=pro
NAME                               READY   STATUS    RESTARTS   AGE
test-deployment-6f5585566c-2hj99   1/1     Running   0          5m26s
test-deployment-6f5585566c-7r2gf   1/1     Running   0          11m
test-deployment-6f5585566c-975ch   1/1     Running   0          11m
test-deployment-6f5585566c-vmzrf   1/1     Running   0          5m26s
test-deployment-6f5585566c-whvht   1/1     Running   0          5m26s

image-20210310224633621

image-20210310225025010

image-20210310225736635

1.6.7、暂停部署

# 暂停部署
[root@kubernetes-master-01 ~]# kubectl rollout pause deployment test-deployment 
deployment.apps/test-deployment paused


# 设置镜像升级
[root@kubernetes-master-01 ~]# kubectl set image deployment test-deployment nginx=nginx:1.17.0
deployment.apps/test-deployment image updated


# 查看部署状态,发现没有开始部署
[root@kubernetes-master-01 ~]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nginx-86c57db685-xnstd             1/1     Running   4          29d
nginx-pod                          1/1     Running   3          3d6h
test-deployment-6f5585566c-7r2gf   1/1     Running   0          20m
test-deployment-6f5585566c-975ch   1/1     Running   0          20m
test-deployment-6f5585566c-9hglp   1/1     Running   0          4m52s
test-deployment-6f5585566c-kln8r   1/1     Running   0          4m51s
test-deployment-6f5585566c-p9xq2   1/1     Running   0          4m52s
test-deployment-6f5585566c-rsmvf   1/1     Running   0          4m52s
test-deployment-6f5585566c-vmzrf   1/1     Running   0          14m
# 取消暂停,开始部署
[root@kubernetes-master-01 ~]# kubectl rollout resume deployment test-deployment 
deployment.apps/test-deployment resumed


# 查看状态,发现开始部署
[root@kubernetes-master-01 ~]# kubectl get pods
NAME                               READY   STATUS              RESTARTS   AGE
nginx-86c57db685-xnstd             1/1     Running             4          29d
nginx-pod                          1/1     Running             3          3d6h
test-deployment-6f5585566c-7r2gf   1/1     Running             0          21m
test-deployment-6f5585566c-975ch   1/1     Running             0          21m
test-deployment-6f5585566c-9hglp   1/1     Running             0          5m45s
test-deployment-6f5585566c-p9xq2   1/1     Running             0          5m45s
test-deployment-6f5585566c-rsmvf   1/1     Running             0          5m45s
test-deployment-6f5585566c-vmzrf   1/1     Running             0          14m
test-deployment-765f4986fd-8fscm   0/1     ContainerCreating   0          7s
test-deployment-765f4986fd-8pb59   0/1     ContainerCreating   0          7s
test-deployment-765f4986fd-hvmtw   0/1     ContainerCreating   0          7s

image-20210310230252390

image-20210310230331541

posted @ 2021-11-23 22:45  RandySun  阅读(101)  评论(0编辑  收藏  举报