使用 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 以获取更多详细信息。
同时检查这些:
- My similar answer 但有更广泛的解释 + 两个名称空间之间的通信示例。
- Access Services Running on Clusters | Kubernetes
- Service | Kubernetes
- Debug Services | Kubernetes
- DNS for Services and Pods | Kubernetes
上下文
如果我在这里掉进了兔子洞,请告诉我。
我有一个带有前端和后端组件的简单 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 以获取更多详细信息。
同时检查这些:
- My similar answer 但有更广泛的解释 + 两个名称空间之间的通信示例。
- Access Services Running on Clusters | Kubernetes
- Service | Kubernetes
- Debug Services | Kubernetes
- DNS for Services and Pods | Kubernetes