即使 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
调试步骤:
- 进入 pod 的执行模式之一。
wget -qO- http://config.noicenamespace.svc.cluster.local:8888
或卷曲
检查您是否得到任何响应,然后退出 pods 执行模式。
- 使用
kubectl get ep
检查端点并检查端点的 IP 地址并尝试卷曲该 IP:PORT 号码
如果你从 ep 获得 IP 那么这意味着 pod'S 连接到服务并且一切都是正确的
- 检查网络策略是否到位。
此错误"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
我们正在尝试与多个服务进行相互通信,而不会将它们暴露给 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
调试步骤:
- 进入 pod 的执行模式之一。
wget -qO- http://config.noicenamespace.svc.cluster.local:8888
或卷曲 检查您是否得到任何响应,然后退出 pods 执行模式。- 使用
kubectl get ep
检查端点并检查端点的 IP 地址并尝试卷曲该 IP:PORT 号码 如果你从 ep 获得 IP 那么这意味着 pod'S 连接到服务并且一切都是正确的 - 检查网络策略是否到位。
此错误"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