0

作为这个问题的另一个问题,我想知道如果外部服务无法通过互联网访问,但只能从我的 kubernetes 所在的主机网络访问,我如何从 kubernetes pod(流利的)内部访问我的外部服务(elasticsearch)托管。

这是我应用的外部服务 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 中解析服务名称,也无法 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

这是关于我的网络拓扑的描述:

192.168.57.105我的 elasticsearch 所在的 VM 和我的 kubernetes 控制器所在的 VM都有192.168.57.102. 如上所示,连接工作良好。

控制器节点也有 IP 192.168.56.102。这是他与我的 kubernetes 集群的其他工作节点(也是虚拟机)在一起的网络。

我的 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 /etc/resolc.conf-pod 的样子如下:

ubuntu@controller:~$ kubectl exec -ti fluentd-5lqns -n kube-system -- cat /etc/resolv.conf nameserver 10.96.0.10 search kube-system.svc.cluster.local svc.cluster.local cluster.local options点数: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
4

1 回答 1

0

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

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

查看这篇文章以了解有关在 AWS 云中路由的详细信息作为示例。

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

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

于 2018-08-08T14:37:29.457 回答