将kubernetes集群中的流利日志发送到集群之外的远程独立服务器中的Elasticsearch,但是是否在主机网络中使用?

时间:2018-08-02 13:41:32

标签: elasticsearch kubernetes fluentd kubernetes-service

作为this question的另一个问题,我想知道如果无法通过Internet只能通过主机访问外部服务,那么如何从kubernetes pod(流利的)内部访问我的外部服务(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

elasticsearch在那里:

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"
}

但是从我流利的Pod中,我既无法在nslookup中解析服务名称,也无法对简单IP进行ping操作。这些命令都不起作用:

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。如上所示,连接工作良好。

控制器节点也具有IP 192.168.56.102。他与我的kubernetes-cluster的其他工作程序节点(也包括VM)一起在此网络中。

我流利的豆荚将自己视为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

流利的豆荚的/etc/resolc.conf看起来像这样:

ubuntu @ controller:〜$ kubectl exec -ti fluentd-5lqns -n kube-system-cat /etc/resolv.conf     域名服务器10.96.0.10     搜索kube-system.svc.cluster.local svc.cluster.local cluster.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 个答案:

答案 0 :(得分:0)

基本上,您的Pod应该具有到终结点IP的路由或到路由器的默认路由,可以将这些流量重定向到目的地。

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

请查看此article,以获取有关在AWS云中进行路由的示例的详细信息。

  

从一般意义上讲,路由表告诉网络数据包它们以哪种方式   需要去他们的目的地。路由表由管理   路由器,它们充当网络中的“交叉点”,它们   将多条路线连接在一起,并包含有关以下方面的有用信息   将交通吸引到最终目的地。每个AWS VPC都有一个VPC   路由器。此VPC路由器的主要功能是将所有   在该VPC中定义的路由表,然后引导流量   在该VPC内以及到VPC外部的子网,基于   这些表中定义的规则。

     

路由表由目标子网列表以及   “下一跳”是到达最终目的地的地方。