如何从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保持一致
- 逐层验证连通性:
- 登录任意一台树莓派节点,执行
telnet {{ .Values.database.ip }} {{ .Values.database.port }}确认节点本身可以访问数据库,如无法连通,先检查数据库所在主机的防火墙规则、数据库是否绑定0.0.0.0地址、是否允许树莓派网段访问 - 若节点可以连通,进入任意Pod执行
telnet {{ .Values.database.host }} {{ .Values.database.port }}测试,如无法连通,先检查集群是否开启了限制Pod出站的网络策略、CNI插件是否开启了Pod访问外部网段的源地址转换(MASQUERADE)规则,树莓派常用的k3s集群默认已开启该规则,自行搭建的集群可检查iptables规则确认 - 如果测试时发现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
相关产品推荐
相关产品推荐

