Fork me on GitHub

Pod系列 (一) Pod简介

一、基本概念

总的来说Pod包括以下几个方面:

  • 最小的部署单元
  • 一个Pod中可以包含一个或者多个容器
  • 一个Pod中的容器共享网络命令空间
  • Pod是短暂的

在k8s集群中最小的管理和部署单元是Pod而非容器,这是为什么呢?

  使用docker创建容器,一个容器起一个进程并且在一个容器中运行着一个应用程序;而Pod是多进程设计,运行多个应用程序(一个Pod可由多个容器组成,每个容器运行一个应用程序)。这样也方便管理。

一个Pod中的容器时共享网络的,这是基于Pod中的Pause容器来实现的,下面会对此详细说明。共享网络也带来了同一个Pod中应用交互的方便性。

Pod声明周期时短暂的,因为当Pod所在节点发生故障,该Pod会被转移到其它节点,而新的Pod与之前的Pod无任何关系。

二、Pod实现机制

基于Pod实现的功能,Pod有两个重要的实现机制:

  • 共享网络
  • 共享存储

  同一个Pod之间容器之间共享网络时如何实现的呢?另外就是如果一个Pod所在的节点发生故障,该Pod转移到其它节点,而此时Pod是全新的,那么之前的数据如何获取呢?

1、共享网络

我们知道容器本身通过namespace和group实现相互隔离的,如果想实现共享网络那么必须在同一个namespace中,而Pod就是基于此来实现的。

  在一个Pod中可以将容器分为两大部分:Pause容器以及用户的业务容器(container1、container2...),其中Pause是一个特殊的容器,Pod中首先创建的就是Pause容器,当其它的业务容器加入Pod后,会将其加入到Pause中,这样Pause将保留所有容器的状态,通过Pause容器来管理所有Pod中的容器,并且加入到Pause后会共享同一个namespace,也就是多个容器共享Pod的ip和的端口。

 2、共享存储

当一个Pod从一个节点调度到另一个节点,它需要读取到之前的数据,那么就需要有一个持久化数据的地方称之为数据卷(volume)。

 如上所示,使用数据卷持久化数据,这样就算Pod被重新调配到其它节点也可以获取原来的数据。

三、镜像拉取策略

apiVersion: v1
kind: Pod
metadata:
  name: mypod 
spec:
    containers:
      - name: nginx
        image: nginx:1.14
        imagePullPolicy: Always
    

可以看到在上面的yaml文件中有imagePullPolicy参数,这个参数表示镜像拉取的策略,有三个选项:

  • IfNotPresent 默认值,镜像在宿主机上不存在时才拉取
  • Always 每次创建Pod都会重新拉取一次镜像
  • Never Pod永远不会主动拉取这个镜像

四、Pod资源限制

Pod的创建需要消耗资源,那么Pod调度过程中如果规定了对应的资源限制,就会调度到符合资源限制的节点上。

apiVersion: v1
kind: Pod
metadata:
  name: mypod 
spec:
    containers:
    - name: db
      image: mysql
      env:
      - name: MYSQL_ROOT_PASSWORD
        value: "password"
      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
        limits:
          memory: "128Mi"
          cpu: "500m"
    

Pod中requests和limits的限制调度到符合的节点上。

五、Pod重启机制

apiVersion: v1
kind: Pod
metadata:
  name: test 
spec:
    containers:
    - name: busybox
      image: busybox:1.28.4
      args:
      - /bin/sh
      - -c
      -sleep 36000
    restartPolicy: Never
    

在该Pod的yaml文件中存在restartPolicy参数,表示Pod的重启策略,有三个值可供选择:

  • Always 当容器终止退出后,总是重启容器,默认策略
  • OnFailure 当容器异常退出时,才重启容器
  • Never 当容器终止退出,从不重启容器

六、Pod健康检查

apiVersion: v1
kind: Pod
metadata:
  labels: 
    test: liveness
  name: liveness-exec
spec:
    containers:
    - name: liveness
      image: busybox
      args:
      - /bin/sh
      - -c
      - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy
      livenessProbe:
        exec:
          command:
          - cat
          - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
    

Pod中的健康检查有:

  • livenessProbe 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy来进行操作
  • readinessProbe 就绪检查,k8s会把Pod从serice endpoints中剔除掉

支持的检查方法有三种:

  • http请求 返回200-400范围状态码为成功
  • exec 执行shell命令返回状态码是0为成功
  • tcpSocket 发起TCP Socket建立成功

 

posted @ 2021-06-18 18:10  iveBoy  阅读(366)  评论(0编辑  收藏  举报
TOP