【问题标题】:Have one container access another with helm/Docker使用 helm/Docker 让一个容器访问另一个容器
【发布时间】:2022-01-11 23:24:12
【问题描述】:

上下文

如果我在这里掉进了兔子洞,请告诉我。

我有一个带有前端和后端组件的简单 Web 应用程序,使用 Docker/Helm 部署在 Kubernetes 集群中。前端可通过 nginx 服务,后端组件将运行 NodeJS 微服务。

我一直想在 Docker 内部的同一个 pod 上运行,但是在让 nginx 和 Node 在后台运行时遇到了一些问题。我可以尝试使用一个同时运行两者的启动脚本,但the Internet 说最好让不同的容器分别负责运行一个服务 - 因此一个容器运行 nginx,另一个容器运行微服务。

问题

这很好,但是接下来说 nginx 服务器的 HTML 页面需要知道在后端向什么发送 POST 请求 - HTML 页面如何知道要为后端的 Docker 容器命中哪个 IP?像this one 这样的文章谈到了手动创建一个 Docker 网络以使两个容器相互通信,但是我如何使用 Helm 进行配置,以便前端容器知道每次新容器启动时如何访问后端容器部署,无需每次手动配置任何网络服务?我希望部署自动化。

【问题讨论】:

    标签: docker kubernetes kubernetes-helm helm3


    【解决方案1】:

    你提到你的前端是基于 Nginx 的。

    因此,前端必须点击后端的public URL。

    因此,后端必须通过选择服务类型来暴露,是否:

    • NodePort -> 前端将通过http://<any-node-ip>:<node-port> 与后端通信
    • LoadBalancer -> 前端将通过服务的http://loadbalancer-external-IP:service-port 与后端通信。
    • 或者,保留它 ClusterIP,但在其上添加 Ingress 资源 -> 前端将通过其入口主机 http://ingress.host.com 与后端通信。

    我们推荐最后一种方式,但它需要有入口控制器。

    一旦您测试了其中一个并且它可以工作,那么您可以扩展您的 helm chart 以更新服务并在需要时添加入口资源

    【讨论】:

    • 所以在这些场景中,听起来前端命中的位置必须是硬编码的?有没有办法在部署时根据主机名/节点端口/入口位置动态生成 HTML?
    【解决方案2】:

    您可以尝试在一个 pod 中设置两个容器,然后通过 localhost 在容器之间进行通信(但在不同的端口上!)。很好的例子在这里 - Kubernetes multi-container pods and container communication

    另一种选择是创建两个单独的部署并为每个部署创建服务。不要使用 IP 地址(每次重新部署应用程序时都不会相同),而是使用 a DNS name 来连接它们。

    示例 - 两个 NGINX 服务通信。

    首先创建两个 NGINX 部署:

    kubectl create deployment nginx-one --image=nginx --replicas=3
    kubectl create deployment nginx-two --image=nginx --replicas=3
    

    让我们使用kubectl expose command 公开它们。如果我从 yaml 文件创建服务也是一样的:

    kubectl expose deployment nginx-one --name=my-service-one --port=80
    kubectl expose deployment nginx-two --name=my-service-two --port=80
    

    现在让我们检查一下服务 - 你可以看到它们都是 ClusterIP 类型:

    user@shell:~$ kubectl get svc
    NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    kubernetes       ClusterIP   10.36.0.1      <none>        443/TCP   66d
    my-service-one   ClusterIP   10.36.6.59     <none>        80/TCP    60s
    my-service-two   ClusterIP   10.36.15.120   <none>        80/TCP    59s
    

    will exec into podnginx-one部署和curl第二个服务:

    user@shell:~$ kubectl exec -it nginx-one-5869965455-44cwm -- sh 
    # curl my-service-two
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    

    如果您遇到问题,请确保为您的集群安装了正确的 CNI plugin - 另请查看这篇文章 - Cluster Networking 了解更多详细信息。

    还要检查这些:

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 2019-06-13
      • 2021-12-23
      • 2021-03-04
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      相关资源
      最近更新 更多