Kubernetes 核心技术-Pod

Kubernetes 核心技术-Pod

1、Pod概述

Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最

小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支

撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者

Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod

提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成

Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause

容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod

还包含一个或多个紧密相关的用户业务容器
Kubernetes 核心技术-Pod_第1张图片
Kubernetes 核心技术-Pod_第2张图片

(1)Pod vs 应用

每个 Pod 都是应用的一个实例,有专用的 IP

(2)Pod vs 容器

一个 Pod 可以有多个容器,彼此间共享网络和存储资源,每个 Pod 中有一个 Pause 容器保

存所有的容器状态, 通过管理 pause 容器,达到管理 pod 中所有容器的效果

(3)Pod vs 节点

同一个 Pod 中的容器总会被调度到相同 Node 节点,不同节点间 Pod 的通信基于虚拟二层网

络技术实现

(4)Pod vs Pod

普通的 Pod 和静态 Pod

(5)创建流程:

Kubernetes 核心技术-Pod_第3张图片

2 、Pod 特性

(1)资源共享

一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如

namespace,cgroups 或者其他的隔离资源。

多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和

端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要

注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多

个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod

的 IP 进行通信。

一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可

以挂载到该 Pod 里的所有容器的文件系统上。

(2)生命周期短暂

Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod

会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的

Pod 没有半毛钱关系。

(3)平坦的网络

K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其

他 Pod 的 IP 地址来实现访问。

3、Pod 定义

(1)下面是 yaml 文件定义的 Pod 的完整内容

apiVersion: v1 
kind: Pod 
metadata: //元数据 
  name: string 
namespace: string 
  labels: 
  -name: string 
annotations: 
  -name: string 
spec:
  containers: //pod 中的容器列表,可以有多个容器 
    - name: string //容器的名称 
    image: string //容器中的镜像 
    imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为 Always,每次都尝试重新下载镜像 
  command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令) 
  args: [string] //启动参数列表 
  workingDir: string //容器的工作目录 
  volumeMounts: //挂载到到容器内部的存储 卷设置 
  -name: string 
  mountPath: string //存储卷在容器内部 Mount 的绝对路径 
  readOnly: boolean // 默认值为读写 
  ports: //容器需要暴露的端口号列表 
  -name: string 
  containerPort: int //容器要暴露的端口
  hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置 hostPort 时同一 台宿主机将不能再启动该容器的第 2 份副本) 
  protocol: string //TCP 和 UDP,默认值为 TCP 
    env: //容器运行前要设置的环境 列表
      -name: string 
      value: string 
    resources: 
      limits: //资源限制,容器的最大可用资源数量 
        cpu: Srting 
        memory: string 
      requeste: //资源限制,容器启动的初始可用资源数量 
        cpu: string 
        memory: string 
    livenessProbe: //pod 内容器健康检查的设置 
      exec: 
        command: [string] //exec 方式需要指定的命令或脚本 
        httpGet: //通过 httpget 检 查健康 
        path: string 
        port: number 
        host: string 
        scheme: Srtring 
        httpHeaders: 
          - name: Stirng 
          value: string 
        tcpSocket: //通过 tcpSocket 检查健康
        port: number 
    initialDelaySeconds: 0//首次检查时间 
    timeoutSeconds: 0 //检查超时时间
    periodSeconds: 0 //检查间隔时间 
successThreshold: 0 
failureThreshold: 0 
securityContext: //安全配置 
privileged: falae 
  restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为 Always 
nodeSelector: object //节点选择,表示将该 Pod 调度到包含这些 label 的 Node 上,以 key:value 格式指定 
imagePullSecrets: 
-name: string 
hostNetwork: false //是否使用主机网络模式,弃用 Docker 网桥,默认否 
volumes: //在该 pod 上定义共享存储卷列表 
-name: string 
emptyDir: {} 
hostPath: 
path: string 
secret: secretName: string 
item: -key: string 
path: string 
configMap: name: string 
items: 
-key: string 
path: string



4、Pod 的基本使用方法

在 kubernetes 中对运行容器的要求为:容器的主程序需要一直在前台运行,而不是后台运

行。应用需要改造成前 台运行的方式。如果我们创建的 Docker 镜像的启动命令是后台执

行程序,则在 kubelet 创建包含这个容器的 pod 之 后运行完该命令,即认为 Pod 已经结束,

将立刻销毁该 Pod。如果为该 Pod 定义了 RC,则创建、销毁会陷入一个无 限循环的过程中。

Pod 可以由 1 个或多个容器组合而成。

(1)一个容器组成的 Pod 的 yaml 示例

# 一个容器组成的 Pod apiVersion: v1 
kind: Pod 
metadata: 
name: mytomcat 
labels:
name: mytomcat 
spec: containers: 
- name: mytomcat 
image: tomcat 
ports: 
- containerPort: 8000

(2)多个容器组成的 Pod 的 yaml 示例

