【问题标题】:How to access Kubernetes NodePort service in browser?如何在浏览器中访问 Kubernetes NodePort 服务?
【发布时间】:2018-06-23 12:18:50
【问题描述】:

我在 Kubernetes 中为 jenkins 创建了一个部署。 pod 运行良好,我创建了一个服务来访问 service-ip:8080 上的 jenkins,但它似乎不起作用。 当我在服务上方创建ingress 时,我可以使用公共 ip 访问它。

kind: Service
apiVersion: v1
metadata:
  name: jenkins-ui
  namespace: jenkins
spec:
  type: NodePort
  selector:
    app: jenkins
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      name: ui

我如上所述创建了我的服务:

$ kubectl get svc --namespace=jenkins

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
jenkins-ui         NodePort    10.47.xx.xx     <none>        8080:30960/TCP   1d

我尝试访问:10.47.xx.xx:8080,但我无法访问 jenkins UI。我究竟做错了什么?我也试过10.47.xx.xx:30960

我想使用服务访问我的 jenkins UI,但我想在我的集群中保持私有。 (入口使其公开)。

更新:

$ kubectl describe svc jenkins-ui --namespace jenkins
Name:                     jenkins-ui
Namespace:                jenkins
Labels:                   <none>
Annotations:              <none>
Selector:                 app=jenkins
Type:                     NodePort
IP:                       10.47.xx.xx    Port:                     ui  8080/TCP
TargetPort:               8080/TCP
NodePort:                 ui  30960/TCP
Endpoints:                10.44.10.xx:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

访问 10.44.10.xx:8080 上的 pod 也不起作用。

【问题讨论】:

  • 你能用kubectl describe svc jenkins-ui的回复更新你的问题吗?我想知道服务背后是否有端点。
  • @fiunchinho 已更新
  • 谢谢。您是否尝试从集群内运行的 pod 进行连接?提出这些要求的情况如何?
  • 当您创建 NodePort Service 时,您应该能够使用地址 public_node_ip:NodePort 访问在服务后面运行的 pod。因此,您需要其中一个节点的公共 IP,而不是 Service IP,后者的内部 IP 为 10.47.xx.xx,只能从同一本地网络(集群)访问。
  • 在节点中设置防火墙以仅允许您的本地 IP 地址(您的公司办公室)。如果你只想访问这个jenkins实例用于开发目的,你总是可以使用kubectl内置端口转发kubernetes.io/docs/tasks/access-application-cluster/…

标签: jenkins service kubernetes google-cloud-platform


【解决方案1】:

如果我理解正确,您希望集群中运行的任何容器都能够访问您的 jenkins 服务,但您不希望您的 jenkins 服务可以在集群外部通过浏览器之类的方式访问?

在这种情况下:

curl http://jenkins-ui.default:8080
curl http://10.47.10.xx:8080

在您的 kubernetes 集群中的任何容器内都可以正常工作。

此外,您无法从集群外部访问它10.47.10.xx:8080,因为该 IP 仅在您的 kubernetes 集群内有效/可用。

如果您想从集群外部访问它,一个入口控制器或连接到 http://&lt;node-ip&gt;: 30960 是连接到 jenkins-ui k8s 服务以及它后面的 pod 的唯一方法。

编辑:使用 kubectl 端口转发

在开发模式下,如果要访问内部运行的容器,可以使用kubectl port-forward:

kubectl port-forward <jenkins-ui-pod> 9090:8080

这样,http://localhost:9090 将向您显示 jenkins-ui 屏幕,因为您具有 kubectl 访问权限。

kubectl port-forward 还不适用于服务:https://github.com/kubernetes/kubernetes/issues/15180

【讨论】:

  • 谢谢,是的,我想要一个服务(包含一个 pod)。我想通过服务访问 Pod,尽可能不使用公共 IP,因为这样每个人都可以访问我的服务还是我错了?我是否必须在任何地方设置防火墙规则(谷歌云)。
  • 我不明白你的意思。如何在不使用公共 IP 的情况下访问您的服务?如果你想用你的浏览器连接到云上运行的服务,你将如何在不通过公共 IP 的情况下连接?
  • 有没有办法在我的浏览器中访问内部负载均衡器服务?
  • 现在可以端口转发到服务:github.com/kubernetes/kubernetes/issues/…
猜你喜欢
  • 2021-10-12
  • 2021-10-07
  • 2020-11-05
  • 2021-06-27
  • 1970-01-01
  • 2021-10-04
  • 2021-05-23
  • 1970-01-01
  • 2023-01-23
相关资源
最近更新 更多