使用 helm/Docker 让一个容器访问另一个容器

Have one container access another with helm/Docker

上下文

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

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

我一直在考虑将 运行 放在 Docker 内的同一个 pod 上,但是 运行 在将 nginx 和 Node 都设置为 运行 时遇到了一些问题背景。我可以尝试使用一个 运行 两者都包含的启动脚本,但是 the Internet 说最好的做法是让不同的容器每个只负责 运行 一项服务 - 所以一个容器到 运行 nginx 和另一个 运行 微服务。

问题

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

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

因此,前端必须命中后端的publicURL

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

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

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

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

您可以尝试在一个 pod 中设置两个容器,然后通过本地主机(但在不同的端口!)在容器之间进行通信。很好的例子在这里 - 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 pod 来自 nginx-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 installed for your cluster - also check this article - Cluster Networking 以获取更多详细信息。

同时检查这些: