k8s之Pod

k8s之Pod

Pod是在k8s集群中运行部署应用或服务的最小单元,他是可以支持多容器的。

Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Pod 是 K8s 集群中所有业务类型的基础。

目前 K8s 中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的控制器为Deployment、Job、DaemonSet 和 StatefulSet 。

1、Pod的好处

1、Pod 做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极大的方便。

2、Pod 做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与资源的分配。

3、Pod 中的容器共享相同的数据和网络地址空间,Pod 之间也进行了统一的资源管理与分配。

2、Pod 是如何管理多个容器的

Pod 中可以同时运行多个进程(作为容器运行)协同工作。同一个 Pod 中的容器会自动的分配到同一个 node上。同一个 Pod 中的容器共享资源、网络环境和依赖,所以它们总是被同时调度。在一个 Pod 中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

3、Pod 中的数据持久性

Pod 在设计⽀持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐。通常,我们是需要借助类似于 Docker 存储卷这样的资源来做 Pod 的数据持久化的。

4、Pod 的生命周期和重启策略

Pod 在整个生命周期过程中被系统定义为各种状态,熟悉 Pod 各种状态对于我 理解如何设置 Pod 的调度策略、重启策略是很有必要的。

#Pod的生命周期
1、创建Pod
2、创建主容器
3、依次创建业务容器
4、执行启动回调
5、进行探测(存活性探测、就绪性探测)
6、执行结束回调
7、终止业务容器、终止主容器

4.1Pod 的状态

状态值 描述
挂起(Pending) API Server 创建了 pod 资源对象已存入 etcd 中,但它尚未被调度完成,或者仍处于从仓库下载镜像的过程中。
运行中(Running) Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成
成功(Succeeded) Pod 中的所有容器都已经成功终止并且不会被重启
失败(Failed) Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。即容器以非 0 状态退出或者被系统禁止。
未知(Unknown) Api Server 无法正常获取到 Pod 对象的状态信息,通常是由于无法与所在工作节点的kubelet 通信所致。

4.2Pod的重启策略

Pod 重启策略( RestartPolicy )应用于 Pod 内的所有容器,井且仅在 Pod 所处的 Node 上由 kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相应的操作。Pod 的重启策略包括:Always、OnFailure 和 Never,默认值为 Always

1、Always:当容器失效时,由 kubelet 自动重启该容器。
2、OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
3、Never:不论容器运行状态如何,kubelet 都不会重启该容器。

kubelet 重启失效容器的时间间隔以 sync-frequency 乘以 2n 来计算;例如 1、2、4、8 倍等,最长延时5min ,并且在成功重启后的 10 min 后重置该时间。

Pod 的重启策略与控制方式息息相关,当前可用于管理 Pod 的控制器包括 ReplicationController、Job、DaemonSet 及直接通过 kubelet 管理(静态 Pod)。每种控制器对 Pod 的重启策略要求如下:

1、RC 和 DaemonSet:必须设置为 Always,需要保证该容器持续运行。
2、Job 和 CronJob:OnFailure 或 Never,确保容器执行完成后不再重启。
3、kubelet:在 Pod 失效时自动重启它,不论将 RestartPolicy 设置为什么值,也不会对 Pod 进行健康检查。

Pod 的资源清单详解

apiVersion: v1 # 必选,API 的版本号
kind: Pod # 必选,类型
Pod metadata: # 必选,元数据
name: nginx # 必选,符合 RFC 1035 规范的 Pod 名称
namespace: web-testing # 可选,不指定默认为default,Pod 所在的命名空间
labels: # 可选,标签选择器,一般用于 Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合 RFC 1035 规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
- name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认 TCP
env: # 可选,环境变量配置
- name: TZ # 变量名
value: Asia/Shanghai
- name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为 2 次表示就绪
failureThreshold: 1 # 检测失败 1 次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为 Always
nodeSelector: # 可选,指定 Node 节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的 secret
- name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
- name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret 模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420

本文作者:大胡萝卜没有须

本文链接:https://www.cnblogs.com/c-moon/p/16797273.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   大胡萝卜没有须  阅读(420)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 此生不换 青鸟飞鱼
此生不换 - 青鸟飞鱼
00:00 / 00:00
An audio error has occurred.