k8s-Pod的概念和存在的意义

1. Pod的概念

  • pod是k8s中部署的最小单元。kubernetes直接管理Pod,而不是容器
  • Pod包含多个容器(也就是说pod是一组容器的集合)
  • 一个pod中 容器共享网络,命名空间和存储资源:

      共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个命名空间中,可以实现网络共享。

      共享存储:引入数据卷(也叫 容器卷)概念Volumn,使用数据卷进行持久化存储

  • pod是短暂的

   在Pod中,容器共享一个IP地址和端口空间,它们可以通过localhost发现彼此。

   在同一个Pod中的容器,可以使用System V 或POSIX信号进行标准的进程间通信和共享内存。在不同Pod中的容器,拥有不同的IP地址,因此不能够直接在进程间进行通信。容器间通常使用Pod IP地址进行通信。在一个Pod中的应用于口访问共享的存储卷,它被定为为Pod的一部分,可以被挂接至每一个应用文件系统。

   与独立的应用容器一样,Pod是一个临时的实体,它有着自己的生命周期。在Pod被创建时,会被指派一个唯一的ID,并被调度到Node中,直到Pod被终止或删除。如果Pod所在的Node宕机,给定的Pod(即通过UID定义)不会被重新调度。相反,它将被完全相同的Pod所替代。这所说的具有和Pod相关生命周期的情况,例如存储卷,是说和Pod存在的时间一样长。如果Pod被删除,即使完全相同的副本被创建,则相关存储卷等也会被删除,并会Pod创建一个新的存储卷等。Pod本身就没有打算作为持久化的实体,在调度失败、Node失败和获取其它退出(缺少资源或者Node在维护)情况下,Pod都会被删除。

    一般来说,用户不应该直接创建Pod,即是创建单个的Pod也应该通过控制器创建。在集群范围内,控制器为Pod提供自愈能力,以及副本和部署管理。

 

网络:每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口。在同一个Pod中的容器可以同locahost进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。

存储:Pod能够被指定共享存储卷的集合,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享数据。存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启。

 2.Pod存在的意思

2.1创建容器使用docker,一个docker对应是一个容器,一个容器有进程,一个容器运行一个应用程序

2.2 Pod是多进程设计,运行多个应用程序

  • 一个Pod有多个容器,一个容器里面运行一个应用程序

2.3 Pod存在为了亲密性应用

  • 两个应用之间进行交互
  • 网络之间调用
  • 两个应用需要频繁调用

pod主要用法:

1、运行单个容器:最常见的用法,在这种情况下,可以将pod看做是单个容器的抽象封装

2、运行多个容器:封装多个紧密耦合且需要共享资源的应用程序

 

三、pod管理命令

1、创建Pod:
# kubectl apply -f pod.yaml 或者 # kubectl run nginx --image=nginx

2、查看pod
# kubectl get pods

# kubectl describe pod<pod名称>

3、查看日志;
# kubectl logs <pod名称>  [-c CONTAINER]

# kubectl logs <pod名称>  [-c CONTAINER] -f

4、进入容器终端;
# kubectl exec <pod名称>  [-c CONTAINER] -- bash

# kubectl exec -it dev-market-merchant-intelligent-oilgas-58cdd6986c-fb4tz -- bash

5、删除pod
# kubectl delete <Pod名称>

6、生成一个pod的yaml文件
# kubectl run nginx --image=nginx --dry-run=client -o yaml >nginx_pod.yaml

 


四 Pod的工作方式

  • 在Kubernetes中一般不会直接创建一个独立的Pod,这是因为Pod是临时存在的一个实体。
  • 当直接创建一个独立的Pod时,如果缺少资源或者所被调度到的Node失败,则Pod会直接被删除。这里需要注意的是,重起Pod和重起Pod中的容器不是一个概念,Pod自身不会运行,它只是容器所运行的一个环境Pod本身没有自愈能力,如果Pod所在的Node失败,或者如果调度操作本身失败,则Pod将会被删除同样的,如果缺少资源,Pod也会失败
  • Kubernetes使用高层次的抽象,即控制器来管理临时的Pod。通过控制器能够创建和管理多个Pod,并在集群范围内处理副本、部署和提供自愈能力

例如,如果一个Node失败,控制器可以自动的在另外一个节点上部署一个完全一样的副本。控制器是Pod模板来创建Pod,Pod的控制器包括:

