zoukankan      html  css  js  c++  java
  • 深入理解Kubernetes中的Pod

    Pod是什么

      Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes中虚拟机抽象,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。Pod中包含了一个或多个容器,还包括了存储、网络等各个容器共享的资源,是Kubernetes最基本的调度单位。Pod支持多种容器环境,Docker则是最流行的容器环境。

    为什么需要Pod

       Kubernetes引入了Pod这个概念,一开始会让人很疑惑,为什么在Kubernetes我们不直接使用一个单独的容器(container),比如docker,而是用Pod在外面封装了一层,来封装一个或多个容器呢?

       

      根据Pod的定义我们知道Pod是一个或一个以上的 容器(例如Docker容器)组成的,且具有共享存储/网络/UTS/PID的能力,以及运行容器的规范。容器是一种资源的隔离,而Pod是容器的包装,是虚拟级的抽象,Kubernetes是管理Pod的数据中心的抽象。

      下面先看下Pod等部署方式。

    Pod部署方式

      1. 单容器Pod:

       最常见的应用方式,大部分场景下,一个Pod里面只会进驻一个应用容器。

      2. 多容器Pod:

       多容器Pod里面会进驻多个容器,一个是主容器,其它的都是辅助容器,或者成为边车容器(Sidecar容器)。对于多容器Pod,Kubernetes会保证所有的容器都在同一台物理主机或虚拟主机中运行。多容器Pod是相对高阶的使用方式,除非应用强关联耦合特别严重,一般不推荐使用这种方式。一个Pod内的所有容器共享IP地址和端口范围,网络,存储等资源,容器之间可以通过 localhost 互相访问。

        

       上图来自Kubernetes官网,展示等是一个Pod里包含两个容器,一个是Web Server(主容器),另一个是File Puller(辅助容器),File Puller定期从内容管理系统中拉取最新内容,通过Volume共享等方式将内容共享给Web Server,这样就可以不用重新发布应用来实现获取最新内容。

       Kubernetes之所以在容器等基础上增加了一层Pod这样的设计,主要考虑到为了支持这种多容器使用的场景。另外一个原因是屏蔽不同容器技术的变化,比如我们现在可以不使用docker,而切换成rkt容器,或者未来出现更好的容器。

    发布Pod

      Pod发布规范:kubernetes pod的标准yaml

      https://v1-18.docs.kubernetes.io/docs/concepts/workloads/pods/

      

       也可以使用命令kubectl explain pod查看 字段的详细描述

      

       查看具体的,比如查看kind说明,使用kubectl explain pod.kind

    kubectl explain pod.kind
    KIND:     Pod
    VERSION:  v1
    
    FIELD:    kind <string>
    
    DESCRIPTION:
         Kind is a string value representing the REST resource this object
         represents. Servers may infer this from the endpoint the client submits
         requests to. Cannot be updated. In CamelCase. More info:
         https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

     下面定义Pod发布文件

     

     下面是运行操作过程

     

     等kubernetes抓取完毕后会变成running状态,如下图。

     

     也可以查看具体

     查看Pod详情

     返回的内容主要关心最下面的event

    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  5m48s  default-scheduler  Successfully assigned default/petclinic to minikube
      Normal  Pulling    5m46s  kubelet, minikube  Pulling image "spring2go/spring-petclinic:1.0.0.RELEASE"
      Normal  Pulled     4m20s  kubelet, minikube  Successfully pulled image "spring2go/spring-petclinic:1.0.0.RELEASE" in 1m25.9231182s
      Normal  Created    4m19s  kubelet, minikube  Created container petclinic
      Normal  Started    4m19s  kubelet, minikube  Started container petclinic

    先是调度,抓取镜像(如果没有本地缓存),创建。

    如何访问Pod?

      访问http://localhost:8080/是失败的。

      

       在默认情况下,kubernetes集群中的Pod对外是不可见的,kubernetes集群内部是一个私有环境,有自己的内部网络,外界是不能访问kubernetes内部的。

       端口转发(Port-Forward)

        这种方式仅限于调试测试环境。

    kubectl port-forward petclinic 8080:8080 

      

      这个命令意思是在本机上开启一个8080端口,通过这个端口可以将请求转发到kubernetes集群的内部Pod对应的端口上,前面的8080是主机上的端口,后面的8080是Pod上的端口。执行完之后,刷新http://localhost:8080/就可以访问应用了。

       删除Pod

      

    Pod的实现原理

      

       

  • 相关阅读:
    log日志----logging模块
    配置文件--configparser
    面向对象——进阶
    面向对象
    内置函数
    模块和包
    常用模块
    正则表达式
    递归函数
    内置函数+匿名函数
  • 原文地址:https://www.cnblogs.com/songgj/p/14391619.html
Copyright © 2011-2022 走看看