Kubernetes,访问集群外IP

pas*_*swd 3 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: vm
      protocol: TCP
      port: 30000
      targetPort: 30000
  externalIPs:
    - 10.22.0.1
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ney 5

您可以为此创建一个端点。

让我们看一个例子:

在此示例中,我的网络上有一个具有 IP 的 http 服务器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
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f http-server-endpoint.yaml
endpoints/http-server configured
Run Code Online (Sandbox Code Playgroud)

让我们创建我们的服务:

apiVersion: v1
kind: Service
metadata:
  name: http-server
spec:
  ports:
    - port: 80
      targetPort: 80
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f http-server-service.yaml
service/http-server created
Run Code Online (Sandbox Code Playgroud)

检查我们的服务是否存在并保存它的 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
Run Code Online (Sandbox Code Playgroud)

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

$ kubectl run ubuntu -it --rm=true --restart=Never --image=ubuntu bash
Run Code Online (Sandbox Code Playgroud)

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

就我而言,我将安装curl 来检查是否可以访问我的http 服务器。您可能需要安装 mysql:

root@ubuntu:/# apt update; apt install -y curl
Run Code Online (Sandbox Code Playgroud)

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

root@ubuntu:/# curl 10.128.15.209:80
Hello World!
Run Code Online (Sandbox Code Playgroud)

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

root@ubuntu:/# curl http-server
Hello World!
Run Code Online (Sandbox Code Playgroud)

因此,根据您的具体情况,您必须创建:

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
Run Code Online (Sandbox Code Playgroud)