深入理解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的实现原理