【问题标题】:Kubernetes, access IP outside the clusterKubernetes,访问集群外的IP
【发布时间】:2020-07-28 08:22:05
【问题描述】:

我有一个托管 Kubernetes 集群 (10.225.0.1) 的公司网络 (10.22..)。如何从集群中的 pod 内访问同一网络中但在集群外部的某些 VM?

例如,我有一个 IP 为 10.22.0.1:30000 的 VM,我需要从 Kubernetes 集群中的 Pod 访问它。我试图创建这样的服务

apiVersion: v1
kind: Service
metadata:
  name: vm-ip
spec:
  selector:
    app: vm-ip
  ports:
    - name: vm
      protocol: TCP
      port: 30000
      targetPort: 30000
  externalIPs:
    - 10.22.0.1

但是当我从 Pod(kubectl exec -it) 执行“curl http://vm-ip:30000”时,它返回“连接被拒绝”错误。但它适用于“google.com”。访问外部IP的方式有哪些?

【问题讨论】:

  • externalIPs 允许您使用 Kubernetes 无法控制的 IP 将流量路由进入集群。您是否将其与ExternalName 混淆了?此外,如果两个内部网络以某种方式连接,并且您的路由器有到该网络的路由,它应该可以在不需要额外服务的情况下工作。
  • 您是否测试过 VM 是否可以从集群中运行的 pod 或 Kubernetes 工作节点访问?外部路由通常通过 IP 伪装来实现,这由 kube-proxy 完成。一旦确定 VM 确实可以访问,您就可以设置 ExternalName 服务,以便在集群中使用更友好的名称。
  • 如果我只是卷曲虚拟机的 IP,它会返回“卷曲:(7)无法连接到 10.22.0.1 端口 30000:连接超时”。我猜这是因为 Kubernetes 试图在自己的网络中找到 IP。或者可能是因为集群位于 AWS,并且应该有一些规则配置到另一个子网的路由。 ExternalName 不适用于 IP。

标签: networking kubernetes


【解决方案1】:

您可以为此创建一个endpoint

我们来看一个例子:

在此示例中,我的网络上有一个 IP 为 10.128.15.209 的 http 服务器,我希望可以从我的 Kubernetes 集群中的 pod 访问它。

首先是创建一个端点。这将让我创建一个指向此端点的服务,它将流量重定向到我的外部 http 服务器。

我的端点清单如下所示:

apiVersion: v1
kind: Endpoints
metadata:
  name: http-server
subsets:
  - addresses:
      - ip: 10.128.15.209
    ports:
      - port: 80
$ kubectl apply -f http-server-endpoint.yaml
endpoints/http-server configured

让我们创建我们的服务:

apiVersion: v1
kind: Service
metadata:
  name: http-server
spec:
  ports:
    - port: 80
      targetPort: 80
$ kubectl apply -f http-server-service.yaml
service/http-server created

检查我们的服务是否存在并保存它的 clusterIP 以供字母使用:

user@minikube-server:~$$ kubectl get service
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
http-server   ClusterIP   10.96.228.220   <none>        80/TCP    30m
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   10d

现在是时候验证我们是否可以从 pod 访问我们的服务了:

$ kubectl run ubuntu -it --rm=true --restart=Never --image=ubuntu bash

此命令将在 ubuntu pod 中创建并打开一个 bash 会话。

在我的情况下,我将安装 curl 以检查我是否可以访问我的 http 服务器。你可能需要安装mysql:

root@ubuntu:/# apt update; apt install -y curl

使用 clusterIP 检查与我的服务的连接性:

root@ubuntu:/# curl 10.128.15.209:80
Hello World!

最后使用服务名称(DNS):

root@ubuntu:/# curl http-server
Hello World!

所以,在你的具体情况下,你必须创建这个:

apiVersion: v1
kind: Endpoints
metadata:
  name: vm-server
subsets:
  - addresses:
      - ip: 10.22.0.1
    ports:
      - port: 30000
---
apiVersion: v1
kind: Service
metadata:
  name: vm-server
spec:
  ports:
    - port: 30000
      targetPort: 30000

【讨论】:

  • 谢谢,但我得到“连接超时”。我想这与网络设置有关。谢谢。
  • 肯定是网络中的东西。您的集群是 Bare Metal?您可以从 Kubernetes 主节点访问此服务吗?
  • 它在 AWS,由云团队管理。我认为如果我可以从 VM ping 出光泽,那么它应该可以反向工作。但我猜 VPC 应该有路由到带有 VM 的子网。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2021-05-16
  • 1970-01-01
  • 2018-07-02
相关资源
最近更新 更多