Pod模板是一个被包含在其它对象(例如:Deployment、StatefuleSet、DaemonSet等)中的Pod规格。控制使用Pod模板创建实际的Pod,下面是Pod模板的一个示例:

 

 

4.1 重启策略

在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略:

  • Always:只要退出就会重启。
  • OnFailure:只有在失败退出(exit code不等于0)时,才会重启。
  • Never:只要退出,就不再重启

注意,这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上。

 

 

4.2 镜像拉取策略

在Kubernetes中,容器的运行是基于容器镜像的。Pod支持三种镜像拉取策略,在配置文件中通过imagePullPolicy字体设置镜像的拉取策略

  • Always:默认值,不管本地是否存在镜像 都会进行一次拉取。
  • Never:不管本地是否存在镜像 都不会进行拉取。
  • IfNotPresent:仅在本地镜像不存在时,才会进行镜像拉取。

注意:

  • 镜像拉取策略的默认值为IfNotPresent,但:latest标签的镜像默认为Always。
  • 拉取镜像时docker会进行校验,如果镜像中的MD5码没有变,则不会拉取镜像数据。
  • 生产环境中应该尽量避免使用:latest标签,而开发环境中可以借助:latest标签自动拉取最新的镜像。

 4.3Pod资源限制

 

Kubernetes通过cgroups来限制容器的CPU和内存等计算资源,在创建Pod时,可以为Pod中的每个容器设置资源请求(request)和资源限制(limit),资源请求 是容器需要的最小资源要求,资源限制 为容器所能使用的资源上限。CPU的单位是核(core),内存(Memory)的单位是字节(byte)。在Pod中,容器的资源限制通过resources.limits进行设置:

  • spec.containers[].resources.limits.cpu:容器的CPU资源上限,可以短暂超过,容器也不会被停止;
  • spec.containers[].resources.limits.memory:容器的内存资源上限,不可以超过;如果超过,容器可能会被停止或调度到其它资源充足的Node上

资源请求通过resources.requests进行设置,

  • spec.containers[].resources.requests.cpu:容器的CPU资源请求,可以超过;
  • spec.containers[].resources.requests.memory:容器的内存资源请求,可以超过;但如果超过,容器可能会在Node内存不足时清理

Kubernetes在进行Pod调度时,Pod的资源请求是最重要的一个指标。Kubernetes Schedule会检查Node是否存在足够的资源,判断是否能够满足Pod的资源请求,从而决定是否可以运行Pod。

4.4 健康检查

在Pod部署到Kubernetes集群中以后,为了确保Pod处于健康正常的运行状态,Kubernetes提供了两种探针,用于检测容器的状态:

  • Liveness Probe(存活检查) :检查容器是否处于运行状态。如果检测失败,kubelet将会杀掉掉容器,并根据重启策略进行下一步的操作。如果容器没有提供Liveness Probe,则默认状态为Success;
  • ReadinessProbe(就绪检查) :检查容器是否已经处于可接受服务请求的状态。如果Readiness Probe失败,端点控制器将会从服务端点(与Pod匹配的)中移除容器的IP地址。Readiness的默认值为Failure,如果一个容器未提供Readiness,则默认是Success。

kubelet在容器上周期性的执行探针以检测容器的健康状态,kubelet通过调用被容器实现的处理器来实现检测,在Kubernetes中有三类处理器:

  • ExecAction :在容器中执行一个指定的命令。如果命令的退出状态为0,则判断认为是成功的;
  • TCPSocketAction :在容器IP地址的特定端口上执行一个TCP检查,如果端口处于打开状态,则视为成功;
  • HTTPGetAcction :在容器IP地址的特定端口和路径上执行一个HTTP Get请求使用container的IP地址和指定的端口以及请求的路径作为url,用户可以通过host参数设置请求的地址,通过scheme参数设置协议类型(HTTP、HTTPS)如果其响应代码在200~400之间,设为成功。

健康检测的结果为下面三种情况:

  • Success :表示容器通过检测
  • Failure :表示容器没有通过检测
  • Unknown :表示容器容器失败

     

     

具体可以参考: https://zhuanlan.zhihu.com/p/463749017

posted @ 2024-05-09 17:43  苹果芒  阅读(8)  评论(0编辑  收藏  举报