#两个紧密耦合的容器 
apiVersion: v1 
kind: Pod 
metadata: 
name: myweb 
labels: 
name: tomcat-redis 
spec: 
containers: 
-name: tomcat 
image: tomcat 
ports: 
-containerPort: 8080 
-name: redis 
image: redis 
ports: 
-containerPort: 6379

(3)创建

kubectl create -f xxx.yaml

(4)查看

kubectl get pod/po  

kubectl get pod/po  -o wide 

kubectl describe pod/po 

(5)删除

kubectl delete -f pod pod_name.yaml 

kubectl delete pod --all/[pod_name]

5、Pod 的分类

Pod 有两种类型

(1)普通 Pod

普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某

个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相

关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会

自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,

则会将这个 Node 上的所有 Pod 重新调度到其它节点上。

(2)静态 Pod

静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server

进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且

kubelet 也无法对它们进行健康检查。

6、Pod 生命周期和重启策略

(1)Pod 的状态

Kubernetes 核心技术-Pod_第4张图片

(2)Pod 重启策略

Pod 的重启策略包括 Always、OnFailure 和 Never,默认值是 Always

Kubernetes 核心技术-Pod_第5张图片

(3)常见状态转换

Kubernetes 核心技术-Pod_第6张图片

7、Pod 资源配置

每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额

的计算资源有 CPU 与 Memory 两种,其中 CPU 的资源单位为 CPU 数量,是一个绝对值而非相

对值。Memory 配额也是一个绝对值,它的单 位是内存字节数。

Kubernetes 里,一个计算资源进行配额限定需要设定以下两个参数: Requests 该资源最

小申请数量,系统必须满足要求 Limits 该资源最大允许使用的量,不能突破,当容器试

图使用超过这个量的资源时,可能会被 Kubernetes Kill 并重启

(1)举例

sepc 
containers: 
- name: db 
image: mysql 
resources: 
  requests: 
    memory: "64Mi" 
    cpu: "250m" 
  limits: 
   memory: "128Mi" 
   cpu: "500m"

上述代码表明 MySQL 容器申请最少 0.25 个 CPU 以及 64MiB 内存,在运行过程中容器所能使

用的资源配额为 0.5 个 CPU 以及 128MiB 内存。

总结

1、Pod基本概念

  • 最小部署单元
  • 包含多个容器(一组容器的集合)
  • 一个pod中容器共享网络命名空间
  • pod是短暂的

2、Pod存在的意义

  • 创建容器时使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序
  • Pod是多进程设计,运行多个应用程序
    • 一个Pod有多个容器,一个容器里面运行一个应用程序
  • Pod存在为了亲密性应用
    • 两个应用之间进行交互
    • 网络之间调用
    • 两个应用需要频繁调用

3、Pod实现机制

  • 共享网络
    • 通过Pause容器,将其他业务容器加入进来,让所有业务容器在同一个名称空间里,可以实现网络共享
  • 共享存储
    • 引入数据卷的概念Volumn,使用数据卷进行持久化存储

4、Pod镜像拉取策略

[
Always:每次创建Pod都会重新拉取一次镜像
Never:永远不主动拉取镜像
IfNotPresent:镜像在宿主机上不存在时才拉取
]//获取镜像的策略,默认值为 Always,每次都尝试重新下载镜像 

5:Pod资源限制

sepc 
containers: 
- name: db 
image: mysql 
resources: 
  requests: #最小
    memory: "64Mi" 
    cpu: "250m" 
  limits: #最大
   memory: "128Mi" 
   cpu: "500m"

6、Pod重启机制

restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为 Always 
  • Always:当容器终止退出后,总是重启容器,默认
  • OnFailure:当容器异常退出时(推出状态码非0),才重启容器
  • Never:当容器终止退出,从不重启容器

7、Pod健康检查

livenessProbe: //pod 内容器健康检查的设置 
  exec: 
    command: [string] //exec 方式需要指定的命令或脚本 
    httpGet: //通过 httpget 检 查健康 
      path: string 
      port: number 
      host: string 
      scheme: Srtring 
      httpHeaders: 
        - name: Stirng 
        value: string 
    tcpSocket: //通过 tcpSocket 检查健康
     port: number 
  initialDelaySeconds: 0//首次检查时间 
  timeoutSeconds: 0 //检查超时时间
  periodSeconds: 0 //检查间隔时间 
  • livenessProbe(存活检查)
    • 如果检查失败,将杀死容器,根据pod的restartPolicy的操作
  • readinessProbe(就绪检查)
    • 如果检查失败,会把Pod从service endpoints中剔除
  • Probe支持以下三种检查方法
    • httpGet:发送HTTP请求,返回200-400范围状态码为成功
    • exec:执行shell命令返回状态码是0为成功
    • tcpSocket:发起TCP Socket建立成功

8、节点亲和性

Kubernetes 核心技术-Pod_第7张图片

9、影响调度标签

Kubernetes 核心技术-Pod_第8张图片
Kubernetes 核心技术-Pod_第9张图片

你可能感兴趣的:(kubernetes,kubernetes)