深入理解Kubernetes中的Pod

Pod是什么

  Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes中虚拟机抽象,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。Pod中包含了一个或多个容器,还包括了存储、网络等各个容器共享的资源,是Kubernetes最基本的调度单位。Pod支持多种容器环境,Docker则是最流行的容器环境。

 

为什么需要Pod

   Kubernetes引入了Pod这个概念,一开始会让人很疑惑,为什么在Kubernetes我们不直接使用一个单独的容器(container),比如docker,而是用Pod在外面封装了一层,来封装一个或多个容器呢?

   

 

  根据Pod的定义我们知道Pod是一个或一个以上的 容器(例如Docker容器)组成的,且具有共享存储/网络/UTS/PID的能力,以及运行容器的规范。容器是一种资源的隔离,而Pod是容器的包装,是虚拟级的抽象,Kubernetes是管理Pod的数据中心的抽象。

  下面先看下Pod等部署方式。

 

Pod部署方式

  1. 单容器Pod:

   最常见的应用方式,大部分场景下,一个Pod里面只会进驻一个应用容器。

  2. 多容器Pod:

   多容器Pod里面会进驻多个容器,一个是主容器,其它的都是辅助容器,或者成为边车容器(Sidecar容器)。对于多容器Pod,Kubernetes会保证所有的容器都在同一台物理主机或虚拟主机中运行。多容器Pod是相对高阶的使用方式,除非应用强关联耦合特别严重,一般不推荐使用这种方式。一个Pod内的所有容器共享IP地址和端口范围,网络,存储等资源,容器之间可以通过 localhost 互相访问。

    

   上图来自Kubernetes官网,展示等是一个Pod里包含两个容器,一个是Web Server(主容器),另一个是File Puller(辅助容器),File Puller定期从内容管理系统中拉取最新内容,通过Volume共享等方式将内容共享给Web Server,这样就可以不用重新发布应用来实现获取最新内容。

   Kubernetes之所以在容器等基础上增加了一层Pod这样的设计,主要考虑到为了支持这种多容器使用的场景。另外一个原因是屏蔽不同容器技术的变化,比如我们现在可以不使用docker,而切换成rkt容器,或者未来出现更好的容器。

 

发布Pod

  Pod发布规范:kubernetes pod的标准yaml

 

  https://v1-18.docs.kubernetes.io/docs/concepts/workloads/pods/

  

 

   也可以使用命令kubectl explain pod查看 字段的详细描述

  

   查看具体的,比如查看kind说明,使用kubectl explain pod.kind

kubectl explain pod.kind
KIND:     Pod
VERSION:  v1

FIELD:    kind <string>

DESCRIPTION:
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

 下面定义Pod发布文件

 

 下面是运行操作过程

 

 等kubernetes抓取完毕后会变成running状态,如下图。

 

 也可以查看具体

 查看Pod详情

 返回的内容主要关心最下面的event

Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  5m48s  default-scheduler  Successfully assigned default/petclinic to minikube
  Normal  Pulling    5m46s  kubelet, minikube  Pulling image "spring2go/spring-petclinic:1.0.0.RELEASE"
  Normal  Pulled     4m20s  kubelet, minikube  Successfully pulled image "spring2go/spring-petclinic:1.0.0.RELEASE" in 1m25.9231182s
  Normal  Created    4m19s  kubelet, minikube  Created container petclinic
  Normal  Started    4m19s  kubelet, minikube  Started container petclinic

先是调度,抓取镜像(如果没有本地缓存),创建。

如何访问Pod?

  访问http://localhost:8080/是失败的。

  

 

   在默认情况下,kubernetes集群中的Pod对外是不可见的,kubernetes集群内部是一个私有环境,有自己的内部网络,外界是不能访问kubernetes内部的。

   端口转发(Port-Forward)

    这种方式仅限于调试测试环境。

kubectl port-forward petclinic 8080:8080 

  

  这个命令意思是在本机上开启一个8080端口,通过这个端口可以将请求转发到kubernetes集群的内部Pod对应的端口上,前面的8080是主机上的端口,后面的8080是Pod上的端口。执行完之后,刷新http://localhost:8080/就可以访问应用了。

   删除Pod

  

 

 

Pod的实现原理

  

 

 

 

 

 

 

   

posted @ 2021-02-09 00:16  songguojun  阅读(557)  评论(0编辑  收藏  举报