在 Kubernetes 中为 NODE_IP:NODE_PORT 创建可外部访问的域名

52次阅读
没有评论

问题描述

在使用 Kubernetes 部署的应用中,希望通过域名访问应用,而不是使用 NODE_IP:NODE_PORT 的方式。应用在 AKS 中使用 Helm Charts 部署,存在多个相同应用的实例,每个实例位于不同的命名空间。目前应用是通过在本地使用 NODE_IP:NODE_PORT 进行访问,但不想为服务提供公共/外部 IP 地址。用户想知道是否有办法为每个实例创建自定义的 DNS 记录,以便可以使用域名访问应用。

解决方案

请注意以下操作可能受到 Kubernetes 和 AKS 版本的影响,请根据实际情况进行调整。

最佳解决方案

在 Kubernetes 中,你可以使用 Ingress 资源来实现为每个实例创建可外部访问的域名。Ingress 允许你将外部流量路由到集群内部的服务,并提供了对主机名和路径的映射。以下是实现这一目标的步骤:

  1. 创建 Ingress 资源: 在每个命名空间中创建一个 Ingress 资源,定义主机名和路径映射,将其指向相应的服务。

  2. 配置 DNS: 在你的 DNS 服务器或 DNS 提供商处配置域名的解析,将主机名指向集群的入口控制器(Ingress Controller)的外部 IP 地址。

  3. 启用 Ingress Controller: 确保集群中已经部署并启用了 Ingress Controller。

下面是一个示例的 Ingress 资源定义,假设你想要为命名空间 namespace1 中的应用创建一个域名为 app1.example.com 的映射:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app1-ingress
  namespace: namespace1
spec:
  rules:
    - host: app1.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: app1-service
                port:
                  number: 80

在上述示例中,我们创建了一个 Ingress 资源,将主机名 app1.example.com 映射到命名空间 namespace1 中的 app1-service 服务的端口 80。你可以根据需要在每个命名空间中创建类似的 Ingress 资源来为每个实例设置域名映射。

请注意,使用 Ingress 需要 Ingress Controller 的支持,你需要确保在集群中启用了相应的 Ingress Controller。根据不同的云提供商或环境,Ingress Controller 的部署和配置方式可能会有所不同。

其他方案

如果你不想使用 Ingress,你还可以考虑以下其他方案:

  1. 使用 Kubernetes Service 类型为 LoadBalancer: 在 Service 配置中将类型设置为 LoadBalancer,这将由云提供商自动分配一个外部 IP 地址,并将域名解析到该 IP。

  2. 使用 NodePort 服务加入反向代理: 部署一个反向代理(如 Nginx)作为 NodePort 服务,然后将域名解析到集群节点的 IP 地址,并在代理中配置路由规则将流量转发到相应的 NodePort 服务。

无论选择哪种方案,都需要根据你的实际情况进行调整和配置。确保在进行任何更改之前,先进行测试以验证所选方案是否符合预期。

总结

通过使用 Kubernetes 的 Ingress 资源,你可以为每个实例创建可外部访问的域名,从而实现通过域名访问应用而不是使用 NODE_IP:NODE_PORT 的方式。根据实际情况,你还可以考虑其他方案,如使用 LoadBalancer 类型的 Service 或部署反向代理来实现类似的目标。在进行任何更改之前,请确保对所选方案进行适当的测试,以确保其正常工作。

正文完