一、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. 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

    微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...

  2. Swift项目引入第三方库的方法

    以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库 Alamofire HTTP网络库,AFNetworking作者写的 SDWebImage 图片加载, ...

  3. SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet

    转自:https://my.oschina.net/lichhao/blog SpringMVC简介 SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的 ...

  4. Windows上IDEA搭建最新Spark2.4.3源码调试的开发环境

    相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...

  5. unity之Layer作用

    1.使用layer做分层渲染 创建两个物体 添加AB两个层级 分别为两个物体设置对应的层级 为摄像机选择渲染层次(在这个例子中,取消对B层的渲染) 在游戏界面中,将不会显示B层的游戏对象

  6. 前端开发-CSS语法标准

    一.命名规则说明: 1.命名规则说明: 所有的命名最好都小写 属性的值一定要用双引号("")括起来,且一定要有值如class="nav",id="na ...

  7. python 冷知识(装13 指南)

    python 冷知识(装13 指南) list1 += list2 和 list1 = list1 + list2 的区别 alpha = [1, 2, 3] beta = alpha # alpha ...

  8. ccflow关于流程引擎的父子流程的基本概念

    关键字:驰骋BPM jflow,ccflow, 驰骋工作流引擎 父子流程概念:在管理活动中,通用的部分,公用的部分,可以被重复执行的部分的流程管理活动我们把他独立出来,成为子流程,可以被其他流程的管理 ...

  9. DEVOPS基础

    转自:http://www.scrumcn.com/agile/scrum-knowledge-library/agile-development.html#tab-id-7 DevOps是一组过程. ...

  10. [python] - profilers性能分析器

    1. 性能分析器: profile, hotshot, cProfile 2. 作用: 测试函数的执行时间 每次脚本执行的总时间