1。Kubernetes对象资源 Kubernetes系统化学习之基本概念篇(一) Kubernetes系统化学习之POD原理篇(二) Kubernetes系统化学习之资源清单篇(三) Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。 根据不同的级别,可以将Kubernetes中的资源进行多种分类。以下列举的内容都是Kubernetes中的Object,这些对象都可以在yaml文件中作为一种API类型来配置。工作负载型资源:Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob服务发现及负载均衡型资源:Service、Ingress配置与存储型资源:Volume、CSI特殊类型的存储卷:ConfigMap、Secret、DownwardAPI集群级别资源:Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding元数据型资源:HPA、PodTemplate、LimitRange2。YML资源文件概览 当创建Kubernetes对象时,必须提供对象的规约,用来描述该对象的期望状态,以及关于对象的一些基本信息,例如名称。当使用KubernetesAPI创建对象时,或者直接创建或者基于kubectl,API请求必须在请求体中包含JSON格式的信息。大多数情况下,需要在。yaml文件中为kubectl提供这些信息。kubectl在发起API请求时,将这些信息转换成JSON格式。 大体的。yaml文件格式如下所示,其中包含的都是配置yaml文件启动服务必须或者建议配置的字段。apiVersion:v1必选,版本号,例如v1kind:Pod必选,资源类型,例如Podmetadata:必选,元数据name:string必选,Pod名称namespace:stringPod所属的命名空间,默认为defaultlabels:自定义标签列表name:stringspec:必选,Pod中容器的详细定义containers:必选,Pod中容器列表name:string必选,容器名称image:string必选,容器的镜像名称imagePullPolicy:〔AlwaysNeverIfNotPresent〕获取镜像的策略command:〔string〕容器的启动命令列表,如不指定,使用打包时使用的启动命令args:〔string〕容器的启动命令参数列表workingDir:string容器的工作目录volumeMounts:挂载到容器内部的存储卷配置name:string引用pod定义的共享存储卷的名称,需用volumes〔〕部分定义的的卷名mountPath:string存储卷在容器内mount的绝对路径,应少于512字符readOnly:boolean是否为只读模式ports:需要暴露的端口库号列表name:string端口的名称containerPort:int容器需要监听的端口号hostPort:int容器所在主机需要监听的端口号,默认与Container相同protocol:string端口协议,支持TCP和UDP,默认TCPenv:容器运行前需设置的环境变量列表name:string环境变量名称value:string环境变量的值resources:资源限制和请求的设置limits:资源限制的设置cpu:stringCpu的限制,单位为core数,将用于dockerruncpushares参数memory:string内存限制,单位可以为MibGib,将用于dockerrunmemory参数requests:资源请求的设置cpu:stringCpu请求,容器启动的初始可用数量memory:string内存请求,容器启动的初始可用数量lifecycle:生命周期钩子postStart:容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启preStop:容器终止前执行此钩子,无论结果如何,容器都会终止livenessProbe:对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器exec:对Pod容器内检查方式设置为exec方式command:〔string〕exec方式需要制定的命令或脚本httpGet:对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、portpath:stringport:numberhost:stringscheme:stringHttpHeaders:name:stringvalue:stringtcpSocket:对Pod内个容器健康检查方式设置为tcpSocket方式port:numberinitialDelaySeconds:0容器启动完成后首次探测的时间,单位为秒timeoutSeconds:0对容器健康检查探测等待响应的超时时间,单位秒,默认1秒periodSeconds:0对容器监控检查的定期探测时间设置,单位秒,默认10秒一次successThreshold:0failureThreshold:0securityContext:privileged:falserestartPolicy:〔AlwaysNeverOnFailure〕Pod的重启策略nodeName:string设置NodeName表示将该Pod调度到指定到名称的node节点上nodeSelector:obeject设置NodeSelector表示将该Pod调度到包含这个label的node上imagePullSecrets:Pull镜像时使用的secret名称,以key:secretkey格式指定name:stringhostNetwork:false是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络volumes:在该pod上定义共享存储卷列表name:string共享存储卷名称(volumes类型有很多种)emptyDir:{}类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值hostPath:string类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录path:stringPod所在宿主机的目录,将被用于同期中mount的目录secret:类型为secret的存储卷,挂载集群与定义的secret对象到容器内部scretname:stringitems:key:stringpath:stringconfigMap:类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name:stringitems:key:stringpath:string复制代码3。Pod资源字段详解 在kubernetes中基本所有资源的一级属性都是一样的,主要包含5部分:apiVersion版本,由kubernetes内部定义,版本号必须可以用kubectlapiversions查询到;kind类型,由kubernetes内部定义,版本号必须可以用kubectlapiresources查询到;metadata元数据,主要是资源标识和说明,常用的有name、namespace、labels等;spec描述,这是配置中最重要的一部分,里面是对各种资源配置的详细描述;status状态信息,里面的内容不需要定义,由kubernetes自动生成。apiVersion:版本信息kind:资源类别metadata:资源元数据name:元数据对应的名称namespace:元数据所属的命名空间lables:对资源打上便签供后续使用annotations:主要目的是方便用户阅读查找spec:定义期望状态status:设置当前状态复制代码 关于Pod的前置知识学习请参考Kubernetes系统化学习之POD原理篇(二) 创建一个Podvimnginx。yaml复制代码 nginx。yaml:vimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址ports:可选,容器需要暴露的端口号列表containerPort:80端口号复制代码kubectlcreatefnginx。yaml复制代码 输出结果:kubectlcreatefnginx。yamlpodnginxcreated复制代码 查看Pod状态kubectlgetponginx复制代码 输出结果:kubectlgetponginxNAMEREADYSTATUSRESTARTSAGEnginx01ContainerCreating020s复制代码 使用kubectlrun创建一个Podkubectlrunnginxrunimagenginx:1。15。12复制代码 在上面的属性中,spec是接下来研究的重点,继续看下它的常见子属性:containers〔〕Object容器列表,用于定义容器的详细信息;nodeName根据nodeName的值将pod调度到指定的Node节点上;nodeSelectormap〔〕根据NodeSelector中定义的信息选择将该Pod调度到包含这些label的Node上;hostNetwork是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络;volumes〔〕Object存储卷,用于定义Pod上面挂在的存储信息;restartPolicy重启策略,表示Pod在遇到故障的时候的处理策略; 资源清单中常见字段的解释: 参数名 字段类型 说明 version String 这里是值的是k8sAPI的版本,目前基本上是v1,可以用kubectlapiversions命令查询 kind String 这里指的是yaml文件定义的资源类型和角色,比如:Pod metadata Object 元数据对象,固定值就写metadata metadata。name String 元数据对象的名字,这里由我们编写,比如命名Pod的名字 metadata。namespace String 元数据对象的命名空间,由我们自身定义 spec Object 详细定义对象,固定值就写spec spec。containers〔〕 list 这里是spec对象的容器列表定义,是一个列表 spec。containers〔〕。name String 这里定义容器的名字 spec。containers〔〕。image String 这里定义要用到的镜像名称 spec。containers〔〕。imagePullPolicy String 定义镜像拉取策略,有Always,Never,IfNotPresent三个值(1)Always:意思是每次都尝试重新拉取镜像(2)Never:表示仅使用本地镜像(3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像,上面三个值都没有设置的话,默认是Always spec。containers〔〕。command〔〕 List 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令 spec。containers〔〕。args〔〕 list 指定容器启动命令参数,因为是数组可以指定多个 spec。containers〔〕。workingDir String 指定容器的工作目录 spec。containers〔〕。volumeMounts〔〕 list 指定容器内部的存储配置 spec。containers〔〕。volumeMounts〔〕。name String 指定可以被容器挂载的存储卷的名称 spec。containers〔〕。volumeMounts〔〕。mountPath String 指定可以被容器挂载的存储卷的路径 spec。containers〔〕。volumeMounts〔〕。readOnly String 设置存储卷路径的读写模式,ture或者false,默认为读写模式 spec。containers〔〕。ports〔〕 list 指定容器需要用到的端口列表 spec。containers〔〕。ports〔〕。name String 指定端口名称 spec。containers〔〕。ports〔〕。containerPort String 指定容器需要监听的端口号 spec。containers〔〕。ports〔〕。hostPort String 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) spec。containers〔〕。ports〔〕。protocol String 指定端口协议,支持tcp和udp,默认值tcp spec。containers〔〕。env〔〕 List 指定容器运行前需要设置的环境变量列表 spec。containers〔〕。env〔〕。name String 指定环境变量名称 spec。containers〔〕。env〔〕。value String 指定环境变量值 spec。containers〔〕。resources Object 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) spec。containers〔〕。resources。limits Object 指定设置容器的运行时资源的运行上限 spec。containers〔〕。resources。limits。cpu String 指定cpu的限制,单位为core数,将用于dockerruncpushares参数 spec。containers〔〕。resources。limits。memory String 指定MEM内存的限制,单位为MIB,GiB spec。containers〔〕。resources。requests Object 指定容器启动和调度时的限制设置 spec。containers〔〕。resources。requets。cpu string CPU请求,单位为core数,容器启动时初始化可用数量 spec。containers〔〕。resources。requets。memory string 内存请求,单位为MIB,GiB,容器启动的初始化可用数量 spec。restartPolicy String 定义Pod的重启策略,可选值为Always,OnFailure,默认为Always,1。Always:Pod一旦终止运行则无论容器是如何终止的,kubelet服务都将重启它,2,OnFailure:只有Pod以非零退出码终止时,kubelet才会重启该容器,如果容器正常结束(退出码为0),则kubelet将不会重启它,3。Never:pod终止后,kubelet将退出码报告给Master,不会重启该pod spec。nodeSelector object 定义node的label过滤标签,以key:value格式指定 spec。imagePullSecrets object 定义pull镜像时使用secret名称,以name:secretkey格式指定 spec。hostNetwork Boolean 定义是否使用主机网络模式,默认为false,设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法再同一台宿主机上启动第二个副本vimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址command:可选,容器启动执行的命令sleep10env:必选,容器运行前的环境变量列表name:PASSWORDvalue:123456ports:可选,容器需要暴露的端口号列表containerPort:80端口号volumeMounts:可选,容器内部的存储配置name:confmountPath:usrlocalnginxconf被容器挂载的存储卷的路径resources:可选,容器计算资源limit:cpu:100m容器最大使用的cpu规格memory:512Mi容器最大使用的内存规格复制代码Pod镜像拉取策略 操作方式 说明 Always 总是拉取,当镜像tag为latest时,且imagePullPolicy未配置,默认为Always Never 不管是否存在都不会拉取 IfNotPresent 镜像不存在时拉取镜像,如果tag为非latest,且imagePullPolicy未配置,默认为IfNotPresentvimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址imagePullPolicy:IfNotPresent可选,镜像拉取策略ports:可选,容器需要暴露的端口号列表containerPort:80端口号复制代码Pod重启策略 操作方式 说明 Always 默认策略。容器失效时,自动重启该容器 OnFailure 容器以不为0的状态码终止,自动重启该容器 Never 无论何种状态,都不会重启vimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址imagePullPolicy:IfNotPresent可选,镜像拉取策略ports:可选,容器需要暴露的端口号列表containerPort:80端口号restartPolicy:Never复制代码Pod三种探针 种类 说明 startupProbe Kubernetes1。16新加的探测方式,用于判断容器内的应用程序是否已经启动。如果配置了startupProbe,就会先禁用其他探测,直到它成功为止。如果探测失败,Kubelet会杀死容器,之后根据重启策略进行处理,如果探测成功,或没有配置startupProbe,则状态为成功,之后就不再探测 livenessProbe 用于探测容器是否在运行,如果探测失败,kubelet会杀死容器并根据重启策略进行相应的处理。如果未指定该探针,将默认为Success readinessProbe 一般用于探测容器内的程序是否健康,即判断容器是否为就绪(Ready)状态。如果是,则可以处理请求,反之EndpointsController将从所有的Service的Endpoints中删除此容器所在Pod的IP地址。如果未指定,将默认为SuccessPod探针的实现方式 实现方式 说明 ExecAction 在容器内执行一个指定的命令,如果命令返回值为0,则认为容器健康 TCPSocketAction 通过TCP连接检查容器指定的端口,如果端口开放,则认为容器健康 HTTPGetAction 对指定的URL进行Get请求,如果状态码在200400之间,则认为容器健康vimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址imagePullPolicy:IfNotPresentcommand:可选,容器启动执行的命令shcsleep10;nginxgdaemonoff;readinessProbe:可选,健康检查。注意三种检查方式同时只能使用一种。httpGet:接口检测方式path:index。html检查路径port:80scheme:HTTPHTTPorHTTPSinitialDelaySeconds:10初始化时间,健康检查延迟执行时间timeoutSeconds:2超时时间periodSeconds:5检测间隔successThreshold:1检查成功为2次表示就绪failureThreshold:2检测失败1次表示未就绪livenessProbe:可选,健康检查tcpSocket:端口检测方式port:80initialDelaySeconds:10初始化时间timeoutSeconds:2超时时间periodSeconds:5检测间隔successThreshold:1检查成功为2次表示就绪failureThreshold:2检测失败1次表示未就绪ports:可选,容器需要暴露的端口号列表containerPort:80端口号restartPolicy:Never复制代码Pod的preStop和postStartvimnginx。yamlapiVersion:v1必选,API的版本号kind:Pod必选,类型Podmetadata:必选,元数据name:nginx必选,符合RFC1035规范的Pod名称spec:必选,用于定义Pod的详细信息containers:必选,容器列表name:nginx必选,符合RFC1035规范的容器名称image:nginx:1。15。12必选,容器所用的镜像的地址imagePullPolicy:IfNotPresentlifecycle:postStart:容器创建完成后执行的指令,可以是exechttpGetTCPSocketexec:command:shcmkdirdatapreStop:exec:command:shcsleep10ports:可选,容器需要暴露的端口号列表复制代码4。Pod的生命周期 Pod的生命周期才是Kubernetest资源清单中的重中之重! Kubernetes中的基本组件kubecontrollermanager就是用来控制Pod的状态和生命周期的,在了解各种controller之前我们有必要先了解下Pod本身和其生命周期。想要深入理解Pod的实现原理,最好最快的办法就是从Pod的生命周期入手,通过理解Pod创建、重启和删除的原理我们最终就能够系统地掌握Pod的生命周期与核心原理。 将Pod对象从创建至终的这段时间范围称为Pod的生命周期,它主要包含下面的过程:Pod创建过程运行初始化容器(initcontainer)过程运行主容器(maincontainer)容器启动后钩子(poststart)、容器终止前钩子(prestop)容器的存活性探测(livenessprobe)、就绪性探测(readinessprobe)Pod终止过程InitC(Init容器) Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。Init容器与普通的容器非常像,除了如下两点:Init容器总是运行到成功完成为止;每个Init容器都必须在下一个Init容器启动之前成功完成。 如果Pod的Init容器失败,Kubernetes会不断地重启Pod,直到Init容器成功为止,然而,如果Pod对应的restartPolicy为Never,它不会重新启动。 因为init容器具有应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的;它们可以包含实用工具和定制化代码来安装,但是不能出现在应用程序镜像中,例如,创建镜像没有必要FROM另一个镜像,只需要在安装过程中使用类似sed,awk,python或dig这样的工具;应用程序镜像可以分离出创建和部署角色,二没有必要联合他们构建一个单独的镜像;init容器使用linuxnamespace,所以相对应用程序容器来说具有不同的文件系统视图,因此,他们能够具有访问secret的权限,二应用程序容器则不能;他们必须在应用程序容器启动之前运行完成,二应用程序容器是并行运行的。所以init容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法,知道满足了一种先决条件;Pod的状态(相位) 状态 说明 Pending(挂起) Pod已被Kubernetes系统接收,但仍有一个或多个容器未被创建,可以通过kubectldescribe查看处于Pending状态的原因 Running(运行中) Pod已经被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个 是运行状态,或者是正在启动或者重启,可以通过kubectllogs查看Pod的日志 Succeeded(成功) 所有容器执行成功并终止,并且不会再次重启,可以通过kubectllogs查看Pod日志 Failed(失败) 所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过logs和describe查看Pod日志和状态 Unknown(未知) 通常是由于通信问题造成的无法获得Pod的状态Pod的创建过程用户通过kubectl或其他api客户端提交需要创建的pod信息给apiServer;apiServer开始生成pod对象的信息,并将信息存入etcd,然后返回确认信息至客户端;apiServer开始反映etcd中的pod对象的变化,其它组件使用watch机制来跟踪检查apiServer上的变动;scheduler发现有新的pod对象要创建,开始为Pod分配主机并将结果信息更新至apiServer;node节点上的kubelet发现有pod调度过来,尝试调用docker启动容器,并将结果回送至apiServer;apiServer将接收到的pod状态信息存入etcd中。Pod的终止过程用户向apiServer发送删除pod对象的命令;apiServcer中的pod对象信息会随着时间的推移而更新,在宽限期内(默认30s),pod被视为dead;将pod标记为terminating状态;kubelet在监控到pod对象转为terminating状态的同时启动pod关闭过程;端点控制器监控到pod对象的关闭行为时将其从所有匹配到此端点的service资源的端点列表中移除;如果当前pod对象定义了preStop钩子处理器,则在其标记为terminating后即会以同步的方式启动执行;pod对象中的容器进程收到停止信号;宽限期结束后,若pod中还存在仍在运行的进程,那么pod对象会收到立即终止的信号;kubelet请求apiServer将此pod资源的宽限期设置为0从而完成删除操作,此时pod对于用户已不可见。5。Pod的控制器使用 我们很少会直接在kubernetes中创建单个Pod。因为Pod的生命周期是短暂的,用后即焚的实体。当Pod被创建后,都会被Kubernetes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。 我们需要知道Pod本身是不会自愈修复的。如果Pod运行的Node故障或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node因为缺少资源或者Pod处于维护状态,那么Pod也就会被自动驱逐掉。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。 需要注意的是,重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。 Kubernetes使用了一个更高级的称为控制器的抽象,由它处理相对可丢弃的Pod实例的管理工作。因此,虽然可以直接使用Pod,但在Kubernetes中,更为常见的是使用控制器管理Pod。DeploymentStatefulSetDaemonSetDeployment资源清单 为了更好地解决服务编排的问题,k8s在V1。2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。 apiVersion:appsv1版本号kind:Deployment类型metadata:元数据name:rs名称namespace:所属命名空间labels:标签controller:deployspec:详情描述replicas:副本数量revisionHistoryLimit:保留历史版本,默认是10paused:暂停部署,默认是falseprogressDeadlineSeconds:部署超时时间(s),默认是600strategy:策略type:RollingUpdates滚动更新策略rollingUpdate:滚动更新maxSurge:最大额外可以存在的副本数,可以为百分比,也可以为整数maxUnavaliable:最大不可用状态的pod的最大值,可以为百分比,也可以为整数selector:选择器,通过它指定该控制器管理哪些podmatchLabels:Labels匹配规则app:nginxpodmatchExpressions:Expression匹配规则{key:app,operator:In,values:〔nginxpod〕}template:模板,当副本数量不足时,会根据下面的模板创建pod副本metadata:labels:app:nginxpodspec:containers:name:nginximage:nginx:1。17。1ports:containerPort:80复制代码Deployment主要功能 一个简易的Deployment的例子(nginxdeployment。yaml):apiVersion:appsv1kind:Deploymentmetadata:name:nginxdeploymentnamespace:devspec:replicas:3selector:matchLabels:app:nginxpodtemplate:metadata:labels:app:nginxpodspec:containers:name:nginximage:nginx:1。17。1复制代码 创建deployment〔rootmaster〕kubectlcreatefnginxdeployment。yamldeployment。appsnginxdeploymentcreated〔rootmaster〕kubectlgetdeployndevowideNAMEREADYUPTODATEAVAILABLEAGECONTAINERSIMAGESSELECTORnginxdeployment333316snginxnginx:1。17。1appnginxpod复制代码〔rootmaster〕kubectlgetrsndevNAMEDESIREDCURRENTREADYAGEnginxdeployment5d89bdfbf93332m13s〔rootmaster〕kubectlgetpodndevNAMEREADYSTATUSRESTARTSAGEnginxdeployment5d89bdfbf9k8j9n11Running02m42snginxdeployment5d89bdfbf9vw87k11Running02m42snginxdeployment5d89bdfbf9x7nsm11Running02m42s复制代码 伸缩扩容〔rootmaster〕kubectlscaledeploynginxdeploymentreplicas5ndevdeployment。appsnginxdeploymentscaled〔rootmaster〕kubectlgetpodndevNAMEREADYSTATUSRESTARTSAGEnginxdeployment5d89bdfbf9bhcns11Running083snginxdeployment5d89bdfbf9cfls711Running083snginxdeployment5d89bdfbf9k8j9n11Running08m54snginxdeployment5d89bdfbf9vw87k11Running08m54snginxdeployment5d89bdfbf9x7nsm11Running08m54s复制代码 镜像更新 更新方式 配置名称 更新说明 重建更新 Recreate 在创建出新的pod之前会先杀掉所有已存在的pod 滚动更新(默认) RollingUpdate 杀死一部分,就启动一部分,在更新过程中,存在两个版本podstrategy:指定新的pod替换旧的pod的策略,支持两个属性:type:指定策略类型,支持两种策略Recreate:在创建出新的pod之前会先杀掉所有已存在的podRollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本podrollingUpdate:当type为RollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性maxUnavailable:用来指定在升级过程中不可用pod的最大数量,默认为25maxSurge:用来指定在升级过程中可以超过期望的pod的最大数量,默认为25复制代码〔rootmaster〕vimnginxdeployment。yaml〔rootmaster〕kubectlapplyfnginxdeployment。yamlWarning:kubectlapplyshouldbeusedonresourcecreatedbyeitherkubectlcreatesaveconfigorkubectlapplydeployment。appsnginxdeploymentconfigured复制代码记录以前的pod〔rootmaster〕kubectlgetpodndevNAMEREADYSTATUSRESTARTSAGEnginxdeployment5d89bdfbf9526wf11Running061snginxdeployment5d89bdfbf9b5x5v11Running064snginxdeployment5d89bdfbf9kc7hb11Running059s更新镜像〔rootmaster〕kubectlsetimagedeploynginxdeploymentnginxnginx:1。17。2ndevdeployment。appsnginxdeploymentimageupdated查看pod状态〔rootmaster〕kubectlgetpodndevNAMEREADYSTATUSRESTARTSAGEnginxdeployment5d89bdfbf9526wf01Terminating02m2snginxdeployment5d89bdfbf9b5x5v11Running02m5snginxdeployment5d89bdfbf9kc7hb01Terminating02mnginxdeployment675d469f8b7vw6x11Running03snginxdeployment675d469f8brzq8201ContainerCreating02snginxdeployment675d469f8bzk4fs11Running05s〔rootmaster〕kubectlgetpodndevNAMEREADYSTATUSRESTARTSAGEnginxdeployment675d469f8b7vw6x11Running038snginxdeployment675d469f8brzq8211Running037snginxdeployment675d469f8bzk4fs11Running040s复制代码 滚动更新的过程如图: 版本回退 deployment支持版本升级过程中的暂停,继续功能以及版本回退等诸多功能,下面具体来看 kubectlrollout:版本升级相关功能,支持下面的选项:status:显示当前升级状态history:显示升级历史记录pause:暂停版本升级过程resume:继续已经暂停的版本升级过程restart:重启版本升级过程undo:回滚到上一级版本(可以使用torevision回滚到指定版本)查看升级状态〔rootmaster〕kubectlrolloutstatusdeploynginxdeploymentndevdeploymentnginxdeploymentsuccessfullyrolledout查看升级历史(注意:如果只显示版本号说明一开始使用yaml创建文件的时候没有加上record命令)〔rootmaster〕kubectlrollouthistorydeploynginxdeploymentndevdeployment。appsnginxdeploymentREVISIONCHANGECAUSE1kubectlcreatefilenamenginxdeployment。yamlrecordtrue2kubectlcreatefilenamenginxdeployment。yamlrecordtrue版本回滚这里使用torevision1回滚到1版本,如果省略这个选项,则会回退到上个版本〔rootmaster〕kubectlrolloutundodeploynginxdeploymenttorevision1ndevdeployment。appsnginxdeploymentrolledback查看是否回滚成功,发现5序号开头的rs被启动了〔rootmaster〕kubectlgetrsndevNAMEDESIREDCURRENTREADYAGEnginxdeployment5d89bdfbf933331mnginxdeployment675d469f8b00022m复制代码 金丝雀发布 deployment支持更新过程中的控制,如暂停(pause)或继续(resume)更新操作。 比如有一批新的pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新的pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。更新deployment版本,并配置暂停deployment〔rootmaster〕kubectlsetimagedeploynginxdeploymentnginxnginx:1。17。2ndevkubectlrolloutpausedeploynginxdeploymentndevdeployment。appsnginxdeploymentimageupdateddeployment。appsnginxdeploymentpaused查看rs,发现老版本rs没有减少,新版本rs增加一个〔rootmaster〕kubectlgetrsndevNAMEDESIREDCURRENTREADYAGEnginxdeployment5d89bdfbf933344mnginxdeployment675d469f8b11135m在窗口2中查看deploy状态,发现deploy正在等待更新且已经有1个更新好了〔rootmaster〕kubectlrolloutstatusdeploynginxdeploymentndevWaitingfordeploymentnginxdeploymentrollouttofinish:1outof3newreplicashavebeenupdated。。。在窗口1中继续deploy的更新〔rootmaster〕kubectlrolloutresumedeploynginxdeploymentndevdeployment。appsnginxdeploymentresumed查看窗口2的状态Waitingfordeploymentspecupdatetobeobserved。。。Waitingfordeploymentspecupdatetobeobserved。。。Waitingfordeploymentnginxdeploymentrollouttofinish:1outof3newreplicashavebeenupdated。。。Waitingfordeploymentnginxdeploymentrollouttofinish:1outof3newreplicashavebeenupdated。。。Waitingfordeploymentnginxdeploymentrollouttofinish:2outof3newreplicashavebeenupdated。。。Waitingfordeploymentnginxdeploymentrollouttofinish:2outof3newreplicashavebeenupdated。。。Waitingfordeploymentnginxdeploymentrollouttofinish:2outof3newreplicashavebeenupdated。。。Waitingfordeploymentnginxdeploymentrollouttofinish:1oldreplicasarependingtermination。。。Waitingfordeploymentnginxdeploymentrollouttofinish:1oldreplicasarependingtermination。。。deploymentnginxdeploymentsuccessfullyrolledout在窗口1查看rs更新结果,发现老版本均停止,新版本已经创建好〔rootmaster〕kubectlgetrsndevNAMEDESIREDCURRENTREADYAGEnginxdeployment5d89bdfbf900049mnginxdeployment675d469f8b33340m