本文将展示如何使用共享卷(Volume)来实现相同Pod中的两个容器间通信。

注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同。

0x00 准备工作

需要有一个K8S集群,并且配置好了kubectl命令行工具来与集群通信。如果未准备好集群,那么你可以使用Minikube创建一个K8S集群,或者你也可以使用下面K8S环境二者之一:

如果需要查看K8S版本信息,可以输入指令kubectl version

0x01 创建一个运行两个容器的Pod

在本节中,我们会创建一个运行了两个容器的Pod。这两个容器共享了一个可以用于二者间通信的卷。下面是该Pod的配置文件:

apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec: restartPolicy: Never volumes:
- name: shared-data
emptyDir: {} containers: - name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html - name: debian-container
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

在该配置文件中,可以看到该Pod拥有一个名为shared-data的卷。

在该配置文件中,第一个容器运行了一个nginx服务器,共享卷在该容器中的挂载路径为/usr/share/nginx/html。第二个容器基于debian镜像,共享卷在该容器中的挂载路径为/pod-data。此外,第二个人容器运行了以下命令,然后终止。

echo Hello from the debian container > /pod-data/index.html

注意,第二个容器在nginx服务器根目录下创建了index.html文件。

创建Pod和两个容器:

kubectl create -f https://k8s.io/docs/tasks/access-application-cluster/two-container-pod.yaml

查看关于该Pod和容器的信息:

kubectl get pod two-containers --output=yaml

下面是部分输出结果:

apiVersion: v1
kind: Pod
metadata:
...
name: two-containers
namespace: default
...
spec:
...
containerStatuses: - containerID: docker://c1d8abd1 ...
image: debian
...
lastState:
terminated:
...
name: debian-container
... - containerID: docker://96c1ff2c5bb ...
image: nginx
...
name: nginx-container
...
state:
running:
...

可以看到,debian容器已经终止了,而nginx容器则仍在运行。

获取一个nginx容器的shell:

kubectl exec -it two-containers -c nginx-container -- /bin/bash

在该shell中,我们验证了nginx仍在运行:

root@two-containers:/# apt-get update
root@two-containers:/# apt-get install curl procps
root@two-containers:/# ps aux

输出结果类似如下:

USER       PID  ...  STAT START   TIME COMMAND
root 1 ... Ss 21:12 0:00 nginx: master process nginx -g daemon off;

前面debian容器在nginx的根目录下创建了index.html文件,下面指令使用curl向nginx服务器发送一个GET请求:

root@two-containers:/# curl localhost

输出结果显示,nginx服务器返回了debian容器创建的那个web页面:

Hello from the debian container

0x02 总结

Pod中之所以能够包含多个容器,其主要原因是为了支持辅助主程序的辅助程序。辅助程序的经典例子是数据拉取器、数据推送器和代理。辅助程序与主程序间经常需要通信,通常情况下是通过一个共享文件系统来实现的,正如本文中展示的那样;或者,通过环回网络接口localhost。这种方式的一个例子是Web服务器,以及与之配套的拉取Git仓库更新的辅助程序。

本文中的共享卷提供了一种在Pod生命周期内实现容器间通信的方式。如果该Pod被删除并重建,那么共享卷中的任何数据都将会丢失。

*英文原文:https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/ *

【K8S学习笔记】Part3:同一Pod中多个容器间使用共享卷进行通信的更多相关文章

  1. K8S学习笔记之Pod的Volume emptyDir和hostPath

    0x00 Volume的类型 Volume是Kubernetes Pod中多个容器访问的共享目录. Volume被定义在Pod上,被这个Pod里的多个容器挂在到相同或不同的路径下. Volume的生命 ...

  2. 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像

    本文将介绍如何使用kubectl列举K8S集群中运行的Pod内的容器镜像. 注意:本文针对K8S的版本号为v1.9,其他版本可能会有少许不同. 0x00 准备工作 需要有一个K8S集群,并且配置好了k ...

  3. 【K8s学习笔记】K8s是如何部署应用的?

    本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...

  4. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  5. k8s 学习笔记

    常用的kubectl命令   kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1   --image 指定镜像 - ...

  6. ASP.NET Core微服务 on K8S学习笔记(第一章:详解基本对象及服务发现)

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 任务2:Labels and Selectors 所有资源对 ...

  7. Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)

    上一篇,我们学习了各种工作负载的使用,工作负载它会自动帮我们完成Pod的调度和部署,但有时我们需要自己定义Pod的调度策略,这个时候该怎么办呢?今天我们就来看一下如何定义Pod调度策略. 一.Node ...

  8. k8s学习笔记之六:Pod控制器(kube-controller-manager)

    第一章.什么是kube-controller-manager? Controller Manager 由 kube-controller-manager 和 cloud-controller-mana ...

  9. k8s学习笔记之五:Pod资源清单spec字段常用字段及含义

    第一章.前言 在上一篇博客中,我们大致简述了一般情况下资源清单的格式,以及如何获得清单配置的命令帮助,下面我们再讲解下清单中spec字段中比较常见的字段及其含义 第二章.常用字段讲解 spec.con ...

随机推荐

  1. 6.关键字static

    在java中并不存在全局变量的概念,但是我们可以通过static关键字来实现一个“为全局”的概念,在java中static表示“全局”和“静态”的意思,他可以用来修饰成员变量和方法,也可以用来修饰代码 ...

  2. 深入探讨 Java 类加载器(转)

    原帖地址:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要 ...

  3. 1.mysql安装

    Navicat账号:root 密码:weihu 账号:weihu 密码:weihu 1.首先进入的是安装引导界面 2.然后进入的是类型选择界面,这里有3个类型:Typical(典型).Complete ...

  4. 1.Django入门

    MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...

  5. 拟物设计和Angular的实现 - Material Design

    Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...

  6. 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

    参考:台大李宏毅老师视频课程-Keras-Demo 在载入数据阶段报错: ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接 Google之 ...

  7. IO模型 IO多路复用

    阻塞IO 用socket 一定会用到accept recv recvfrom这些方法正常情况下 accept recv recvfrom都是阻塞的 非阻塞IO 如果setblocking(False) ...

  8. SpringBoot2 使用Spring Session集群

    有几种办法: 1.扩展指定server利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/Jetty等Serv ...

  9. 微服务统一登陆认证怎么做?JWT ?

    无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...

  10. spring cloud学习(四) 动态路由

    Zuul的主要功能是路由和过滤器.路由功能是微服务的一部分,zuul实现了负载均衡. 1.1 新建模块zuul pom.xml <?xml version="1.0" enc ...