You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Kubernetes Pod访问本地局域网内运行的服务

你对无选择器Service的功能理解存在偏差,这类资源本身支持将集群外部的服务映射到集群内部,供Pod通过Service名称访问,完全适用于你当前的场景,无法连通是配置或网络规则问题,不是方案方向错误。

现有配置问题排查

  • 你的Service资源的ports字段缺少name属性,需要和Endpoint中ports的name值完全匹配才能正确关联,修正后的Service配置如下:
---
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.database.host }}
  annotations:
    "helm.sh/hook-weight": "-2"
    "helm.sh/hook": pre-install,pre-upgrade
    "helm.sh/hook-delete-policy": before-hook-creation
spec:
  clusterIP: None
  ports:
    - port: {{ .Values.database.port }}
      name: {{ .Values.database.host }} # 新增这行,和Endpoint的port name保持一致
  • 逐层验证连通性:
    1. 登录任意一台树莓派节点,执行telnet {{ .Values.database.ip }} {{ .Values.database.port }}确认节点本身可以访问数据库,如无法连通,先检查数据库所在主机的防火墙规则、数据库是否绑定0.0.0.0地址、是否允许树莓派网段访问
    2. 若节点可以连通,进入任意Pod执行telnet {{ .Values.database.host }} {{ .Values.database.port }}测试,如无法连通,先检查集群是否开启了限制Pod出站的网络策略、CNI插件是否开启了Pod访问外部网段的源地址转换(MASQUERADE)规则,树莓派常用的k3s集群默认已开启该规则,自行搭建的集群可检查iptables规则确认
    3. 如果测试时发现Service域名无法解析,可检查Pod的dnsPolicy是否为默认的ClusterFirst,确保会通过集群CoreDNS解析Service名称

其他可选方案

如果不想维护Service和Endpoint资源,可选用以下更简单的实现方式:

方案1:Pod配置hostAliases

直接在Deployment的Pod模板中添加域名映射,无需额外创建集群资源:

spec:
  template:
    spec:
      hostAliases:
      - ip: "{{ .Values.database.ip }}"
        hostnames:
        - "{{ .Values.database.host }}"
      containers:
      # 原有容器配置保持不变

方案2:使用ExternalName类型Service

如果你的数据库有固定的局域网域名,可直接创建ExternalName类型的Service,无需配置Endpoint:

apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.database.host }}
spec:
  type: ExternalName
  externalName: 你的数据库局域网域名

内容的提问来源于stack exchange,提问作者Marcus Ruddick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:45:05