即使 svc.cluster.local 也无法从同一集群中的 pod 访问 ClusterIP 服务

Cant't access ClusterIP serivce from pod within same cluster even with svc.cluster.local

我们正在尝试与多个服务进行相互通信,而不会将它们暴露给 public。

我有这样的服务:-

apiVersion: "v1"
kind: "Service"
metadata:
  name: "config"
  namespace: "noicenamespace"
  labels:
    app: "config"
spec:
  ports:
  - protocol: "TCP"
    port: 8888
    targetPort: 8888
  selector:
    app: "config"
  type: "LoadBalancer"
  loadBalancerIP: ""

由于 LoadBalancer 类型,可在 public 网络上访问该服务。但是我们只希望这个服务对我们集群中的内部服务可见。

因此,如果我注释掉 loadBalancerIP 并将类型设置为 ClusterIP,我的其他 pods 将无法访问该服务。 我尝试像这样指定服务名称:-

http://config.noicenamespace.svc.cluster.local:8888

但是我超时了。我们已经在 Google Kubernetes Engine

上从头开始创建集群

我猜你错过了这里的端口号8888

所以应该这样称呼

http://config.noicenamespace.svc.cluster.local:8888

调试步骤:

  1. 进入 pod 的执行模式之一。
  2. wget -qO- http://config.noicenamespace.svc.cluster.local:8888 或卷曲 检查您是否得到任何响应,然后退出 pods 执行模式。
  3. 使用 kubectl get ep 检查端点并检查端点的 IP 地址并尝试卷曲该 IP:PORT 号码 如果你从 ep 获得 IP 那么这意味着 pod'S 连接到服务并且一切都是正确的
  4. 检查网络策略是否到位。

此错误"Error from server: error dialing backend: dial timeout"与从 GKE 1.19 开始在某些集群中逐步引入 Konnectivity 网络代理有关。

Konnectivity 网络代理 (KNP) 为主出口(kube-apiserver 到集群通信)提供 TCP 级代理,

Konnectivity 服务由两部分组成:控制平面网络中的Konnectivity 服务器和节点网络中的Konnectivity 代理。 Konnectivity 代理启动与 Konnectivity 服务器的连接并维护网络连接。 启用 Konnectivity 服务后,所有控制平面到节点的流量都通过这些连接,因此必须有允许通过端口正确通信的防火墙规则(使用错误消息中显示的端口号和端点的 IP ),否则可能会出现拨号超时错误。

通过在 Cloud Logging 上使用此过滤器,您可以找到与由于缺少防火墙规则导致的 konnectivity 代理超时连接相关的错误日志:(注意错误中端点的 IP 地址和端口号使用详细信息防火墙规则)

resource.labels.cluster_name="cluster name"
"konnectivity-agent"

添加允许您连接到端口的防火墙出口规则(使用错误消息中显示的端口号和端点的 IP),您可以使用以下命令添加该规则。这应该允许 konnectivity-agent 连接到控制平面。

gcloud compute firewall-rules create gke-node-to-konnectivity-service \
--allow=tcp:<port number> \
--direction=EGRESS \
--destination-ranges=<endpoint IP address > \
--target-tags=< node name> \
--priority=1000