k8s-2:pod

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容器的网络栈,他们之间的通讯就会更快

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里的容器直接通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将正在 k8s-node1 节点上运行的名为 apache-podpod 扩容到 k8s-node2 节点,并同时在这两个节点上运行 pod,请按照以下步骤操作: 1. 创建一个 deployment,指定 pod 的副本数为 2,并使用 nodeSelector 将这两个 pod 分别调度到 k8s-node1 和 k8s-node2 节点上。可以使用以下 YAML 文件创建 deployment: ``` apiVersion: apps/v1 kind: Deployment metadata: name: apache-pod spec: replicas: 2 selector: matchLabels: app: apache-pod template: metadata: labels: app: apache-pod spec: nodeSelector: kubernetes.io/hostname: k8s-node1 containers: - name: apache-container image: httpd:latest ports: - containerPort: 80 ``` 在这个 YAML 文件,我们使用 nodeSelector 将第一个 pod 调度到 k8s-node1 节点上,第二个 pod 调度到 k8s-node2 节点上。注意,我们在 template.spec.containers 指定了容器的镜像和端口号,这里使用的是 httpd 镜像,端口号是 80。 2. 使用 kubectl apply 命令应用这个 YAML 文件: ``` kubectl apply -f deployment.yaml ``` 3. 使用 kubectl get pods 命令检查 pod 状态,确认这两个 pod 都在运行: ``` kubectl get pods -o wide ``` 在输出,你会看到两个 apache-pod 的副本都在运行,其一个在 k8s-node1 节点上,另一个在 k8s-node2 节点上。 需要注意的是,使用 nodeSelector 指定 pod 调度到特定节点上可能会降低集群的灵活性,因为这样做会使节点的资源分配不均衡。如果你的集群有多个节点,最好使用 Kubernetes 的调度器来自动地将 pod 调度到空闲节点上。你可以使用 nodeAffinity 和 podAntiAffinity 等特性来控制 pod 的调度行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值