pod详解

Posted givenchy_yzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pod详解相关的知识,希望对你有一定的参考价值。

pod概述

pod介绍

Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。 Pod 对多容器的支 持是 K8s 最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个 nginx 容器用来发布软件,另 一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提 供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提 供服务。这就是 K8S 中的 POD。

Pod 是 K8s 集群中所有业务类型的基础,可以看作运行在 K8s 集群中的小机器人,不同类型的业务就需要 不同类型的小机器人去执行。目前 K8s 中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、 节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为 Deployment、Job、DaemonSet 和 StatefulSet。

POD带来的好处

1.Pod 做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极大的方便。
2. Pod 做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与 资源的分配。
3. Pod 中的容器共享相同的数据和网络地址空间,Pod 之间也进行了统一的资源管理与分配

Pod的生命周期
在这里插入图片描述
故从上图可知:
主容器的作用:提供一个pod中的基础网络,提供共享存储,同时监控容器

pod的生命周期:
1、创建pod
2、创建主容器
3、依次创建业务容器
4、执行启动回调
5、进行探测
6、执行结束回调钩子
7、终止容器

Pod 是如何管理多个容器的

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

Pod 中的数据持久性

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

                                          |

pod的重启策略

pod的状态

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

Pod小实验

注意!注意!注意!格式一定不可以出错

# k8s配置清单
apiVersion
kind 
metadata
spec
status    # 部署状态(不可编辑)
    
    
    apiVersion :指定k8s部署的api版本号,不同的服务,版本号也不同
    kind : 指定资源类型(pod)
    metadata : 记录部署应用的基础信息
    spec : 指定部署详情
    
    string : 跟字符串
    Object :跟字段
    []Object : 
    	- name
    

    # kubectl explain Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
        - name: nginx
          image: nginx
        - name: tomcat
          image: tomcat

pod的重启策略

Pod 重启策略( RestartPolicy )应用于Pod 内的所有容器,并且仅在 Pod 所处的 Node 上由 kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相 应的操作。Pod 的重启策略包括:Always、OnFailure 和 Never,默认值为 Always
Always:当容器失效时,由 kubelet 自动重启该容器。
OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
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

以上是关于pod详解的主要内容,如果未能解决你的问题,请参考以下文章

K8s pod详解

linux12k8s --> 06Pod详解

(转) Java中的负数及基本类型的转型详解

Pod控制器详解

k8s八Pod详解

k8s八Pod详解