如何通过Helm/Docker配置K8s集群前后端容器自动化互访?
配置方案
你的思路符合容器使用最佳实践,单容器运行单进程可以降低运维复杂度、提高故障隔离能力,无需为了同时运行两个进程单独编写启动脚本。
针对你提出的前端自动发现后端地址的需求,基于Kubernetes和Helm的原生能力即可实现,无需手动配置Docker网络,具体操作如下:
- 借助Kubernetes原生服务发现能力
你只需要为后端NodeJS微服务创建一个ClusterIP类型的Service(集群内部访问的默认Service类型),Kubernetes内置的CoreDNS组件会自动为该Service生成可在集群内部解析的域名,域名规则为{Service名称}.{命名空间}.svc.cluster.local,同一命名空间下直接用Service名称即可访问。
比如你将后端Service命名为node-backend,配置暴露端口为3000,集群内任意容器都可以直接通过http://node-backend:3000访问后端服务,完全不需要感知后端Pod的实际IP变动。 - 通过Helm实现自动化配置注入
你可以把后端服务的访问地址作为可配置参数存放在Helm的values.yaml文件中,部署时自动注入到前端容器:- 在
values.yaml中配置后端服务参数:
backend: serviceName: node-backend servicePort: 3000- 在前端的Deployment配置中,将后端地址作为环境变量注入Nginx容器:
containers: - name: nginx-frontend image: nginx:stable-alpine env: - name: BACKEND_API_BASE value: "http://{{ .Values.backend.serviceName }}:{{ .Values.backend.servicePort }}"- 如果前端静态文件(HTML/JS)中需要写死后端地址,你可以在Nginx容器的启动命令中增加占位符替换逻辑,启动Nginx前将静态文件中的预设占位符替换为环境变量中的后端地址即可:
sed -i "s|{{BACKEND_API_PLACEHOLDER}}|$BACKEND_API_BASE|g" /usr/share/nginx/html/**/*.js && nginx -g 'daemon off;' - 在
- 更简化的无感知适配方案
你还可以通过Ingress配置路径分流:将/api/*路径的请求转发到后端Service,其余所有路径转发到前端Nginx Service。这种情况下前端直接使用/api/xxx的相对路径发请求即可,完全不需要关心后端服务的地址,适配性更强。
内容的提问来源于stack exchange,提问作者A. Duff
相关产品推荐
相关产品推荐

