前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 系列(3) —— Pod

Kubernetes 系列(3) —— Pod

作者头像
求和小熊猫
发布2021-09-10 10:48:40
9120
发布2021-09-10 10:48:40
举报

Pod

Pod 是 Kubernetes 的基本操作单元,也是应用运行的载体,包含一个或多个密切相关的容器。整个 Kubernetes 系统都是围绕着 Pod 展开的,比如如何运行 Pod、如何保证 Pod 的数量,如何访问 Pod 等。

容器

现代容器技术被设计用来运行单个进程,并且该进程在容器中运行的 ID 为 1。也就是说管理容器也就等于管理进程本身。

因为容器是一个单进程模型,因此容器不适合运行多个进程,即容器不具备进程管理能力。如果要运行多进程,那么必须将将进程管理的systemd 作为主进程,但是这样就不具备对自己想要的进程进行直接管理了。

Pod 资源对象

Pod 通常由一个到多个共享网络和存储资源的容器组合而成

Kubernetes 的网络模型要求其各个 Pod 对象的 IP 地址处于同一网络平面内(同一 IP 网段),各 Pod 之间可以使用 IP 地址进行直接通信,无论他们运行于集群内那个节点上,这些 pod 对象都是运行于同一局域网的多个主机中。

在这里插入图片描述
在这里插入图片描述
  • 网络 每个 Pod 都会被分配一个集群内专用的 IP 地址,也称为 Pod IP,同一 Pod 内部的所有容器共享 Pod 对象的 Network 和 UTS 命名空间。即共享主机名,IP 地址和端口等。因此 Pod 内部的容器间的通讯可以基于本地回环接口。但是与 Pod 外的其他组件进行通信则要使用 Service 资源对象和 ClusterIP 及相应端口完成
  • 存储卷 用户可以为 Pod 对象配置一组存储卷资源,这些资源可以共享给内部所有容器使用,从而完成容器间数据共享。存储卷还可以确保在容器终止后被重启,甚至删除后也能确保数据不会丢失,从而保证生命周期内的 Pod 对象数据的持久化存储。
  • Pause 每个 Pod 都会有一个 Pause 容器,该容器可以视为 Pod 的根容器。Pause 容器能够代表整个 Pod 中容器组的状态,同时 Pod 中的业务容器共享 Pause 容器的 IP,也共享 Pause 容器挂接的 Volume。Pause 容器在 Pod 中担任 Linux 命名空间共享的基础,同时启用 pid 命名空间,开启init进程。

Pod 与命名空间

Linux 中并没有所谓的容器,而容器往往是与Linux 系统共享一个内核而已。容器使用了 命名空间和cgroups 这两个特性,用以执行普通进程。命名空间能够使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。命名空间允许我们为进程提供一个“视图”,该视图将所有内容隐藏在这些命名空间之外,从而为进程提供自己的运行环境。这使得进程无法看到或干扰其他进程。

