Kubernetes容器之间的通信浅谈
公众号关注 「开源Linux」
回复「学习」,有我为您特别筛选的学习资料~
作者: Matt Zand 和 Jim Sullivan
译者: 穿过生命散发芬芳F
Kubernetes是一个容器化的解决方案。它提供了称为Pods的虚拟化运行环境,该环境容纳一个或多个容器以提供虚拟运行环境。Kubernetes的一个重要方面是Pod内的容器间通信。此外,管理Kubernetes网络的一个重要领域是在内部和外部转发容器端口,以确保Pod中的容器之间能够正确通信。为了管理此类通信,Kubernetes提供以下四种联网模型:
容器到容器通信
Pod到Pod通信
Pod到Service通信
外部到内部通信
在本文中,我们向您展示了Pod中容器之间的联网和通信方式,从而深入探讨容器与容器之间的通信。
一个Pod中容器之间的通信
在单个Pod中拥有多个容器,使它们彼此之间进行通信变得相对简单。他们可以使用几种不同的方法来做到这一点。在本文中,我们将详细讨论两种方法:i-共享卷和ii-进程间通信。
1、 一个Kubernetes Pod中的共享卷
在Kubernetes中,您可以使用共享的Kubernetes卷作为在Pod中的容器之间共享数据的简单有效的方法。在大多数情况下,使用主机上与Pod中所有容器共享的目录就足够了。
Kubernetes Volumes使数据能够在容器重启后依然存在,但是这些卷具有与Pod相同的生命周期。这意味着卷(及其存储的数据)与Pod存在的时间完全一样。如果出于任何原因删除了该Pod,即使创建了相同的替换,共享卷也将被破坏并从头开始创建。
具有共享卷的多容器Pod的标准用例是,当一个容器将日志或其他文件写入共享目录,而另一个容器从共享目录读取。例如,我们可以像这样创建一个Pod:
apiVersion: v1
kind: Pod
metadata:
name: mc1
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: 1st
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: 2nd
image: debian
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do
date >> /html/index.html;
sleep 1;
done
在此示例中,我们定义了一个名为html的卷。它的类型为emptyDir,这意味着该卷是在将Pod分配给节点时首次创建的,并且只要该Pod在该节点上运行就存在。顾名思义,它最初是空的。第一个容器运行Nginx服务,并将共享卷挂载到目录/ usr / share / nginx / html。第二个容器使用Debian映像,并将共享卷安装到目录/ html。第二个容器每秒将当前日期和时间添加到共享卷中的index.html文件中。当用户向Pod发出HTTP请求时,Nginx服务器将读取此文件并将其传输给用户以响应该请求。
你可以通过暴露nginx端口并使用浏览器访问它,或直接在容器中检查共享目录来检查Pod是否正常工作:
$ kubectl exec mc1 -c 1st -- /bin/cat /usr/share/nginx/html/index.html
...
$ kubectl exec mc1 -c 2nd -- /bin/cat /html/index.html
...
2、进程间通信(IPC)
Pod中的容器共享相同的IPC命名空间,这意味着它们还可以使用标准的进程间通信(例如SystemV信号量或POSIX共享内存)相互通信。容器使用本地主机名的策略在Pod中进行通信。
在下面的示例中,我们定义了一个具有两个容器的Pod。两者都使用相同的Docker映像。第一个容器是生产者,它创建一个标准的Linux消息队列,写一些随机消息,然后写一个特殊的退出消息。第二个容器是使用者,它打开相同的消息队列以进行读取并读取消息,直到接收到退出消息为止。我们还将重启策略设置为“从不”,因此在两个容器终止后,Pod停止。
apiVersion: v1
kind: Pod
metadata:
name: mc2
spec:
containers:
- name: producer
image: allingeek/ch6_ipc
command: ["./ipc", "-producer"]
- name: consumer
image: allingeek/ch6_ipc
command: ["./ipc", "-consumer"]
restartPolicy: Never
要检查这一点,请使用kubectl create创建pod并观察Pod的状态:
$ kubectl get pods --show-all -w
NAME READY STATUS RESTARTS AGE
mc2 0/2 Pending 0 0s
mc2 0/2 ContainerCreating 0 0s
mc2 0/2 Completed 0 29
现在,您可以检查每个容器的日志,并验证第二个容器是否收到了第一个容器的所有消息,包括退出消息:
$ kubectl logs mc2 -c producer
...
Produced: f4Produced: 1d
Produced: 9eProduced: 27$
kubectl logs mc2 -c consumer
...
Consumed: f4
Consumed: 1d
Consumed: 9e
Consumed: 27
Consumed: done
但是,此Pod存在一个主要问题,它与容器的启动方式有关。
结论
Pods可以具有多个容器的主要原因是为了支持辅助主应用程序的帮助应用程序。辅助应用程序的典型示例是数据提取器,数据推送器和代理。这种模式的一个示例是带有帮助程序的Web服务器,该程序轮询git存储库以获取新更新。
本实验中的”卷”为在Pod的使用期内容器之间通信提供了一种方法。如果删除并重新创建Pod,则共享卷中存储的所有数据都会丢失。在本文中,我们还讨论了Pod中容器之间的进程间通信的概念,它是共享卷概念的替代方法。现在,您了解了Pod中的容器如何通信和交换数据,接下来可以继续学习其他Kubernetes网络模型,例如Pod到Pod或Pod到Service的通信。
关注「开源Linux」加星标,提升IT技能
Kubernetes容器之间的通信浅谈的更多相关文章
- MQ服务器端和客户端通信浅谈
MQ服务器端和客户端通信浅谈 1. WebSphere MQ的服务端的安装和配置 (1)创建名为venus.queue.manager的默认队列管理器. 在DOS窗口命令提示符下,输入以下命令: cr ...
- docker容器之间的通信
容器之间互通 新建两个容器 docker run -d --name box1 busybox /bin/sh -c "while true;do sleep 3600;done" ...
- Docker跨主机容器之间的通信macvlan
找两台测试机: [root@docker1 centos_zabbix]# docker network ls NETWORK ID NAME DRIVER SCOPE 19ac9a55bedb br ...
- Docker怎么实现容器之间的通信?
//TODO 参考资料: https://developer.aliyun.com/article/55912 https://blog.csdn.net/u011541946/article/det ...
- docker - win7下构建swarm nodes实现跨host的容器之间的通信
前言 之前在Linux环境下尝试了swarm,通过将不同host以swarm nodes 的方式连接到一起(构建Overlay 子网),从而实现跨host的container通信. 今天我们就来说说如 ...
- Docker: Docker容器之间互相通信
最简单的方法,关闭防火墙(只建议用于开发环境) systemctl stop firewalld
- 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信
官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...
- Docker-Docker容器跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...
- laravle6.0-IOC-DI浅谈
1.什么是IOC,DI IOC(Inversion of Control)控制反转:ioc意味着,你将自己设计好的对象交给容器来控制,而不是传统的在你的对象内部直接控制.比如: 人 操控 手机 做一些 ...
随机推荐
- swagger-ui提交请求无name(指input中的name属性)值
swagger-ui提交请求,请求不包含name值,造成后台无法进行接受参数. @Operation(description = "上传文件",tags = "上传&qu ...
- java-設計模式-工場方法
工廠方法: 一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中. 这满足创建型 ...
- mac终端所有命令不能用
最近一次在用终端敲命令的时候发现命令总是不执行(只有cd命令可以正常执行),返回命令未识别的错误-bash: source: command not found 相信很多朋友也会遇到类似的问题. 解决 ...
- 手把手教你学vue-4(vuex)
1.首先明白vuex是做什么用的. 管理统一组件状态state.每个应用将仅仅包含一个 store 实例.单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态 ...
- java堆排序
直接贴源代码: package com.java.fmd; import java.util.Scanner; public class HeapSort { int[] arr; public st ...
- rabitmq 登录报错:User can only log in via localhost
安装教程参考:https://blog.csdn.net/qq_43672652/article/details/107349063 修改了配置文件仍然报错,无法登录.解决办法:新建一个用户登录: 查 ...
- EMS创建独立新用户并分配邮箱
创建新用户"王春海"并分配邮箱. 以Exchange管理员身份登录EMS控制台.在PowerShell命令行提示符下,键入如下命令: [PS] C:\Windows\system3 ...
- Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件
1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...
- 《头号玩家》AI电影调研报告(三)
[AR市场正在迅猛增长] 据<工业增强现实现状2017>报告中所述,AR不再只是值得期待的新兴技术.2018年,投资此类技术已成为很多组织机构的关键战略,尤其是对于涉及复杂的制造和运营流程 ...
- MySQL 社区版
MySQL 社区版 MySQL 社区版是全球广受欢迎的开源数据库的免费下载版本.它遵循 GPL 许可协议,由庞大.活跃的开源开发人员社区提供支持. MySQL 社区版包括: 可插拔的存储引擎架构 多种 ...