Pod控制器 ReplicaSet
在K8S中,pod的创建方式分为两类:
静态Pod:也称之为无控制器管理的自主式Pod,直接由特定节点上的Kubelet
守护进程管理,不需要API服务器看到它们,对于静态Pod而言,Kubelet
直接监控每个Pod,这种Pod删除之后就没有了,也不会重建。
控制器管理的Pod:控制器可以控制Pod的副本数,扩容和裁剪,版本更新与回滚等。
k8s的1.17之前版本中, kubectl run命令默认通过Deployment控制器创建Pod
在v1.18版本中, kubectl run命令改为创建静态pod
1 Pod 控制器概述
pod控制器是管理pod的中间层,使用了pod控制器之后,我们只需要告诉pod控制器,需要多少个什么样的pod就可以了,它就会创建出满足条件的pod,并确保每一个pod处于用户期望的状态,如果pod在运行中出现故障,控制器会基于指定的策略重新启动或重建pod
在k8s中,pod控制器的种类有很多,每种pod控制器的应用场景都不一样,常见的有下面这些:
ReplicationController:比较原始的pod控制器,目前已经被废弃,由ReplicaSet代替
ReplicaSet:保证指定数量的pod运行,并支持pod数量变更,镜像版本变更
Deployment:通过控制ReplicaSet来控制pod,包含ReplicaSet所有功能,还支持滚动升级,版本回退
Horizontal Pod Autoscaler:可以根据集群负载自动调整pod数量,实现pod容缩
DaemonSet: 确保全部(或者一些)Node 上运行一个 Pod 的副本,当有 Node 加入集群时,也会为他们新增一个 Pod ,当有 Node 从集群移除时,这些 Pod 也会被回收,删除 DaemonSet 将会删除它创建的所有 Pod
Job:它创建的pod只要完成就立即退出
容器按照持续运行的时间可分为两类:服务类容器和工作类容器
服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等
工作类容器则是一次性任务,比如批处理程序,完成后容器就退出
Cronjob:它创建的pod会周期性的执行,用于执行周期性任务(常用在数据备份工作)
2 Pod 属性介绍
以下是对spec属性下常见的子属性介绍
containers #容器列表,用于定义容器的详细信息,这是pod配置中最关键的一项配置
nodeName #根据nodeName的值将pod调度到指定的Node节点上
nodeSelector #根据NodeSelector中定义的信息选择将该pod调度到包含这些label的Node节点
hostNetwork #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes #存储卷,用于定义pod上面挂载的存储信息
restartPolicy #重启策略,表示pod在遇到故障时的处理策略
3 Pod 资源清单介绍
以下是比较详细的资源清单介绍
KIND: Pod #资源类型类型
VERSION: v1 #资源版本
DESCRIPTION: #资源描述
FIELDS: #资源可配置的属性,如下
apiVersion: v1 #必选的一级属性,版本号,例如v1
kind: Pod #必选的一级属性,资源类型,例如Pod
metadata: #必选的一级属性,元数据
name: #必选的二级属性,Pod名称
namespace: dev #二级属性,Pod所属的名称空间,例如dev,默认为default名称空间
labels: #二级属性,自定义标签列表
- name: #三级属性,标签名称
spec: #必选的一级属性,Pod中容器的详细定义
containers: #必选的二级属性,Pod中容器列表
- name: #必选的三级属性,容器名称
image: #必选的三级属性,容器镜像名称
imagePullPolicy: #三级属性,镜像的拉取策略
command: #三级属性,容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: #三级属性,容器的启动命令参数列表
workingDir: #三级属性,容器的工作目录
volumeMounts: #三级属性,挂载到容器内部的存储卷配置
- name: #四级属性,引用pod定义的共享存储卷的名称
mountPath: #四级属性,存储卷在容器内mount的绝对路径,应少于512字节
readOnly: #四级属性,是否为只读模式
ports: #三级属性,需要暴露的端口库号列表
- name: #四级属性,端口的名称
containerPort: #四级属性,容器需要监听的端口号
hostPort: #四级属性,容器所在的主机需要监听的端口号,默认与Container相同
protocol: #四级属性,端口协议,支持TCP/UDP,默认为TCP
env: #三级属性,容器运行前需要设置的环境变量列表
- name: #四级属性,环境变量名称
value: #四级属性,环境变量的值
resources: #三级属性,资源限制和请求的设置
limits: #四级属性,资源最大限制的设置
CPU: #五级属性,CPU资源限制,单位为core数,将用于docker run --cpu-shares参数
memory: #五级属性,内存资源限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #四级属性,资源最小请求的设置
CPU: #五级属性,CPU请求,容器启动的初始可用数量
memory: #五级属性,内存请求,容器启动的初始可用数量
lifecycle: #三级属性,生命周期钩子
postStart: #四级属性,容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #四级属性,容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #三级属性,对Pod内个容器健康检查设置,当探测容器无响应后将自动重启该容器
tcpSocket: #三级属性,对Pod内容器健康检查方式
initialDelaySeconds: #三级属性,容器启动完成后,首次探测时间,单位为秒
timeoutSeconds: #三级属性,对容器健康检查探测等待相应的超时时间,单位秒,默认1秒
periodSeconds: #三级属性,对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
restartPolicy: #二级属性,Pod的重启策略
nodeName: #二级属性,设置pod调度到指定的node节点上
nodeSelector: #二级属性,设置Pod调度到指定的label的node节点上
imagePullSecrets: #二级属性,拉取镜像时,使用secret名称,以key:secretkey格式指定
hostNetwork: #二级属性,是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #二级属性,在该Pod上定义共享存储卷列表
- name: #三级属性,共享存储卷名称
emptyDir: #三级属性,类型为emptyDir的存储卷,与Pod同生命周期的一个临时目录,为空值
hostPath: #三级属性,类型为hostPath的存储卷,挂载集群与定义的secret对象到容器内部
path: #四级属性,Pod所在宿主机的目录,将被用于容器中挂载的目录
secret: #三级属性,类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
configMap: #三级属性,类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
4 Pod containers属性介绍
通过下边命令可以获取containers支持的子属性
# kubectl explain pod.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers #容器列表,可以定义多个容器
FIELDS:
name #容器名称
image #容器镜像地址
imagePullPolicy #镜像拉取策略
command #容器启动的命令列表,如不指定,使用打包时使用的命令
args #容器启动的命令需要的参数列表
env #容器环境变量的配置,类型
ports #容器需要暴露的端口号列表
resources #资源限制和资源请求的设置
5 Pod 控制器 ReplicaSet(RS)
ReplicaSet的主要作用是保证一定数量的pod能够正常的运行,它会持续监听这些pod的运行状态,一旦pod发生故障,就会重启或重建pod,同时还支持对pod数量的扩缩容和版本镜像的升级
ReplicaSet的资源清单文件查询方式
kubectl explain rs
kubectl explain rs.spec
kubectl explain rs.spec.selector
kubectl explain rs.spec.template
kubectl explain rs.spec.template.metadata
kubectl explain rs.spec.template.spec
案例:通过RS控制器创建3个Nginx Pod
# vim rs_nginx.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
namespace: test
spec:
replicas: 3 #创建pod的副本数量,默认为1
selector: #标签选择器,通过它指定RS管理哪些pod
matchLabels: #标签类型(key=value)
app: rs-nginx #匹配pod的标签(表示deploy管理带有此标签的Pod)
template: #pod的配置模板,通过模板定义Pod中的容器
metadata:
labels:
app: rs-nginx #Pod的标签
spec:
containers:
- name: nginx
image: nginx:1.17.0
创建pod
# kubectl create -f rs_nginx.yml
查看pod详细信息
# kubectl get po -n test
过滤Pod标签
# kubectl describe pod -n test | grep Labels
查看pod控制器详细信息
# kubectl get rs -n test -o wide
DESIRED:期望的pod副本数量
CURRENT:当前的pod副本数量
READY:已经准备好提供服务的副本数量
案例:通过RS控制器实现Pod数量的扩缩容功能
通过edit(配置文件形式)可直接修改pod的副本数量
# kubectl edit rs rs-nginx -n test
...
spec:
replicas: 6 #直接根据需求修改pod的副本数量即可
查看pod信息
# kubectl get pod -n test
案例:通过RS控制器实现镜像版本升级
通过edit(配置文件形式)可直接修改镜像版本
# kubectl edit rs rs-nginx -n test
...
spec:
containers:
- image: nginx:1.18.0 #修改为1.18.0版本
查看rs详细信息
# kubectl get rs -n test -o wide
删除RS方式
命令删除方式
# kubectl delete rs rs-nginx -n test
查看rs信息
# kubectl get rs -n test
配置文件删除方式
# kubectl delete -f rs-nginx.yml
评论区