pod分类

        自主式pod

        控制器管理的pod

Pod是kubernetes中最小的调度单位,可以把他理解成在集群上运行的进程。

Pod里面可以运行单个容器或者运行多个需要协同工作的容器。

Pod运行在一个Worker Node中,这个Worker Node可以是物理机,也可以是虚拟机。

一个Worker Node中可能会有很多个Pod同时运行。

多个Pod可以协同工作。

在Pod中,有一个容器叫pause,这个是当前pod中所有容器的父容器,也叫基础容器。

当一个pod启动的时候pause必然启动。

pod与pod是隔离的

pod中容器共享pause的网络和存储空间

        解释:

                比如下图一个pod中的两个容器,如果想用ng代理php,不需要些php的ip,直接localhost就可以访问,所以pod中的容器千万不能是同一个端口。

pause启用PID的命名空间,pause的PID为1。

pause负责Pod中的容器的健康检查。

如果我们在Pod中部署两个容器,分别叫Container1和Container2。

那么Container1和Container2就会共享pause容器的网络栈,他们之间的通讯就会更快

podman openeuler 容器_数据

Controller Manager是kubernetes高可用的保证,它也是pod运行的关键。

                其主要实现组件为replication controller(RC)/replecaset/deployment

                RC用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来代替;如果异常多出来的容器也会自动回收,在新版本中抛弃RC,使用replicaset取代RC。

                replicaset和RC本质上没有区别,只是名字不同,而replicaset多了一点就是支持集合式的selector(服务选择准确的说是叫label selector)

                一般我们在部署pod的时候会给其打上标签比如:name:app,version:v1.0.0,那么replicaset在保证pod数量的时候就可以使用lanel selector来筛选。

                deployment,我们在实际使用的时候,虽然relicaset可以独立使用,但是建议还是使用deployment来自动管理replicaset,这样就可以避免跟其他机制的不兼容问题,比如replicaset不支持滚动更新 rolling-update,而deployment支持。

                hpa(horizontalpodautoscale),平滑扩展,仅适用于rs和deployment,在v1的时候仅支持cpu利用率的扩展,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容。

                statefulset是为了解决有状态服务的问题而relicaset和deployment是为了无状态服务而设计的,所谓的有无装状态就是看服务是否需要做持久化存储,比如mysql就是有状态的,而apache服务就是无状态的,statefulset解决了如下问题:

                        1.稳定持久的存储,即pod重启后还能回到重启之前的状态。

                        2.稳定的网络标识,比如pod重启后的name和hostname不变。基于headless service(即没有cluster ip的service)来实现。

                        3.有序部署,比如我们需要按mysql、redis、服务的顺序来启动。

                        4.有序收缩和删除

                daemset:确保全部或者某一些node上运行一个pod的副本,当node加入集群会创建pod当node退出时也会回收pod。当删除daemset被删除,那它管理的pod也会被全部删除。      

                        典型场景:比如日志收集,固定的node上都要有,再比如监控。

                job:负责批处理任务的成功执行,比如:执行定时清理数据库,如果时cron直接执行它没法保证其一定成功,使用job可以保证其如果失败可以重新运行。

为什么要有pod概念  

        直接部署一个容器可能会更加容易,每个容器都有不同的配置和功能,k8s需要对这些容器进行管理(重启、检测等),那么为了避免在容器这个实体上增加更多的属性,就产生了pod这个概念。

        并且,Pod中的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume,这样既简化了密切关联的业务容器的通信问题,也很好的解决了它们之间的文件共享问题。

        pod可以由一个或多个容器组合而成,也就是说, 在创建pod时可以给一个pod配置多个container,一般情况下,建议将应用紧耦合的容器打包为一个pod,原则上一个容器一个进程。

共享Volume

        Volume(存储卷)Volume是Pod中能够被多个容器共享的磁盘目录。我们知道,默认情况下Docker容器中的数据都是非持久化的,在容器消亡后数据也会消失。因此Docker提供了Volume机制以便实现数据的持久化。Kubernetes中Volume的概念与Docker中的Volume类似,但不完全相同。

        同一个pod中的多个容器能够共享pod级别的存储卷Volume,多个容器各自挂载,将一个volume挂载为容器内部需要的目录。

Kubernetes提供了非常丰富的Volume类型:

    emptyDir:临时空间,Pod分配到Node时创建,无须指定宿主主机上对应的目录,在Kubernetes会自动分配当前Node的一个目录,当Pod被移除时,emptyDir中的数据也会永久删除。
    hostPath:为Pod挂载宿主主机上的文件或目录。用于数据永久保存。在不同的Node上具有相同配置的Pod,可能会因为宿主机上的目录和文件不同而导致Volume上的目录和文件的访问结果不一致。
    gcePersistentDisk:使用谷歌公有云提供的永久磁盘。数据永久保存。
    NFS:NFS 是 Network File System 的缩写,即网络文件系统。Kubernetes 中通过简单地配置就可以挂载 NFS 到 Pod 中,而 NFS 中的数据是可以永久保存的,同时 NFS 支持同时写操作。k8s挂载NFS

Persistent Volume:简称PV,就是网盘,网络存储,不属于任何Node,但可以在每个Node上访问。

Pod通信

k8s为每个pod都分配了唯一的IP地址,称之为pod IP,一个pod中的多个容器共享Pod IP地址,属于同一个pod的多个应用之间相互访问时仅通过localhost就可以通信。

k8s底层支持集群内任意两个pod之间的TCP/IP直接通信,因此,在k8s中,一个pod中的容器可以与另外主机上的pod里的容器直接通信