【k8s 系列】k8s 学习十四,pod 控制器 3

简介: 之前我们学习过的的 docker ,例如我们运行

「这是我参与2022首次更文挑战的第 1 天,活动详情查看:2022首次更文挑战

image.png

简单回顾

之前我们学习过的的 docker ,例如我们运行

docker run busybox echo "hello wrold"

image.png

他的实际内在逻辑是这个样子的

image.png

  • 程序将指令推送给 docker
  • docker 会检查本地是否有 busybox 镜像,若没有则去 docker hub 上面拉取镜像,并下载到本机,再基于这个镜像创建一个 容器
  • 在容器中运行指令 echo “hello wrold”

前面我们也知道了 每一个 pod 或者 docker 容器,都有自己独立的文件系统,进程,用户,主机名和网络接口

简单运行 pod

如果想简单运行一个 pod,我们可以这样做

kubectl run xmtkubia --image=xiaomotong888/xmtkubia --port=8080

xiaomotong888/xmtkubiadockerhub 上面的具体公开的镜像

image.png

pod 中的容器运行位置

我们知道 pod 中可以运行 1 个容器或者多个容器,那么如果 1 个pod 中,运行多个容器,那么这些容器都会运行在同一个工作节点上面吗?

image.png

当一个 pod 中有多个容器的时候,这些容器一定总是运行在同一个工作节点上面的,一个 pod 绝对不会跨越多个工作节点

为什么是 一个 pod 里面跑多个容器,而不是一个容器里面跑多个进程?

在我们学习 docker 和 K8S 的过程中,有没有思考过,为什么需要引入 pod 这个概念,我们一个容器里面设计成跑多个进程不就好了吗?

实际上,容器是被设计成每个容器只能运行一个进程的,当然这个进程在程序中自动开辟的子进程是不包含在内的

  • 如果我们单个容器中运行了多个不相关的进程,那么当同一个容器中别的进程崩溃的时候,便会影响到其他进程
  • 多个进程跑在同一个容器中,如何区分进程在标准输出打印的信息呢,这会很麻烦

提出 pod 其实是一种解决方案

  • 提出 pod 这种结构后,1 个 pod 可以和多个容器绑定在一起
  • 1 个 pod 里面可以同时运行多个进程(即多个容器),并且这行进程能够享有几乎同样的环境
  • 从外部看,这些进程好像是全部运行在单个容器中,实际上这些进程又相互保持一定的隔离

上面这里说到的 pod 中的容器相互间保持的着一定的隔离,而不是完全隔离

这里指的是隔离容器组,而不是单个容器,每个容器组内的容器是可以共享容器组的资源的

容器如何共享 ip 和 端口

同一个 pod 中的容器是运行在相同的 Network 命名空间中的,因此他们对于 ip 地址和端口空间是共享的

那么同一个 pod 下面的容器,配置 端口号的时候就需要注意,不能冲突,例如这样

image.png

在 K8S 中,所有的 pod 都是在同一个网络地址空间中,网络信息他们是共享的

如图,不同 pod  之间是可以通过 ip 直接访问的

image.png

看了以上 pod 的行为,有没有觉得 pod 的行为和实际的虚拟机或者物理机的行为有很多类似的地方,虚拟机里面跑的每一个进程,pod 里面也可以直接跑这些进程,只不过,pod 里面的每一个进程,都被一个容器包裹

所以啊, pod 可以看做是一个逻辑主机

实在的案例

一个应用程序,有前端应用服务器,和 后端的数据库,如果我们需要将这个程序放到 K8S 环境中,我们是启 1 个 pod 还是 2个 pod ?


在 K8S 中是推荐将上述的前端服务器和 后台数据库分开,分成 2 个 pod 去部署,原因有这些:

  • 这样既能够充分利用多个节点的 CPU 和内存,还可以方便我们后续的扩容和缩容
  • 在我们扩缩容的时候,基本单位也是 pod,K8S 中不能对单个容器进行扩缩容
  • 如果将前端和后台都放到同一个pod 中,那么我们扩容或者缩容时候,那么相应的容器将会成倍的增加或减少
  • 前端和后台的扩容缩容也会是完全不同的需求,并不能直接简单粗暴的干就完了

如果我们把上述的前端和后台这样来部署是不推荐的

  • 全部放到同一个 pod 的同一个 容器中
  • 通一个 pod 中部署 2 个容器,分别部署前端和后台

image.png

推荐的做法是

  • 在 2 个 pod 中分别开 1 个容器,各自部署 前端,后台程序

image.png

我们实际工作中面临是否需要在同一个 pod 中启多个容器的时候,我们可以思考一下这样的问题

  • 这些容器放在一起运行是必须的吗?是否可以拆分放在不同的主机上运行
  • 这些程序是代表一个整体?还是相互独立的
  • 对于扩容和锁容,是需要一起进行,还是分别进行?

这些问题,咱们之后可以解决一下

今天就到这里,学习所得,若有偏差,还请斧正


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
10月前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
139 1
|
6月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
201 25
|
10月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
140 0
|
10月前
|
Kubernetes 双11 容器
【赵渝强老师】Kubernetes中的控制器
Kubernetes通过控制器管理Pod的生命周期,以应对不同场景需求,如Deployment、DaemonSet、Job等。控制器可自动调整Pod数量和重启故障Pod,确保系统稳定运行。视频讲解和详细内容见下文。
114 0
|
10月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
6月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
213 12
|
10月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
171 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
10月前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
164 1
|
10月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
308 0
|
10月前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
352 0

推荐镜像

更多