提问者:小点点

将日志数据从kubernetes集群中的fluentd发送到集群外部远程独立服务器中的elasticsearch,但IN主机网络?


作为这个问题的进一步问题,我想知道如何从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

共1个答案

匿名用户

基本上,您的pod应该有一个到endpointIP的路由或到路由器的默认路由,可以将此流量重定向到目标。

目标endpoint还应该具有到流量源的路由(或默认路由),以便能够发送回复。

查看本文,以了解有关云中路由AWS示例的详细信息。

一般来说,路由表告诉网络数据包到达目的地需要走哪条路。路由表由路由器管理,路由器充当网络内的“交叉点”——它们将多条路由连接在一起,并包含将流量传送到最终目的地的有用信息。每个AWSVPC都有一个VPC路由器。这个VPC路由器的主要功能是获取VPC中定义的所有路由表,然后根据这些表中定义的规则,引导VPC内的流量以及VPC外的子网。

路由表由目标子网列表以及“下一跳”到达最终目的地的位置组成。