一般用到的命名空间分为以下几种:

  • IPC 命名空间(CLONE_NEWIPC): 进程间通信(IPC)的命名空间,可以将 SystemV 的 IPC 和 POSIX 的消息队列独立出来。Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信.
  • PID 进程命名空间(CLONE_NEWPID): 进程命名空间。空间内的PID 是独立分配的,意思就是命名空间内的虚拟 PID 可能会与命名空间外的 PID 相冲突,于是命名空间内的 PID 映射到命名空间外时会使用另外一个 PID。比如说,命名空间内第一个 PID 为1,而在命名空间外就是该 PID 已被 init 进程所使用。这就使得 Pod 中的不同应用程序可以看到其他应用程序的进程ID;
  • NET 网络命名空间(CLONE_NEWNET): 网络命名空间,用于隔离网络资源(/proc/net、IP 地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。由于容器之间使用同一个 IP 地址,通过 Localhost 相互通信,不同的 Pod 之间可以通过 IP 相互访问。
  • UTS 命名空间(CLONE_NEWUTS): UTS 命名空间,主要目的是独立出主机名和网络信息服务(NIS)。Pod中的多个容器共享一个主机名;
  • Volumes(共享存储卷): Pod 内的所有容器之间共享数据卷,即允许容器共享数据。Volume 还用于 Pod 中的数据持久化,以防止容器重启而导致数据丢失。

Pod 的定义文件

Pod 的 yml 文件格式预览

代码语言:javascript
复制
apiVersion: v1                    #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 .
kind: Pod                      #必选,Pod
metadata:                      #必选,元数据
  name: string                    #必选,Pod名称
  namespace: string               #必选,Pod所属的命名空间,默认为"default"
  labels:                       #自定义标签
    - name: string                 #自定义标签名字
  annotations:                           #自定义注释列表
    - name: string
spec:                            #必选,Pod中容器的详细定义
  containers:                       #必选,Pod中容器列表
  - name: string                        #必选,容器名称,需符合RFC 1035规范
    image: string                       #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
    command: [string]               #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]                     #容器的启动命令参数列表
    workingDir: string                     #容器的工作目录
    volumeMounts:                 #挂载到容器内部的存储卷配置
    - name: string                 #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string                 #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean                 #是否为只读模式
    ports:                      #需要暴露的端口库号列表
    - name: string                 #端口的名称
      containerPort: int                #容器需要监听的端口号
      hostPort: int                    #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string                  #端口协议,支持TCP和UDP,默认TCP
    env:                          #容器运行前需设置的环境变量列表
    - name: string                    #环境变量名称
      value: string                   #环境变量的值
    resources:                          #资源限制和请求的设置
      limits:                       #资源限制的设置
        cpu: string                   #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string                  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests:                         #资源请求的设置
        cpu: string                   #Cpu请求,容器启动的初始可用数量
        memory: string                    #内存请求,容器启动的初始可用数量
    livenessProbe:                    #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:                     #对Pod容器内检查方式设置为exec方式
        command: [string]               #exec方式需要制定的命令或脚本
      httpGet:                    #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:            #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
    restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject         #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
    imagePullSecrets:         #Pull镜像时使用的secret名称,以key:secretkey格式指定
    - name: string
    hostNetwork: false            #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
    volumes:                  #在该pod上定义共享存储卷列表
    - name: string              #共享存储卷名称 (volumes类型有很多种)
      emptyDir: {}              #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
      hostPath: string            #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
        path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
      secret:                 #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:                      #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
        name: string
        items:
        - key: string
          path: string

Pod 的属性文件主要包含四个部分:

  1. apiVersion: Kubernetes 的API 版本声明
  2. kind: API 对象类型的声明
  3. metadata: 设置 Pod 的元数据
  4. spec: Pod的 详细描述

metadata 元数据

元数据包括四个主要方面

  1. name (required) 指定 Pod 名称,Pod 名称必须在 Pod 的 namespace 唯一
  2. namespace (required) 指定 Pod 的命名空间,不指定时默认为 “default”
  3. labels 自定义的属性标签。可以根据需要对所创建的 Pod 自定义标签,再利用 Service 或者 ReplicationController 的 Label Selector 来选择自定的Pod。
  4. annotations 自定义的注解列表

【示例】

代码语言:javascript
复制
metadata: 
 name: pod-1
 namespace: default
 labels:
   - name: a2
 annotations: 
   - name: s3

spec 详细定义

spec 是 Pod 中容器的详细定义。详细定义中包含

  • containers: (required) Pod 中的容器列表
  • volumes: Pod 上定义的共享存储列表
  • restartPolicy: Pod 的重启策略
  • nodeSelector:
  • imagePullSecrets: 拉取镜像时使用的 Secret 名称
  • hostNetwork: 是否启用主机网络模式
容器列表的定义

一个 Pod 对象中至少存在一个容器,因此,Containers 字段是定义 Pod 时其嵌套字段 spec 的必选字段

其中 name: 为必选字段,用于指定容器名称

容器的镜像管理

image: 容器的镜像名称 imagePullPolicy: 指定镜像获取策略,在网络镜像比较紧张时,可以禁止从仓库获取镜像文件。镜像的获取策略有以下几种

  • Always: 镜像标签为 latest 或镜像标签不存在时,总是从指定仓库中获取镜像
  • IfNotPresent: 仅当本地镜像缺失时才从目标仓库下载镜像
  • Never: 禁止从仓库下载镜像

【示例】

代码语言:javascript
复制
spec:
  containers:
    - name: app
      image: redis
容器的端口管理 ports

容器的 ports 字段是一个列表,由一到多个端口对象组成,他们常用嵌套字段包包括: containerPorrt: 是 Port 的必填字段,指定在 Pod 对象上的 ip 地址上暴露的容器端口,有效范围为 (0,65536) ; 使用时应总是指定容器应用正常监听着的端口。 name: 当前端口的名称,且该名称必须是当前 Pod 内唯一的,此端口可 Service 资源调用 protocol: 端口相关协议,其值仅可为 TCP/UDP hostPort: 主机端口,他将接受到的请求通过 NAT 机制转发至由 containerPort 字段指定的容器端口 hostIP: 主机端口要绑定主机 IP,默认为 0.0.0.0,即主机上所有的 IP 地址;考虑到托管的 Pod 对象是由调度器调度运行的,工作节点的 IP 地址难以明确指定,因此此字段通常使用默认值

环境变量列表 env

env 列表主要向 Pod 容器环境变量传递数据。环境变量通常由 name 和 value 字段构成。

  • name: 环境变量字段
  • value: 传递给环境变量的值

【示例】

代码语言:javascript
复制
spec:
  containers:
    - name: app
      image: ikubernetes/filebeat:5.5.6-alpine
      env:
        - name: REDIS_HOST
          value: localhost:6379
        - name: LOG_LEVEL
          value: info

Pod 的 生命周期

Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态而进入 Succeeded 或者 Failed 阶段。

Pod 在其生命周期中只会被调度一次,一旦 Pod 被调度至某个节点,Pod 会一直在该节点运行,直到 Pod 被停止或终止。

和一个个独立的应用容器一样,Pod 也被认为是相对临时性(而不是长期存在)的实体。 Pod 会被创建、赋予一个唯一的 ID(UID), 并被调度到节点,并在终止(根据重启策略)或删除之前一直运行在该节点。

容器的状态

Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。 你可以使用容器生命周期回调 来在容器生命周期中的特定时间点触发事件。

一旦调度器将 Pod 分派给某个节点,kubelet 就通过 容器运行时 开始为 Pod 创建容器。 容器的状态有三种:Waiting(等待)、Running(运行中)和 Terminated(已终止)。

  • Waiting (等待) 如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作:例如,从某个容器镜像 仓库拉取容器镜像,或者向容器应用 Secret 数据等等。 当你使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,你也会看到一个 Reason 字段,其中给出了容器处于等待状态的原因。
  • Running(运行中) Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。 如果你使用 kubectl 来查询包含 Running 状态的容器的 Pod 时,你也会看到 关于容器进入 Running 状态的信息。
  • Terminated(已终止) 处于 Terminated 状态的容器已经开始执行并且或者正常结束或者因为某些原因失败。 如果你使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时,你会看到 容器进入此状态的原因、退出代码以及容器执行期间的起止时间。

容器的重启策略

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。

restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时,kubelet 会按指数回退 方式计算重启的延迟(10s、20s、40s、…),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行 重置操作。

静态 Pod

静态 Pod 是由 Kubelet 进行管理的仅存在于特定 Node 上的 Pod。他们不能通过 API Server 进行管理,无法与 Replication Controller 、Deployment 或者 DaemonSet 进行关联。静态 Pod 总是由 Kubelet 创建的,并且总是在Kubelet 所在的 Node 上运行。

静态 Pod 由两种创建爱方式 通过配置文件通过 HTTP 的方式

Pod 的阶段

Pod 的阶段(Phase)是 Pod 在其生命周期中所处位置的简单宏观概述。

取值

描述

Pending(悬决)

Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间,

Running(运行中)

Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。

Succeeded(成功)

Pod 中的所有容器都已成功终止,并且不会再重启。

Failed(失败)

Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。

Unknown(未知)

因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

Pod 的相关命令

探查 Pod 内的应用详情

代码语言:javascript
复制
# 通过配置文件创建 Pod,(创建的内容与 配置文件相关)
kubectl create -f myPod-pod.yaml 
# 查看 Pod 列表
kubectl get pods
# 显示资源详情
kubectl describe pods myPodName
# 查看 Pod 日志(单容器上下的情况)
kubeclt logs myPodName
# 查看 Pod 日志 (多容器的情况)
kubectl logs -f myPodName -c containerName
# 在 Pod 对象的某容器内执行某条命令
kubectl exec myPodName date
# 指定 Pod 中某个容器执行
kubectl exec myPodName -c containerName date
# 删除 pod
kubectl delete pod myPodName

标签选择器

标签 (Label) 是 Kubernentes 极具特色的功能之一,他能够附加于 Kubernetes 的任何资源对象之上。Label 是一个键值对,附加在各个资源对象之上。一个对象有多个标签,同时同一个标签也可以附加于各个资源之上。

标签选择器 (Label Selector) 则是针对匹配对象的标签来进行查询的。

Kubernetes API 目前支持两个选择器:

  • 基于等值关系的选择器
  • 基于集合关系的选择器

基于等值关系的选择器 基于等值关系的选择器可用的操作符有 “=”、"==" 和 “!=” 三种,前两个是等于关系,最后一个是不等关系。

基于集合关系的选择器 基于集合的选择器包括 in、notin 和 exists。其实用格式如下

  • KEY in (value1,value2,···):键名的值存在于给定的列表中
  • KEY notin (value1,value2,···):键名的值不存在于给定的列表中即满足条件
  • KEY:所有存在此键名标签的资源
  • !KEY:所有不存在此键名的资源

使用资源标签

代码语言:javascript
复制
# 查看 Pod 资源清单时显示 label
kubeclt get pods --show-labels
# 显示有着特定标签的信息
kubectl get pods -L env,tire
# 为资源添加标签
kubectl label pods/pod-name env=dev
# 修改原有标签值
kubectl label pods/pod-name env=test --overwrite
# 使用基于等值的标签选择器
kubectl get pods -l "env!=qa,tier=fronted" -L env,tier
# 使用基于键名的标签选择器
kubectl get pods -l "env in (dev,uat),!tier" -L env,tier
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pod
    • 容器
      • Pod 资源对象
        • Pod 与命名空间
          • Pod 的定义文件
            • metadata 元数据
            • spec 详细定义
          • Pod 的 生命周期
            • 容器的状态
            • 容器的重启策略
            • 静态 Pod
            • Pod 的阶段
          • Pod 的相关命令
            • 探查 Pod 内的应用详情
          • 标签选择器
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档