多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### **一、理解Kubernetes Pod** ![](https://img.kancloud.cn/0a/e6/0ae6034035ecef9b324b887b07549e53_1257x725.png) 起初我们所有的应用都部署在物理服务器,后续为了解决成本等问题引来虚拟化技术,例如OpenStack,直到今天的Kubernetes平台上; ***** Kubernetes就好比我们传统的数据中心,在Kubernetes数据中心中,没有物理机房及服务器的概念,所有的计算资源都是软件定义的,Pod可以认为是Kubernetes数据中心的一种虚拟资源,他具有逻辑上的CPU,内存,网络和存储。Pod是Kubernetes集群当中最小的资源单位。 * 容器是一种软件打包的技术,是一种资源隔离抽象; * pod是容器的包装,是一种虚拟机抽象; * Kubernetes是管理pod虚拟机数据中心的一种抽象概念 ***** 2、为什么需要Pod 容器的本质: **一个视图被隔离、资源受限的进程** (容器里PID=1的进程就是应用本身),管理虚拟机就相当于管理基础设施,管理容器就相当于管理应用本身 Kubernetes其实就是云时代的操作系统(容器镜像就是这个操作系统的软件安装包) 案例1: ![](https://img.kancloud.cn/01/24/012477729e513c741a8e9b805ddee2a1_1110x416.png) 我们说Kubernetes类比于操作系统,容器就类比于进程,Pod就类比于进程组;上图中HelloWorld有4个进程组成,那么该程序该如何用容器运行起来呢? 方案1: 在一个Docker容器中,启动4个进程 疑问: 那么容器PID为1的进程该设置哪个呢? 在容器里运行复杂程序特别复杂 方案2: 定义4个容器启动,把他们定义到一个pod里 ![](https://img.kancloud.cn/40/70/40703a433c2bf36f796168928ada9857_1439x736.png) 3、理解Pod Pod是Kubernetes的原子调度单位,Pod是用来解决超亲密关系的两个应用服务,两个应用之间需要发生文件交换,并且需要通过localhost进行本地通讯,同时也会发生非常频繁的RPC调用。比如日志收集 **共享网络** ***** ![](https://img.kancloud.cn/d6/0d/d60dd34739e3a6ff40a55d543a425263_367x295.png) * 容器A和容器B通过Pause(Infra Container)的方式共享同一个Network Namespace * 他们之间使用Localhost进行通信 * 容器A和容器B看到的网络设备和Pause容器看到的完全一样 * 一个Pod只有一个IP地址,也就是这个Pod的Network Namespace对应的IP地址 * 整个Pod的生命周期跟Pause容器一致,而与容器A和B无关 **共享存储** ***** ![](https://img.kancloud.cn/c4/fa/c4fae03470e72eff50e6e6812ec0fce8_390x295.png) 同一个Pod中的多个容器能够共享Pod级别的存储卷Volume,Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录 案例1: ![](https://img.kancloud.cn/0f/72/0f72157f952160cc9c33c6cc0a4c95fd_788x753.png) 4、多容器Pod ***** Kubernetes 集群中的 Pod 主要有两种用法: * **运行单个容器的 Pod**。"每个 Pod 一个容器"模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。 * **运行多个协同工作的容器的 Pod**。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。 这些位于同一位置的容器可能形成单个内聚的服务单元 —— 一个容器将文件从共享卷提供给公众, 而另一个单独的“挂斗”(sidecar)容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。 官网参考文档:[https://kubernetes.io/zh/docs/concepts/workloads/pods/](https://kubernetes.io/zh/docs/concepts/workloads/pods/) ### **总结: 一般情况下一个Pod中只运行一个容器,但是除个别情况外,一个Pod会起两个容器,一个为主容器,另一个为辅助容器** #### **二、实战发布Pod** ``` apiVersion: v1 kind: Pod metadata: name: petclinic spec: containers: - name: petclinic image: spring2go/spring-petclinic:1.0.1.RELEASE restartPolicy: OnFailure ``` 发布Petclinic Pod ``` ```