多容器POD及Kubernetes容器通信

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器通常是为了解决一个单一的、特定的问题;如微服务,但在现实世界中,通常需要多个容器,来实现一个完整的解决方案。在这篇文章中,我们将谈论结合多个容器集成进单一的Kubernetes节点,即容器互联通信。

容器通常是为了解决一个单一的、特定的问题;如微服务,但在现实世界中,通常需要多个容器,来实现一个完整的解决方案。在这篇文章中,我们将谈论结合多个容器集成进单一的Kubernetes节点,即容器互联通信。


什么是Kubernetes节点?

首先让我们解释一下容器节点是什么。容器节点即POD,它是可以由Kubernetes部署和管理的最小单位。换句话说,如果你需要运行在Kubernetes的一个容器,你需要创建一个POD。同时,一个POD可以容纳多个容器,通常是因为这些容器是相对紧密耦合的。如何紧密耦合?好吧,这样想:POD中的容器代表了原来在同一物理服务器上运行的进程。
这是有道理的。因为在许多方面,一个POD就像一台服务器。例如,每个容器可以访问在POD其他容器,就像访问本地主机上的不同端口。

Kubernetes为什么将POD作为最小的可部署单元,而不是一个单一的容器?

虽然直接部署单个容器似乎比较简单,但是有充分的理由需要添加一个由POD表示的抽象层。容器是一个实体,它指一个特定的事物。这个具体的事物可能Docker容器,但它也可能是一个rkt的容器,或由virtlet管理的虚拟机。每一种都有不同的要求。

更重要的是,Kubernetes需要更多的信息来管理一个容器,如重新启动策略,它定义了当容器终止时,或活性的探针时,进行哪些动作;从应用程序的角度,它定义了检测动作,判断容器进程是否还活着,如Web服务器响应HTTP请求。

区别于在现有的“实体”上超载附加属性,Kubernetes决定使用一个新的实体,POD。POD可以被认为是逻辑容器,包含一个或多个容器(包装),作为一个单一的实体被管理。

Kubernetes为什么让一个POD里放置多个容器?

POD中的容器运行在“逻辑主机”上;它们使用相同的网络namespace(换句话说,相同的IP地址和端口空间),以及相同的IPC名称空间。它们还可以使用共享卷。这些属性使得这些容器能够有效地通信,确保数据本地化。此外,POD使您可以以一个单元的模式管理几个紧密耦合的应用程序容器。

如果应用程序需要在同一主机上运行多个容器,为什么不将单个容器与所需的所有内容组合起来呢?首先,这样做很可能违反“一个容器一个进程”的原则。这很重要,因为同一个容器中有多个过程,系统将很难排错。因为来自不同过程的日志将被混合在一起,很难管理进程的生命周期,例如当父进程死亡后处理“僵尸”的过程。其次,一个应用程序使用多个容器将使系统更简单、更透明,并能使软件依赖关系解耦。同时,更精细颗粒的容器可以在团队之间重复使用。

多容器POD的用例

多容器POD的主要用途是支持主要应用程序的共定位、共管辅助进程。在POD中使用辅助进程,有一些通用的模式:

●跨斗容器“帮助”主容器。示例包括日志或数据更改监视程序、监视适配器等。例如,日志监视程序可以由一个团队创建一次,并在不同的应用程序中重用。另一个例子,一个跨斗容器是一个文件或数据装载器,为主容器生成数据。

●代理、网桥和适配器将主容器与外部世界连接起来。例如,Apache HTTP服务器或Nginx可以提供静态文件。它还可以充当主容器中Web应用程序的反向代理,以记录和限制HTTP请求。另一个例子是辅助容器,它将请求从主容器路由到外部网络。这使得主容器可以连接到本地主机访问,例如,外部数据库,但不需任何的服务发现。

虽然你可以在单个POD中托管多层应用程序(如WordPress),但推荐的方法是为每个层使用单独的POD,原因很简单,你可以独立地扩展每层,并将它们分布在集群节点上。

Pod中容器间的通信

在一个POD中有多个容器,使它们相对简单地进行通信。他们可以用几种不同的方法做这件事。

在Kubernetes Pod中共享卷

在Kubernetes,你可以使用一个共享的Kubernetes卷作为一种简单而有效的方式,在一个POD内容器间进行数据共享。在大多数情况下,在主机上使用与容器内所有容器共享的目录,是足够的。

