k8s内部service的调用

需求:假如一个k8s中的三个服务,login需要能够连接gate和game,那么login服务的K8s yaml怎么定义连接后端的gate和game的service

在 Kubernetes 中定义 login 服务的 YAML 时,需通过 Service 名称实现与 gategame 服务的连接,而非硬编码 IP。


📌 一、核心配置原则

  1. 服务发现机制
    • Kubernetes 通过内置 DNS 自动解析同一 Namespace 下的 Service 名称(如 gate-service)。
    • login 服务只需通过环境变量或代码调用 Service 名称(如 http://gate-service:80)即可访问后端服务。
  2. 环境变量注入
    • login 的 Deployment 中通过 env 字段动态注入 gategame 的 Service 地址。
  3. 独立 Service 定义
    • gategame 分别创建 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

🔍 三、关键配置解析

  1. Service 定义的作用

    • gate-servicegame-service 为后端服务提供 稳定的 DNS 名称(如 gate-service.game-group-1001.svc.cluster.local),屏蔽 Pod IP 变化。
    • 同一 Namespace 内可简写为 http://gate-service
  2. 环境变量注入逻辑

    • GATE_SERVICE_URLGAME_SERVICE_URL 在容器启动时注入,应用代码可直接使用(无需在 Dockerfile 中定义)。
    • 示例代码(Python):
      import os
      requests.get(os.getenv("GATE_SERVICE_URL") + "/api")
      
  3. 健康检查的必要性

    • readinessProbe:确保 login 完全启动(如依赖服务连接成功)后才加入 Service 负载均衡池,避免请求失败。
    • livenessProbe:自动重启无响应的容器,提高服务可靠性。
  4. 跨 Namespace 访问
    gategame 位于其他 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
省略健康检查配置 readinessProbelivenessProbe

💎 总结

  • 核心配置
    gate/game 的 Service 提供 DNS 名称 → 通过 env 注入到 login 的 Deployment。
    ✅ 健康检查保证服务可用性 → 配置 readinessProbelivenessProbe
  • 验证命令
    # 检查 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 原生服务发现机制,实现服务间解耦和高可用,适应生产环境动态扩展需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值