我有一个托管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的方式有哪些?
答案 0 :(得分:2)
您可以为此创建一个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
现在是时候验证我们是否可以从吊舱中访问我们的服务了:
$ kubectl run ubuntu -it --rm=true --restart=Never --image=ubuntu bash
此命令将在ubuntu容器内创建并打开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