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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步