作为这个问题的进一步问题,我想知道如何从Kubernetes pod(fluentd)内部访问我的外部服务(elasticsearch),如果外部服务不能通过互联网访问,而只能从托管我的kubernetes的主机网络访问。
这是我应用的外部服务kubernetes对象:
kind: Service
apiVersion: v1
metadata:
name: ext-elastic
namespace: kube-system
spec:
type: ExternalName
externalName: 192.168.57.105
ports:
- port: 9200
所以现在我有了这个服务:
ubuntu@controller:~$ kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ext-elastic ExternalName <none> 192.168.57.105 9200/TCP 2s
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 1d
弹性搜索在那里:
ubuntu@controller:~$ curl 192.168.57.105:9200
{
"name" : "6_6nPVn",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ZmxYHz5KRV26QV85jUhkiA",
"version" : {
"number" : "6.2.3",
"build_hash" : "c59ff00",
"build_date" : "2018-03-13T10:06:29.741383Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
但是从我的fluentd-pod中,我既不能在nslookup中解析service-name,也不能ping简单的IP。这些命令都不起作用:
ubuntu@controller:~$ kubectl exec fluentd-f5dks -n kube-system ping 192.168.57.105
ubuntu@controller:~$ kubectl exec fluentd-f5dks -n kube-system nslookup ext-elastic
以下是关于我的网络拓扑的描述:
我的elasticsearch所在的VM有192.168.57.105
,我的kubernetes控制器所在的VM有192.168.57.102
。如上所示,连接运行良好。
控制器节点也有IP192.168.56.102
。这是他与我的kubernetes-集群的其他工作节点(也是VM)在一起的网络。
我的fluentd-pod将自己视为172.17.0.2
。它可以轻松访问192.168.56.102
,但不能访问192.168.57.102
,尽管它是主机,也是同一个节点。
编辑
fluentd-pod的路由表如下所示:
ubuntu@controller:~$ kubectl exec -ti fluentd-5lqns -n kube-system -- route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.244.0.1 0.0.0.0 UG 0 0 0 eth0
10.244.0.0 * 255.255.255.0 U 0 0 0 eth0
fluentd-pod的/etc/resc. conf
如下所示:
ubuntu@controller:~$kubectl exec-ti fluentd-5lqns-n库贝-system--cat /etc/resolv.conf名称服务器10.96.0.10search库贝-system. svc.club.local svc.club.local选项ndots:5
托管kubernetes控制器并可以到达所需elasticsearch服务的VM的路由表如下所示:
ubuntu@controller:~$ route
Kernel-IP-Routentabelle
Ziel Router Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
10.0.2.0 * 255.255.255.0 U 0 0 0 enp0s3
10.244.0.0 * 255.255.255.0 U 0 0 0 kube-bridge
10.244.1.0 192.168.56.103 255.255.255.0 UG 0 0 0 enp0s8
10.244.2.0 192.168.56.104 255.255.255.0 UG 0 0 0 enp0s8
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
192.168.56.0 * 255.255.255.0 U 0 0 0 enp0s8
192.168.57.0 * 255.255.255.0 U 0 0 0 enp0s9
基本上,您的pod应该有一个到endpointIP的路由或到路由器的默认路由,可以将此流量重定向到目标。
目标endpoint还应该具有到流量源的路由(或默认路由),以便能够发送回复。
查看本文,以了解有关云中路由AWS示例的详细信息。
一般来说,路由表告诉网络数据包到达目的地需要走哪条路。路由表由路由器管理,路由器充当网络内的“交叉点”——它们将多条路由连接在一起,并包含将流量传送到最终目的地的有用信息。每个AWSVPC都有一个VPC路由器。这个VPC路由器的主要功能是获取VPC中定义的所有路由表,然后根据这些表中定义的规则,引导VPC内的流量以及VPC外的子网。
路由表由目标子网列表以及“下一跳”到达最终目的地的位置组成。