一、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. 2321. 【NOIP普及组T1】方程

    2321. [NOIP普及组T1]方程 时间限制: 1000 ms  空间限制: 262144 KB 题目描述

  2. .netcore持续集成测试篇之 .net core 2.1项目集成测试

    系列目录 从.net到.net core以后,微软非常努力,以每年一到两个大版本的频率在演进.net core,去年相继发布了.net core 2.1和2.2,其中2.1是长期支持版,不断的快速更新 ...

  3. 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验

    目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...

  4. C#使用NLOG System.TypeInitializationException,类型初始值设定项引发异常

    C#如何使用NLOG,网上有很多介绍,本次使用时遇到一个问题,使用NLOG写日志时,出现初始化异常,基本异常信息如下: System.AggregateException: 发生一个或多个错误. -- ...

  5. pak文件的打包和解包

    pak格式的文件 一般游戏有资源 游戏素材会打包放进去 比如游戏语音 游戏多加点语音  多加一些贴图资源 外部文件实现的 素材--->pak文件--->用的时候从文件中取出来 文件的打包 ...

  6. Python|队列Queue

    一 前言 本文算是一次队列的学习笔记,Queue 模块实现了三种类型的队列,它们的区别仅仅是队列中元素被取回的顺序.在 FIFO 队列中,先添加的任务先取回.在 LIFO 队列中,最近被添加的元素先取 ...

  7. 玩转SpringBoot 2 快速搭建 | Spring Initializr 篇

    SpringBoot 为我们提供了外网 Spring Initializr 网页版来帮助我们快速搭建 SpringBoot 项目,如果你不想用 IDEA 中的插件,这种方式也是不错的选择.闲话少说,直 ...

  8. vue-cli2.X中引入高德地图,将其设为全局对象

    平时一般未用脚手架构建或用webpack构建的项目只要用script标签引入即可,在vue-cli 2.X构建的项目中,需要用如下方式引入高德地图: 首先在高德地图开放平台中注册开发者账号并获取key ...

  9. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)

    前言 下面是阿里对<阿里巴巴 Java 开发手册>(下称<手册>)的介绍: 凝聚了阿里集团很多同学的知识智慧和经验,这些经验甚至是用血淋淋的故障换来的,希望前车之鉴,后车之师, ...

  10. BS/CS 区别

    转载自:https://www.cnblogs.com/chenmingjun 一.CS和BS含义: CS即Client/Server(客户机/服务器)结构.C/S结构在技术上很成熟,它的主要特点是交 ...