将对Kubernetes如何发布与管理容器应用进行详细说明和示例,主要包括Pod和容器的使用、应用配置管理、Pod的控制和调度管理、Pod的升级和回滚,以及Pod的扩缩容机制等内容。
Pod定义详解
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。
Pod的基本用法
在Kubernetes系统中对长时间运行容器的要求是:其主程序需要一直在前台执行。Kubernetes需要我们自己创建的Docker镜像并以一个前台命令作为启动命令。
注意:重启Pod中的容器跟重启Pod不是一回事。Pod只提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。
Pod可以由1个或多个容器组合而成。
Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。
静态Pod
静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。它们不能通过APIServer进行管理,无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet无法对它们进行健康检查。静态Pod总是由kubelet创建的,并且总在kubelet所在的Node上运行。
Pod容器共享Volume
同一个Pod中的多个容器能够共享Pod级别的存储卷Volume。Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录
Pod的配置管理
Kubernetes 1.2开始提供了一种统一的应用配置管理方案——ConfigMap
ConfigMap概述
ConfigMap供容器使用的典型用法如下。
- (1)生成为容器内的环境变量。
- (2)设置容器启动命令的启动参数(需设置为环境变量)。
- (3)以Volume的形式挂载为容器内部的文件或目录。
ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容
可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap
Pod生命周期和重启策略
Pod在整个生命周期中被系统定义为各种状态,熟悉Pod的各种状态对于理解如何设置Pod的调度策略、重启策略是很有必要的。
Pod的状态如表:
| 状态值 | 描述 |
|---|---|
| Pending | ApiServer已经创建该pod,但在该pod内还有一个或多个容器镜像没有创建,包括正在下载镜像的过程 |
| Running | Pod内所有容器都已经创建,且至少有一个容器正在处于运行状态、正在启动状态或正在重启状态 |
| Successed | Pod内所有容器均已经执行成功并退出,且不会再重启 |
| Failed | Pod内所有容器均已经退出,但至少有一个容器退出为失败状态 |
| Unknow | 由于某种原因无法获取pod状态,可能是网络原因 |

Pod的重启策略包括Always、OnFailure和Never,默认值为Always。
- Always:当容器失效时,由kubelet自动重启该容器。
- OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
- Never:不论容器运行状态如何,kubelet都不会重启该容器。
Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静态Pod)。每种控制器对Pod的重启策略要求如下:
- RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
- Job:OnFailure或Never,确保容器执行完成后不再重启。
- kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置为什么值,也不会对Pod进行健康检查。
Pod健康检查和服务可用性检查
Kubernetes对Pod的健康状态可以通过两类探针来检查: LivenessProbe(用于判断容器是否存活)和ReadinessProbe(用于判断容器服务是否可用)。
公司的配置
"readinessProbe":{
"failureThreshold":3,
"tcpSocket":{
"port":8888
},
"timeoutSeconds":1,
"periodSeconds":10,
"successThreshold":1,
"initialDelaySeconds":130
},
"livenessProbe":{
"failureThreshold":3,
"tcpSocket":{
"port":6666
},
"timeoutSeconds":1,
"periodSeconds":10,
"successThreshold":1,
"initialDelaySeconds":130
}
LivenessProbe和ReadinessProbe均可配置以下三种实现方式:
- ExecAction:在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康。
- TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP连接,则表明容器健康。
- HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器健康
都需要设置initialDelaySeconds和timeoutSeconds两个参数,它们的含义分别如下。
- initialDelaySeconds:启动容器后进行首次健康检查的等待时间,单位为s。
- timeoutSeconds:健康检查发送请求后等待响应的超时时间,单位为s。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。
- periodSeconds: 检查的间隔时间,默认为 10s,单位“秒”
Pod调度
在Kubernetes平台上,我们很少会直接创建一个Pod,在大多数情况下会通过RC、Deployment、DaemonSet、Job等控制器完成对一组Pod副本的创建、调度及全生命周期的自动控制任务。
385

被折叠的 条评论
为什么被折叠?



