一、Pod说明

Pod只是一个逻辑概念,一个原子调度单位,其优势在于

  1. 可以统一调度一组容器到指定的node上
  2. 共享资源:Pod的容器可以使用localhost进行通信,使用volume进行文件共享、使用socket文件进行本地通信,减少频繁的远程网络请求网络
  3. 使容器A和容器B不依赖启动顺序(通过使用infra容器,解决docker volume-from存在的容器启动的先后顺序问题,)

二、4种容器部署方式

需求:Tomcat通过webapp下的WAR包运行应用

1. 一个tomcat镜像+war包镜像

将WAR包放在Tomcat镜像的webapps目录下,做成一个新的docker镜像,

缺点:更新WAR包或者升级Tomcat镜像,都要重新发布镜像

2. 一个tomcat镜像+war包挂载宿主机

声明一个hostPath类型的Volume,把宿主机的WAR包挂载到Tomcat容器当中运行起来,只有一个tomcat镜像

缺点:要在宿主机里放一个WAR包,并且得通知宿主机更新这个包

3. 一个tomcat镜像+一个war包镜像,通过--volumes-from方式

通过A容器--volumes-from=B容器方式,将B容器目录挂载

缺点:容器存在启动先后顺序,地位不对等

4. 一个tomcat镜像+一个war包镜像,通过pod方式

单独给WAR包和Tomcat分别做成镜像,然后放在一个Pod容器里组合在一起, 利用Init Container解决顺序和依赖关系,

initContainers会先启动,按顺序 tomcat和initContainer的容器声明了同样的Volume,然后Container容器启动后,volume就已经存在程序了,tomcat就可以直接执行

这样只需要在tomcat或者WAR更新的时候,单独更新相应的镜像,yaml如下

apiVersion: v1
kind: Pod
metadata:
name: javaweb-2
spec:
initContainers:
- image: xxx/sample:v2
name: war
command: ["cp", "/sample.war", "/app"]
volumeMounts:
- mountPath: /app
name: app-volume
containers:
- image:xxx/tomcat:7.0
name: tomcat
command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
volumeMounts:
- mountPath: /root/apache-tomcat-7.0.42-v2/webapps
name: app-volume
ports:
- containerPort: 8080
hostPort: 8001
volumes:
- name: app-volume
emptyDir: {}

三、 K8s中的Volume

K8s的volume和mountPath是bind mount的方式,功能就是把文件或目录绑定挂载在一起,bind mount的挂载点是容器volume在宿主机上的目录

k8s项目只要把所有Volume的定义都设计在Pod层级,一个Volume对应的宿主机目录对于Pod来说只有一个,只要声明挂载了这个Volume,就可以共享这个Volume对应的宿主机目录

apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
volumes:
- name: shared-data
hostPath:
path: /data
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian-container
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

debin-container和nginx-conntainer都声明挂载了shared-data这个Volume,shared-data是hostPath类型,对应宿主机的/data,同时被绑定挂载进了两个容器中,这就是为什么nginx-container可以从它的/usr/share/nginx

四、总结

形象的说,云计算机的操作系统是K8S,容器相当于进程,而Pod则是进程组(可以使用pstree -g查看)

Pod扮演的是传统基础设施的“虚拟机”的角色,容器则是虚拟机的应用程序,要完成虚拟机应用到微服务架构的迁移,核心思想是:

  1. 分析应用组成(组件、进程)
  2. 拆分成松耦合的容器(以容器镜像方式分发)
  3. 利用Init Container解决顺序和依赖关系

为什么Kubernetes使用Pod作为最小调度单元的更多相关文章

  1. Pod:Kubernetes最小执行单元

    Pod基本概念理解 Pod是什么 Pod 是 Kubernetes 应用程序的基本执行单元,它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元. 一个Pod可以包括一个或者多个容器. ...

  2. Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration

    由于博客园不支持markdown,推荐以下url阅读: 原创url:https://blog.csdn.net/weixin_42495873/article/details/103364868 ## ...

  3. kubernetes之pod调度

    调度规则 deployment全自动调度: 运行在哪个节点上完全由master的scheduler经过一系列的算法计算得出, 用户无法进行干预 nodeselector定向调度: 指定pod调度到一些 ...

  4. Kubernetes之Pod使用

    一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...

  5. Kubernetes之POD

    什么是Pod Pod是可以创建和管理Kubernetes计算的最小可部署单元.一个Pod代表着集群中运行的一个进程. Pod就像是豌豆荚一样,它由一个或者多个容器组成(例如Docker容器),它们共享 ...

  6. Kubernetes中pod创建流程

    转自:https://blog.csdn.net/yan234280533/article/details/72567261 Pod是Kubernetes中最基本的部署调度单元,可以包含contain ...

  7. Kubernetes探索学习004--深入Kubernetes的Pod

    深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...

  8. Kubernetes基石-pod容器

    引用三个问题来叙述Kubernetes的pod容器 1.为什么不直接在一个Docker容器中运行所有的应用进程. 2.为什么pod这种容器中要同时运行多个Docker容器(可以只有一个) 3.为什么k ...

  9. kubernetes concepts -- Pod Overview

    This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...

随机推荐

  1. 依赖注入在 dotnet core 中实现与使用:1 基本概念

    关于 Microsoft Extension: DependencyInjection 的介绍已经很多,但是多数偏重于实现原理和一些特定的实现场景.作为 dotnet core 的核心基石,这里准备全 ...

  2. 章节十六、2-TestNG注解和断言

    一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...

  3. Linux系统@根目录下各目录作用归纳图

  4. SpringBoot Mybatis解决使用PageHelper一对多分页问题

    一般来说使用 PageHelper 能解决绝大多数的分页问题,相关使用可在博客园上搜索,能找到很多资料. 之前我在做SpringBoot 项目时遇到这样一个问题,就是当一对多联合查询时需要分页的情况下 ...

  5. Vue仿微信app页面跳转动画

    10:14:11独立开发者在开发移动端产品时,为了更高效,通常会使用Web技术来开发移动端项目,可以同时适配Android.iOS.H5,稍加改动还可适配微信小程序. 在使用Vue.js开发移动端页面 ...

  6. Keras实例教程(2)

    https://blog.csdn.net/baimafujinji/article/details/78385745

  7. 微软发布了开发社区采用.NET Standard的最新信息

    最近,微软发布了开发社区当前采用.NET Standard的最新信息..NET Standard是API的正式规范,现有.NET实现在不同平台的是通用的(从而允许跨平台开发).当前规范(版本2.0)在 ...

  8. HTML连载34-背景关联和缩写以及插图图片和背景图片的区别

    一.背景属性缩写的格式 1.backgound:背景颜色  背景图片  平铺方式  关联方式  定位方式 2.注意点: 这里的所有值都可以省略,但是至少需要一个 3.什么是背景关联方式 默认情况下,背 ...

  9. JS核心之DOM操作 下

    目录: 1.节点类型之Document类型 2.节点类型之Element类型 3.节点类型之Text类型 4.综合小示例 -- 动态添加外部样式文件 5.查找元素的扩展方法 接上篇,我们先来看常用的三 ...

  10. STL中的map和multimap小结

    (1)使用map/multimap之前必须包含头文件<map>:#include<map> 并且和所有的关联式容器一样,map/multimap通常以平衡二叉树来完成    ( ...