zoukankan      html  css  js  c++  java
  • 为什么Kubernetes使用Pod作为最小调度单元

    一、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解决顺序和依赖关系
  • 相关阅读:
    P3970 [TJOI2014]上升子序列
    受欢迎的牛(Tarjan缩点模板)
    Y15BeTa的乱搞方法(占坑待填)
    Luogu P4145 上帝造题的七分钟2 / 花神游历各国
    Luogu P1525 【关押罪犯】
    Luogu P1077 摆花 NOIP2012pjT3
    Nowcoder deco的abs
    CSP-S前的芝士清单
    普天同庆
    线段树区改区查标记永久化板子
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/11563582.html
Copyright © 2011-2022 走看看