Networking Kubernetes,访问集群外的IP

Networking Kubernetes,访问集群外的IP,networking,kubernetes,Networking,Kubernetes,我有一个公司网络(10.22..),它承载一个Kubernetes集群(10.225.0.1)。如何从群集中的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:

我有一个公司网络(10.22..),它承载一个Kubernetes集群(10.225.0.1)。如何从群集中的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”操作时,它返回“connection-rejected”错误。但它与“google.com”合作。访问外部IP的方式有哪些?

您可以为此创建一个

让我们看一个例子:

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

第一件事是创建一个端点。这将允许我创建一个指向该端点的服务,该服务将流量重定向到我的外部http服务器

我的端点清单如下所示:

apiVersion: v1
kind: Endpoints
metadata:
  name: http-server
subsets:
  - addresses:
      - ip: 10.128.15.209
    ports:
      - port: 80
让我们创建我们的服务:

apiVersion: v1
kind: Service
metadata:
  name: http-server
spec:
  ports:
    - port: 80
      targetPort: 80
检查我们的服务是否存在,并保存其群集IP以供信函使用:

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
此命令将在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):

因此,在您的具体情况下,您必须创建以下内容:

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

externalIPs
允许您使用Kubernetes不控制的IP将流量路由到集群。您是否将其与
ExternalName
混淆?此外,如果两个内部网络以某种方式连接,并且您的路由器有一条到该网络的路由,那么它应该可以在不需要额外服务的情况下工作。您是否测试过VM是否可以从集群中运行的pod或Kubernetes工作节点访问?外部路由通常通过IP伪装实现,这是由kube代理完成的。一旦你确定虚拟机确实是可访问的,你就可以设置一个ExternalName服务,在集群中有一个更友好的名称。如果我只是卷曲虚拟机的IP,它会返回“卷曲:(7)连接到10.22.0.1端口30000失败:连接超时”。我猜这是因为Kubernetes试图在自己的网络中找到IP。或者可能是因为集群位于AWS,并且应该有一些规则来配置到另一个子网的路由。ExternalName不适用于IPs.Thanx,但我得到“连接超时”。我想这与网络设置有关。谢谢。这肯定是网络上的东西。你的集群是裸机吗?您可以从Kubernetes主节点访问此服务?它位于AWS,由云团队管理。我认为如果我能从虚拟机中ping出光泽,那么它应该是反向工作的。但是我想VPC应该有路由到有VM的子网。
root@ubuntu:/# apt update; apt install -y curl
root@ubuntu:/# curl 10.128.15.209:80
Hello World!
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