在Kubernetes集群内访问外部REST API的方法

89次阅读
没有评论

问题描述

这是我第一次涉足Kubernetes领域…我对其中的工作原理还不太了解,某些概念还在逐步理解中,请大家多多包涵。我部署的应用程序需要访问一些外部第三方HTTP REST API。从阅读文档的角度来看,我认为我需要一个具有指向外部REST API IP的端点的服务。以下是我在Helm模板中的设置:

service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    run: external_rest_service
  name: external_rest_service
spec:
  ports:
  - port: 443

endpoint.yaml:

kind: Endpoints
apiVersion: v1
metadata:
  name: external_rest_service
subsets:
- addresses:
    - ip: https://www.someservice.com/api
  ports:
    - port: 443

显然,这种设置是不起作用的,因为IP地址必须是一个实际的IP地址。然而,当我通过nslookup查询REST API时,我会得到3个不同的IP地址,我认为这可能是由于轮询DNS造成的。奇怪的是,当我尝试直接使用curl访问任何IP地址时,我都没有得到响应。我的问题是…

  1. 是否是从集群内部访问外部资源的正确或最佳实践方法?
  2. 我可以配置(并且是否应该)Kubernetes允许通过域名而不是IP访问?如果可以,我在哪里配置?在文档中没有找到相关信息。

如果有人能在这方面给我一些指导,我将非常感激。非常感谢!

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用Service和Endpoint

在Kubernetes中,要访问外部资源,你无需创建Service和Endpoint。Service主要用于内部通信,但如果你希望通过域名或IP访问外部资源,可以直接进行配置。

方案1:直接访问外部资源

通常,要访问外部API,你可以直接使用其URL。不需要为外部资源创建Service和Endpoint。例如,如果你的应用需要访问https://www.someservice.com/api,你可以在应用代码中直接使用这个URL。

方案2:使用ExternalName Service

如果你想通过域名访问外部资源,并且需要在Kubernetes中进行管理,可以使用ExternalName Service。这种类型的Service会将一个域名映射到外部资源的IP地址。

以下是如何在Kubernetes中创建一个ExternalName Service的步骤:

  1. 创建一个 .yaml 文件,比如 external-service.yaml
  2. 在文件中定义ExternalName Service,指定externalName字段为你要访问的域名。

示例 external-service.yaml 文件:

apiVersion: v1
kind: Service
metadata:
  name: external-rest-service
spec:
  type: ExternalName
  externalName: www.someservice.com
  ports:
  - port: 443

通过以上配置,Kubernetes会为你创建一个名为 external-rest-service 的ExternalName Service,将该服务的域名映射到 www.someservice.com

总结

在Kubernetes集群中访问外部REST API的方法主要取决于你的需求。如果只是简单地需要访问外部资源,直接使用其URL即可。如果需要在Kubernetes中进行管理,可以考虑使用ExternalName Service。无论哪种方法,都无需为外部资源创建Endpoint。

请注意,你在使用curl测试外部IP地址时出现问题可能与网络配置、防火墙设置等有关,建议确保网络连通性和访问权限。

以上方案仅为参考,具体实现可能因你的实际环境和需求而有所不同。

参考文档
Kubernetes Services
Publishing Services (Service Types)

正文完