如何使用kubectl代理访问集群外的服务?

时间:2018-12-09 13:52:07

标签: kubernetes kubectl kubeadm kube-apiserver

当我们在kubernetes中使用kubeadm启动集群时,服务的.yaml文件如下所示:

apiVersion: v1
kind: Service
metadata:
  name: neo4j
  labels:
    app: neo4j
    component: core
spec:
  clusterIP: None
  ports:
    - port: 7474
      targetPort: 7474
      name: browser
    - port: 6362
      targetPort: 6362
      name: backup
  selector:
    app: neo4j
    component: core

所有Pod和服务运行完毕后,我执行kubectl proxy并且说:

Starting to serve on 127.0.0.1:8001

因此,当我想访问此服务时:

curl localhost:8001/api/

在集群内部就可以访问!如何访问群集外的服务?

1 个答案:

答案 0 :(得分:2)

您应该使用NodePort公开您的服务:

apiVersion: v1
kind: Service
metadata:
  name: neo4j
  labels:
    app: neo4j
    component: core
spec:
  externalTrafficPolicy: Local
  type: NodePort
  ports:
    - port: 7474
      targetPort: 7474
      name: browser
    - port: 6362
      targetPort: 6362
      name: backup
  selector:
    app: neo4j
    component: core

现在,如果您使用

描述服务
 kubectl describe svc neo4j

您将获得一个介于30000-32767之间的nodeport值,并且您可以使用以下方法从群集外部访问服务:

curl http://<node_ip>:<node_port>

希望这会有所帮助。

编辑:是的,如果通过NodePort公开服务,则不能直接使用clusterIP: None。现在clusterIP: None意味着kubernetes并没有完成内部负载平衡,为此,我们也可以在服务定义中使用externalTrafficPolicy=Local

或者,您也许可以使用入口将流量路由到正确的服务。