需求:假如一个k8s中的三个服务,login需要能够连接gate和game,那么login服务的K8s yaml怎么定义连接后端的gate和game的service
在 Kubernetes 中定义 login 服务的 YAML 时,需通过 Service 名称实现与 gate 和 game 服务的连接,而非硬编码 IP。
📌 一、核心配置原则
- 服务发现机制
- Kubernetes 通过内置 DNS 自动解析同一 Namespace 下的 Service 名称(如
gate-service)。 login服务只需通过环境变量或代码调用 Service 名称(如http://gate-service:80)即可访问后端服务。
- Kubernetes 通过内置 DNS 自动解析同一 Namespace 下的 Service 名称(如
- 环境变量注入
- 在
login的 Deployment 中通过env字段动态注入gate和game的 Service 地址。
- 在
- 独立 Service 定义
- 为
gate和game分别创建 ClusterIP 类型的 Service,提供稳定的访问端点。
- 为
⚙️ 二、完整 YAML 配置示例
# 1. 定义 gate-service(ClusterIP 类型)
apiVersion: v1
kind: Service
metadata:
name: gate-service # Service 名称,用于 DNS 解析
namespace: game-group-1001 # 与 login 同 Namespace
spec:
selector:
app: gate # 关联 gate 的 Pod 标签
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 8080 # gate 容器的实际端口
---
# 2. 定义 game-service(ClusterIP 类型)
apiVersion: v1
kind: Service
metadata:
name: game-service
namespace: game-group-1001
spec:
selector:
app: game
ports:
- protocol: TCP
port: 80
targetPort: 9090 # game 容器的实际端口
---
# 3. 定义 login 的 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: login-deployment
namespace: game-group-1001
spec:
replicas: 2
selector:
matchLabels:
app: login
template:
metadata:
labels:
app: login
spec:
containers:
- name: login-container
image: your-registry/login:latest
env:
# 注入 gate-service 地址(同 Namespace 可直接用 Service 名)
- name: GATE_SERVICE_URL
value: "http://gate-service"
# 注入 game-service 地址
- name: GAME_SERVICE_URL
value: "http://game-service"
ports:
- containerPort: 8080
# 健康检查(确保服务就绪后才接收流量)
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
🔍 三、关键配置解析
-
Service 定义的作用
gate-service和game-service为后端服务提供 稳定的 DNS 名称(如gate-service.game-group-1001.svc.cluster.local),屏蔽 Pod IP 变化。- 同一 Namespace 内可简写为
http://gate-service。
-
环境变量注入逻辑
GATE_SERVICE_URL和GAME_SERVICE_URL在容器启动时注入,应用代码可直接使用(无需在 Dockerfile 中定义)。- 示例代码(Python):
import os requests.get(os.getenv("GATE_SERVICE_URL") + "/api")
-
健康检查的必要性
readinessProbe:确保login完全启动(如依赖服务连接成功)后才加入 Service 负载均衡池,避免请求失败。livenessProbe:自动重启无响应的容器,提高服务可靠性。
-
跨 Namespace 访问
若gate或game位于其他 Namespace(如infra-gate),需使用 完整 DNS 名称:env: - name: GATE_SERVICE_URL value: "http://gate-service.infra-gate.svc.cluster.local"
⚠️ 四、避免的常见错误
| 错误做法 | 正确替代方案 |
|---|---|
| 在镜像中硬编码 Service IP | 通过环境变量注入 Service 名称 |
| 手动维护 Endpoints 列表 | 用 Service 的 selector 自动关联 Pod |
| 省略健康检查 | 配置 readinessProbe 和 livenessProbe |
💎 总结
- 核心配置:
✅gate/game的 Service 提供 DNS 名称 → 通过env注入到login的 Deployment。
✅ 健康检查保证服务可用性 → 配置readinessProbe和livenessProbe。 - 验证命令:
# 检查 Service 是否正常 kubectl -n game-group-1001 get svc gate-service game-service # 查看 login Pod 的环境变量 kubectl -n game-group-1001 exec <login-pod> -- env | grep SERVICE_URL
此方案通过 Kubernetes 原生服务发现机制,实现服务间解耦和高可用,适应生产环境动态扩展需求。

5706

被折叠的 条评论
为什么被折叠?



