摘要
本文内容转自网络,个人学习记录使用,请勿传播
在Kubernets中部署应用的流程
制作镜像
通过Dockerfile制作镜像并存储在镜像仓库中
使用Deployment控制器基于制作好的镜像部署服务
1 | kubectl create deployment web --image=nginx-custom |
使用service发布pod
1 | kubectl expose deployment web --port=80 --type=NodePort --target-port=8080 --name=web |
通过资源清单进行服务编排(YAML)
yaml文件格式
K8s是一个容器编排引擎,使用YAML文件编排要部署应用,因此在学习之前,应先了解YAML语法格式:
- 缩进表示层级关系
- 不支持制表符
tab
缩进,使用空格缩进 - 通常开头缩进 2 个空格
- 字符后缩进 1 个空格,如冒号、逗号等
---
表示YAML格式,一个文件的开始#
注释
通过资源清单创建Deployment
1 | apiVersion: apps/v1 # 控制器的定义 |
apiVersion | API版本 |
---|---|
kind | 资源类型 |
metadata | 资源元数据 |
spec | 资源规格 |
replicas | 副本(实例)数量 |
selector | 标签选择器,与下面metadata.labels保持一致 |
template | Pod模板 |
metadata | Pod元数据 |
spec | Pod规格 |
containers | 容器配置 |
通过资源清单创建Service
1 | apiVersion: v1 |
service里的selector要与deployment中的matchLabels保持一样。
port | Service端口,通过ClusterIP访问用 |
---|---|
targetPort | 镜像内服务端口,例如nginx镜像是80 |
selector | 标签选择器,与Deployment中标签保持一致 |
type | Service类型 |
通过资源清单创建资源
1 | # 创建和更新 |
通过命令生成资源清单
1 | # 通过创建命令获取资源清单 |
查看资源清单的帮助信息
1 | kubectl explain pods.spec.containers |
matchLabels
与labels
的注意事项
- 两边标签保持一样
- 标签可以写多个
- 标签与其他应用保持唯一
- 标签一般怎么写:一般根据应用程序属性写,例如应用名称、项目名称
Deployment工作负责均衡器
Deployment是最常用的K8s工作负载控制器(Workload Controllers),是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。其他控制器还有DaemonSet、StatefulSet等。
deployment主要用于多副本的无状态服务,如web应用、api服务、微服务等
主要功能
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能
- 提供声明式更新,例如只更新一个新的Image
应用生命周期管理流程
应用部署
1 | kubectl create deployment web --image=nginx:1.16 --replicas=3 --dry-run=client -o yaml > web.yaml |
replicas:副本数量,即多少个Pod(多少个应用实例)
应用升级
应用升级有三种方式
- 修改yaml文件并重新应用yaml文件
kubectl apply -f web.yaml
- 通过命令更新镜像版本
kubectl set image deployment/web nginx=nginx:1.17.10
- 通过系统编辑器编辑应用
kubectl edit deployment/web
滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。
滚动升级
滚动升级再k8s中的实现
- 1个Deployment
- 2个ReplicaSet
1 | # 滚动升级的过程 |
水平扩缩容
通过修改replicas
的值可以直接对pod进行扩缩容
1 | kubectl scale deployment web --replicas=10 |
回滚
1 | # 查看历史发布版本 |
回滚是重新部署某一次部署时的状态,即当时版本所有配置
k8s内部的回滚记录并不是十分晚上,一般我们可以通过外部管理资源清单版本的方式实现历史版本的记录
下线删除
1 | kubectl delete deploy/web |
滚动升级与回滚实现机制
用途
- Pod副本数量管理,不断对比当前Pod数量与期望Pod数量
- Deployment每次发布都会创建一个RS作为记录,用于实现回滚
replicaSet
replicaSet(RS)
:副本集,是一个控制器,具体是管理Pod副本的,他是deployment小弟,是滚动升级的执行者
- 滚动升级执行者
- 发布版本记录者
DeployMent 声明式更新
什么是声明式更新?
声明式区别于命令式,它描述目标性质,让计算机明白目标,而非流程。而命令式则需要用具体的做法来明确的指出每一步该怎么做。
声明式更新指的是DeployMent更新服务时只会针对声明的字段对应的资源属性进行更新。比如:apply 命令可以用yaml文件中声明的字段来更新Deployment。不仅更新镜像,而且还添加了就绪探针,以及在yaml中添加或修改的其他声明。
如果新的yaml也包含 replicas 字段,当它与现有Deployment中的数量不一致时,那么 apply 操作才会对Deployment进行扩容。也就是说:
使用 kubectl apply 更新Deployment时如果不期望副本数被更改,则不用在YAML文件中添加 replicas 这个字段。
滚动更新
有两个参数可用用来配置滚动更新策略:
- maxUnavailable表示在更新过程中,最多有多少个 Pod 不可用(这个数值也可以是百分比,例如 20% 表示最多有 20% 的 Pod 不可用)。譬如说,如果设置maxUnavailable为 1,那么更新过程会分多次进行,每次都是先销毁 1 个旧的 Pod,然后创建 1 个新的 Pod 替换它。
- 在更新的过程,如果需要保证服务的 100% 可用,可以使用maxSurge,同时将maxUnavailable设置为 0。譬如说,将maxSurge设置为 1,同时将maxUnavailable设置为 0,那么更新过程会分多次进行,每次都是先创建 1 个新的 Pod,如果新的 Pod 可用了,这时才会替换掉旧的 Pod。