• 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技能
    
    
    十年磨一剑
  • 相关阅读:
    Mysql 怎么限制 IP 访问?
    LA2965 n个数中选出最多个数异或和为0
    UVALive 2678 大于s的最短子序列和
    UVA 1193 区间相关(greedy)
    UVA 11992 线段树
    UVA 1400 线段树
    NBUT 1120 线段树
    最大连续区间和的算法总结(转)
    hiho 1015 KMP
    hiho#1128 : 二分·二分查找
  • 原文地址:https://www.cnblogs.com/qinlulu/p/14671425.html
Copyright © 2020-2023  润新知