基本概念
无状态工作负载:即kubernetes中的“Deployment”,无状态工作负载支持弹性伸缩与滚动升级,适用于实例完全独立、功能相同的场景,如:nginx、wordpress等。
操作场景
在运行中始终不保存任何数据或状态的工作负载称为“无状态负载 Deployment”,例如nginx。您可以通过控制台或kubectl命令行创建无状态负载。
前提条件
在创建容器工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照集群开通中内容进行创建。
若工作负载需要被外网访问,请确保集群中至少有一个节点已绑定弹性IP,或已购买负载均衡实例。
创建多个工作负载时,请确保容器使用的端口不冲突 ,否则部署会失败。
操作步骤及说明
创建Deployment的参数较多,下面将分模块来介绍创建Deployment的参数,请务必留意这里的参数解释,其他四种类型的工作负载的参数与Deployment的参数相似
创建一个Deployment的参数最小配置(tomcat为例)
如上图的配置即可成功启动一个tomcat
备注:镜像凭证请在高级设置中配置。
参数解释
数据卷
Deployment的数据卷共6种类型,总结如下表:
数据卷类型 | 对应k8s中的类型 | 用途 | 解释 |
---|---|---|---|
临时目录 | emptyDir | 主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录 | 当Pod分配到Node上时,将会创建emptyDir,当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。 |
主机目录 | hostPath | hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。 | 在使用hostPath volume卷时,即便pod已经被删除了,volume卷中的数据仍在。但是Pod调度到其他节点之后就无法使用这个目录了。 |
secret | secret | 用于将敏感信息(如密码)传递给pod | 将k8s中的Secret资源对象挂载到Pod中 |
configMap | configMap | 用于挂载配置文件到Pod中 | 将k8s中的ConfigMap资源对象挂载到Pod中 |
使用已有PVC | persistentVolumeClaim | 用来挂载持久化磁盘 | 需要提前创建持久卷声明(PVC) |
downwardAPI | downwardAPI | 将Pod的信息挂载到容器中(如上图中将Pod的标签挂载到容器中,并且用”labels”这个文件存储Pod的标签),pod版本号要么不填要么填’v1’ | Downward API提供了两种方式用于将POD的信息注入到容器内部,一是此处介绍的Volume挂载,二是下面我们将介绍的环境变量 |
实例数量
实例的数量指的是Pod的数量,设置Pod的数量有2种方式
手动设置:我们可以手动指定Pod的数量是多少,默认为1,这种方式下Pod的数量在我们手动更新之前是不会改变的
自动设置:这种方式下,Pod的数量会根据Pod的资源使用情况自动的调整,因此,自动伸缩需要我们设置Pod自动调整数量的规则以及自动调整数量的范围
伸缩规则:即告诉Pod通过什么规则来自动调整数量,目前我们可以通过cpu的使用百分比、cpu的使用量、内存的使用百分比、内存的使用量这四个规则来自动调整Pod数量
伸缩范围:即告诉Pod在哪个范围内自动调整数量,自动调整数量时不会超出这个范围
容器参数设置
镜像
可以添加多个容器在一个Pod中
容器的名称、镜像、镜像版本号是必填参数
镜像拉取策略:
IfNotPresent:仅当主机上没有没有指定的镜像时才去拉取
Always:不管主机上是否有指定镜像,都会重新拉取
Never:从不拉取镜像
挂载点
如果有多个容器,那么数据卷可以挂载到任意容器的挂载点上
挂载点与上面介绍的数据卷是一一对应的关系
容器路径:必填且不能为/,表示要将数据卷挂载到容器里的哪个路径下
子路径:选填且不能以/开头,表示仅将数据卷中的子对象项挂载到容器路径下,子对象可以理解为目录的子目录或者ConfigMap的一个data项
CPU/内存限制
request数据:用于预分配资源,可以理解为容器设置需要的最小资源,为了防止出现Pod无法调度的问题,强烈建议request数据设置的尽可能小
limit数据:用于限制运行时容器占用的资源
环境变量
目前支持四种类型的环境变量设置
keyValue:key-value键值对形式为容器设置环境变量
configMapKeyRef:需要提前创建ConfigMap并且包含data项,这里会将data中的value值引用为环境变量
secretKeyRef:需要提前创建Secret并且包含data项,这里会将data中的value值引用为环境变量
- 方式一:把两行内容都写到一个文件里,使用导入YAML把文件导入就行;
- 方式二:使用保密字典,上传文本文件,第一个文件,文件名是MINIO_ACCESS_KEY,文件内容是sunseaiot;第二个文件,文件名是MINIO_SECRET_KEY,文件内容是sunseaiot1 ;
- 方式三:使用配置项,上传文件,第一个文件,文件名是MINIO_ACCESS_KEY,文件内容是sunseaiot;第二个文件,文件名是MINIO_SECRET_KEY,文件内容是sunseaiot1fieldRef:引用Pod中的某个字段作为环境变量,如引用Pod的名称使用metadata.name、引用Pod所在命名空间使用metadata.namespace。
日志挂载
需要提前安装日志插件
需要填写容器的日志输出在哪个目录,只有填写了正确的容器日志目录才能被日志插件采集到
高级设置
启停处理
启动执行:用于指定容器在启动时执行的命令和参数。虽然启动执行里有添加命令和添加参数两个按钮,但是我们可以只是用添加命令、或者只使用添加参数、或者两者同时使用,其达到的效果是完全一致的
启动后处理:配置容器在启动完成后执行的命令。用法上和上面的启动执行完全一致
停止前处理:配置容器在停止前执行的命令。用法上和上面的启动执行完全一致
容器健康检查
容器的健康检查支持就绪检查核存活检查两种,建议给容器都配上这两种健康检查方式
就绪检查:会检查容器是否处于ready状态,不就绪则停止转发流量到当前实例
存活检查:检查容器是否正常,不正常则重启实例
三种健康检查方式的公共参数解释:
目前支持三种健康检查方式:
Http方式:需要填写端口、协议、请求路径等参数,然后kubelet 会向容器内运行的程序发送一个 HTTP GET 请求来执行探测。如果容器的处理程序返回成功码,则kubelet认为容器是存活/就绪的。如果处理程序返回失败码,则kubelet会杀死这个容器并且重新启动它/认为它没有就绪
Tcp方式:需要填写主机、端口等参数,然后kubelet 会尝试在指定端口和容器建立套接字链接。如果能建立链接,这个容器就被看作是健康的/就绪的,如果不能则这个容器就被看作是有问题的/没有就绪的
命令方式:需要添加命令,然后kubelet 在容器中执行该命令来进行检测。如果命令执行成功并且返回值为0,kubelet会认为这个容器是健康存活的/就绪的。如果这个命令返回非 0 值,kubelet 会杀死这个容器并重新启动它/认为它没有就绪
特权级容器
特权级容器:即给容器赋予主机的root用户权限,一般情况下都不需要设置。一个常见的使用场景是,使用主机目录挂载时,如果该目录是root用户权限的,那么容器想要操作这么目录,那么必须开启特权级容器,开启特权容器后,容器内的用户会设置为root用户
Deployment高级设置
负载注解与负载标签
支持给Deployment设置注解,注解将会以key-value形式写入Deployment - 支持给Deployment设置标签,标签将会以key-value形式写入Deployment
镜像拉取凭证
支持给Deployment设置镜像拉取凭证
镜像拉取凭证主要适用于:如果我们给Deployment设置的镜像属于私有仓库中的镜像,那么一定要先创建镜像拉取凭证,然后再此处添加镜像拉取凭证
节点选择器
支持发布Deployment到指定节点上,选择了key-value之后,可以通过查看节点查看Deployment可以发布到哪些节点上。
注意如果所有的节点都无法满足节点选择器,那么Pod将不会调度,会出现类似的事件0/3 nodes match node selector。
主机别名配置
如果我们希望给运行在k8s上的Pod增加一些域名的解析(例如宿主机的主机名),那么我们可以通过主机别名配置往容器的/etc/hosts文件中添加域名解析
给Deployment设置的主机别名可以等容器启动后,进入容器终端执行命令cat/etc/hosts查看
Pod主机名设置
如果我们想要固定容器的hostname,那么可以设置Pod主机名
设置了Pod主机名后,这个Pod里的所有容器的hostname都会变成我们设定的这个值
通过在master节点上执行命令kubectl exec hostname可以查看容器的hostname
主机网络
选择使用主机网络,那么pod中运行的应用程序可以直接看到宿主主机的网络接口 - 使用主机网络,Pod IP和节点IP将会一样 。
如果不加上dnsPolicy:ClusterFirstWithHostNet ,pod默认使用所在宿主主机使用的DNS,这样也会导致容器内不能通过service name 访问k8s集群中其他POD。
一般情况下,请在使用主机网络之前优先考虑使用NodePort。
升级方式与升级策略
快速升级:选择快速升级时,每次全量替换升级Deployment的时候,会删除所有已存在的pod,重新创建新的;
滚动升级:选择滚动升级时,每次全量替换升级Deployment的时候,会采取逐步替换的策略,等新创建出来的Pod处于running状态之后才会销毁旧的Pod,参数详解:
- maxSurge:升级过程中最多可以比原先设置多出的POD数量,如maxSurage=1,replicas=5,则表示k8s会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD
- maxUnavaible: 升级过程中最多有多少个POD处于无法提供服务的状态,当maxSurge不为0时,该值也不能为0,例如:maxUnavaible=1,则表示Deployment整个升级过程中最多会有1个POD处于无法服务的状态
开启访问设置
表示创建Deployment的同时,创建一个配套的服务(Service),详见Service管理