一、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. 使用 php 内部web服务器

    使用 php 内部web服务器如网站目录 d:\web\index.php1.打开命令窗口,输入下列3条命令cd d:cd d:\web\index.phpphp -S localhost:80802 ...

  2. serverless在微店node领域的探索应用

    背景 目前微店中台团队为了满足公司大部分产品.运营以及部分后端开发人员的尝鲜和试错的需求,提供了一套基于图形化搭建的服务端接口交付方案,利用该方案及提供的系统可生成一副包含运行时环境定义可立即运行的工 ...

  3. .NET Core下操作Git,自动提交代码到 GitHub

    .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归正题,你想盖大楼吗?想 GitHub 首页一片绿吗?今天拿她玩玩自动化提交代 ...

  4. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  5. 快速了解Python并发编程的工程实现(下)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  6. Net微信网页开发之使用微信JS-SDK获取当前地理位置

    前言: 前段时间有一个关于通过获取用户当前经纬度坐标,计算出该用户距离某指定地点之间的距离.因为做这个项目需要能够获取到比较精确的经纬度坐标,刚开始使用的是百度地图结果发现百度地图地位不太准确(有时候 ...

  7. 字符串匹配算法之————KMP算法

    上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符.但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博 ...

  8. 解读BloomFilter算法(转载)

    1.介绍 BloomFilter(布隆过滤器)是一种可以高效地判断元素是否在某个集合中的算法. 在很多日常场景中,都大量存在着布隆过滤器的应用.例如:检查单词是否拼写正确.网络爬虫的URL去重.黑名单 ...

  9. Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  10. JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化

    JVM的知识这里总结的很详细:https://github.com/doocs/jvm/blob/master/README.md,因此在本博客也不会再对其中的东西重复总结了. 现在很多文章关于JVM ...