Kubernetes卷数据支持容器重启,但这些卷与POD寿命一样。这意味着卷容量(所拥有的数据)和POD存在时间一样。如果那个POD被删除,即使同类更换创建,共享卷被销毁和创建。

一个使用共享卷的标准多容器POD的用例是,在一个容器写日志和其他文件到共享目录中,其他容器从这个共享目录中可以读取数据。例如,我们可以创建一个POD:

在这个例子中,我们定义了一个名为HTML的卷。它的类型是emptyDir,这意味着当一个POD被分配到一个节点时,卷先被创建,并只要Pod在节点上运行时,这个卷仍存在。正如名字所说,它最初是空的。第一容器运行nginx的服务器并将共享卷挂载到目录/ usr /share/ Nginx /HTML。第二容器使用Debian的镜像,并将共享卷挂载到目录/HTML。每一秒,第二容器添加当前日期和时间到index.html文件中,它位于共享卷。当用户发出一个HTTP请求到POD,nginx的服务器读取该文件并将其传递给响应请求的用户。

你可以检查一下,POD可以通过暴露nginx端口并使用您的浏览器访问它,或通过直接检查容器中的共享目录:

进程间通信(IPC)

一个POD里的容器共享相同的IPC命名空间,这意味着他们也可以互相使用标准进程间通信,如SystemV信号系统或POSIX共享内存。

在下面的示例中,我们定义了一个带有两个容器的POD。我们使用相同的容器镜像。第一个容器,生产者,创建一个标准的Linux消息队列,写一些随机消息,然后写一个特殊的退出消息。第二个容器,消费者,打开相同的消息队列以便读取和读取消息,直到接收到退出消息。我们还将重启策略设置为“从不”,所以只有在两个容器都终止后POD停止。

为了验证这一点,使用kubectl 创建POD,并观察POD状态:

现在您可以检查每个容器的日志,并验证第二个容器接收了来自第一个容器的所有消息,包括退出消息:

不过,这个POD有一个主要问题,它与容器的启动有关。

容器依赖项和启动顺序

目前,POD中的所有容器都是并行启动的,没有办法定义一个容器必须在其他容器之后启动。例如,在IPC示例中,第二个容器可能在第一个容器启动之前已经结束,并创建了消息队列。在这种情况下,第二个容器将失败,因为它期望消息队列已经存在。

一些方案提供某种程度的对容器启动控制,如Kubernetes初始化容器,开始第一次(依次),正在开发中,但在云的原生环境,最好准备好直接控制之外的失败的应对计划。例如,解决此问题的一种方法是更改应用程序以等待创建消息队列。

容器间网络通信

一个POD里的容器都可以通过“localhost”访问;他们使用相同的网络名称空间。另外,对于容器,可观察的主机名是POD的名称。因为容器共享相同的IP地址和端口空间,所以您应该在容器中使用不同的端口来进行连接。换句话说,POD中的应用程序必须协调端口的使用。

在下面的例子中,我们将创建一个多容器的POD,nginx运行在POD一个容器中作为反向代理,为另一个运行一个简单的Web应用程序中的第二容器提供支持。

步骤1、用nginx的配置文件创建一个configmap。通过HTTP端口80输入的请求将被转发到本地端口5000去:

步骤2、创建一个多容器POD,其上运行2个容器,分别运行简单的Web应用程序和Nginx。注意,POD,我们只定义了Nginx的端口80。端口5000不能被POD外部访问。

步骤3、使用nodeport服务来暴露POD:

步骤4、标识并转发给POD节点上的端口:

现在,您可以使用浏览器(或curl)导航到节点的端口,通过反向代理访问Web应用程序,如:

http://myhost:31418

这个请求将被转发到webapp容器的5000端口。

在一个POD中暴露多个容器

虽然这个示例展示了如何使用单个容器访问POD中的其他容器,但在一个POD中的几个容器在POD不同的端口上侦听是很常见的——所有这些端口都需要公开。要做到这一点,你可以创建一个多端口暴露的服务,或者你可以为每一个想暴露的端口创建一个单一的服务。

本文转自中文社区-多容器POD及Kubernetes容器通信

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
24天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
27天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
190 77
|
14天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
79 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
25天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
11天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
4天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
26天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
68 12
|
2月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
49 1
|
存储 Kubernetes 监控
为容器和 Kubernetes 构建应用程序的7个最佳实践
为容器和 Kubernetes 构建应用程序的7个最佳实践
153 0

相关产品

  • 容器服务Kubernetes版