如何通过kubernetes cluster ip访问服务?

时间:2017-01-15 16:36:45

标签: kubernetes

我通过kubeadm构建了一个kubernetes集群并创建了几个服务。这些服务可以通过节点ip:port从外部访问,但是当我尝试通过集群ip访问服务时,它会失败,它会显示错误消息curl:(7)连接失败到10.99.237.89:2379;连接超时,这个如何解决问题?

与群集相关的信息

enter image description here enter image description here

[root@********** ~]# kubectl describe svc etcd-torus-internal --namespace=default
Name:                   etcd-torus-internal
Namespace:              default
Labels:                 name=etcd-torus-internal
Selector:               name=etcd-torus
Type:                   ClusterIP
IP:                     10.99.237.89
Port:                   etcd-client     2379/TCP
Endpoints:              10.244.1.10:2379
Session Affinity:       None
No events.
[root@********** ~]# curl 10.99.237.89:2379
curl: (7) Failed connect to 10.99.237.89:2379; Connection timed out
[root@********** ~]#

2 个答案:

答案 0 :(得分:1)

群集IP无法从群集外部访问,它们仅在内部。

有关详细信息,请参阅here

答案 1 :(得分:0)

从外部集群访问集群:

以下是使用'kubectl port-forward ...'命令从外部群集访问ClusterIp服务的方法: https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/


通过CLUSTER中的CLUSTERIP:

这是您如何通过使用命令'kubectl get svc -n

以以下方式使用Flask在同一名称空间中创建2个API服务器,并在我的Minikube上进行了尝试和测试。在Kubernetes中将第一个托管为ClusterIp服务。使用NodePort托管第二个主机,以访问外部Minikube集群。

第一个服务是在第二个服务中使用它的ClusterIp访问的,如下面的Python代码所示,我尝试使用服务名称进行访问,但是没有用。

这是第一瓶api服务器(.py文件),将在第二瓶api服务器中通过调用:

import flask
from flask import Flask
import json
from flask import request


application = Flask(__name__)


@application.route('/api/v1/square', methods=['GET'])
def square():
    # sample api call: http://0.0.0.0:8003/api/v1/square?nb1=11
    nb1 = request.args.get('nb1')
    sq_nb1 = int(nb1)*int(nb1)
    return flask.jsonify(sq_nb1)


if __name__ == '__main__':
    application.run(debug=True, host="0.0.0.0", port=8003)

第二个API服务器(.py文件),它调用Kubernetes中托管为ClusterIP的第一个API服务器

import flask
from flask import Flask
import json
from flask import request
import requests


application = Flask(__name__)


@application.route('/api/v1/sumsq', methods=['GET'])
def sumSq():
    # sample api call: http://0.0.0.0:8002/api/v1/sumsq?nb1=111&nb2=222
    nb1 = request.args.get('nb1')
    nb2 = request.args.get('nb2')
    sum_val = int(nb1) + int(nb2)

    #  call square micro-service (Svc: 3-Internal-API-Server)
    api_url = "http://10.96.55.98/api/v1/square?nb1={v}".format(v=sum_val)
    # get IP using 'kubectl get svc -n <ns_name>' command

    res = requests.get(url=api_url)
    sum_sq_val = res.json()
    return flask.jsonify(sum_sq_val)


if __name__ == '__main__':
    application.run(debug=True, host="0.0.0.0", port=8002)