【问题标题】:How to access service created in another namespace如何访问在另一个命名空间中创建的服务
【发布时间】:2021-08-08 06:01:08
【问题描述】:

我在访问另一个命名空间中存在的服务时遇到问题。

我有 2 个命名空间(在同一个集群中)airflow-dev 和 dask-dev。

在 dask-dev 命名空间中,我部署了 dask 集群(dask 调度程序和工作程序)。此外,为 dask-scheduler pod 创建了一个服务(集群 IP)。我可以使用“kubectl port-forward”命令从 chrome 访问 dask-scheduler pod。

kubectl port-forward --namespace dask-dev svc/dask-dev-scheduler 5002:80

但是,我无法从 airflow-dev 命名空间中的 pod(airflow-scheduler)访问服务(或 dask-scheduler pod)。尝试使用以下方法访问时出现“找不到主机或服务”错误

dask-dev-scheduler.dask-dev.svc.cluster.local:8786

以下是我为 dask-dev-scheduler 创建的服务。请告诉我如何从气流开发命名空间访问服务。

apiVersion: v1
metadata:
  name: dask-dev-scheduler
  namespace: dask-dev
  labels:
    app: dask-dev
    app.kubernetes.io/managed-by: Helm
    chart: dask-dev-4.5.7
    component: scheduler
    heritage: Helm
    release: dask-dev
  annotations:
    meta.helm.sh/release-name: dask-dev
    meta.helm.sh/release-namespace: dask-dev
spec:
  ports:
    - name: dask-dev-scheduler
      protocol: TCP
      port: 8786
      targetPort: 8786
    - name: dask-dev-webui
      protocol: TCP
      port: 80
      targetPort: 8787
  selector:
    app: dask-dev
    component: scheduler
    release: dask-dev
  clusterIP: 10.0.249.111
  type: ClusterIP
  sessionAffinity: None
status:
  loadBalancer: {}

[1]: https://i.stack.imgur.com/UrA7u.jpg

【问题讨论】:

  • 您可以使用 [servicename.namespace:PORT] 访问该服务,即 dask-dev-scheduler.dask-dev:5002 在文档 [这里] (kubernetes.io/docs/tasks/administer-cluster/…) 中阅读有关它的更多信息。如果您在集群上有 DNS,它将起作用,根据此处的文档:“您可以(并且几乎总是应该)使用附加组件为您的 Kubernetes 集群设置 DNS 服务。”这会让你很容易。也可以尝试使用服务的IP地址进行测试,kubectl get svc -o wide 会显示IP。
  • 试过这个但得到以下错误 OSError: Timed out trying to connect to tcp://dask-dev-scheduler.dask-dev:8786 after 10 s
  • 类似问题已经存在。看看能不能解决你的问题。 Here

标签: kubernetes kubernetes-pod


【解决方案1】:

集群域不必总是cluster.local。尝试使用dask-dev-scheduler.dask-dev.svc。假设 Airflow 尊重安装到 pod 中生成的 resolv.conf 中的 ndots 查找策略,那么应该会找到它。

【讨论】:

  • 我也尝试过这种方法..仍然遇到同样的问题 OSError: Timed out trying to connect to tcp://dask-dev-scheduler.dask-dev.svc:8786 after 10 s
【解决方案2】:

您可以通过服务externalName Type 使用本地服务来引用外部服务(不同命名空间中的服务)。

ExternalName 服务没有选择器,也没有任何定义的端口或端点,因此,您可以使用 ExternalName 服务将流量引导到外部服务。

apiVersion: v1
kind: Service
metadata:
  name: service-b
  namespace: namespace-b
spec:
  selector:
    app: my-app-b
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
apiVersion: v1
kind: Service
metadata:
  name: service-b-ref
  namespace: namespace-a
spec:
  type: ExternalName
  externalName: service-b.namespace-b.svc.cluster.local

namespace-a 中连接到service-b-ref:<port> 的任何流量都将被路由到namespace-b 中的service-b (service-b.namespace-b.svc.cluster.local) 因此,对service-b-ref:3000 的调用将路由到我们的服务-b。


在您的示例中,您只需要在airflow-dev 中创建一个服务,它将流量路由到dask-dev 命名空间中的dask-dev-scheduler

apiVersion: v1
kind: Service
metadata:
  name: dask-dev-svc
  namespace: airflow-dev
spec:
  type: ExternalName
  externalName: dask-dev-scheduler.dask-dev.svc.cluster.local

因此,所有需要连接到dask-dev-schedulerairflow-dev 资源都将调用:dask-dev-svc:8786

apiVersion: v1
metadata:
  name: dask-dev-scheduler
  namespace: dask-dev
spec:
  ports:
    - name: dask-dev-scheduler
      protocol: TCP
      port: 8786
      targetPort: 8786
# ...
  selector:
    app: dask-dev

【讨论】:

  • 这非常有帮助,非常感谢!
【解决方案3】:

您是否将 coredns 升级到 1.8.3?从 1.19 升级到 1.20 后,我的 eks 集群也遇到了同样的问题。 将 coredns 降级到 1.8.0 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2022-11-23
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多