【问题标题】:Azure Kubernetes - How to determine DNS name that can be used for INTERNAL Load Balancer?Azure Kubernetes - 如何确定可用于内部负载均衡器的 DNS 名称?
【发布时间】:2021-05-09 15:35:49
【问题描述】:

我们已经定义了我们的内部负载均衡器。

apiVersion: v1
kind: Service
metadata:
  name: ads-aks-test
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 9000
  selector:
    app: ads-aks-test

它有自己的 IP 和外部 IP。我们想从另一个虚拟网络中的 VM 访问此服务。 我们需要提前知道它的 DNS 名称 - 完全限定名称,因为我们正在从部署平台部署多个应用程序,并且我们想根据它的服务名称知道在成功部署后如何访问它并且不要等待确定 IP 地址(手动或自动)。例如,这是我们的 APP1,然后我们自动安装需要访问此服务的应用程序 APP2。 因此,出于这个原因,我们希望避免使用 IP 信息。

我们如何确定我们将从第二个应用程序访问它的服务“主机名”是什么?

我在文档中找到的唯一信息是:“如果您的服务使用动态或静态公共 IP 地址,您可以使用服务注释 service.beta.kubernetes.io/azure-dns-label-name 来设置面向公众的 DNS 标签。” - 但这是用于我们不想要的公共负载均衡器!

【问题讨论】:

    标签: azure kubernetes dns azure-aks


    【解决方案1】:

    在您的 K8s 集群中设置 ExternalDNS。这是Azure Private DNS 的指南。这将允许您通过 Kubernetes 资源动态更新您为服务选择的任何主机名的 DNS 记录。

    示例配置如下所示(摘自 Azure Private DNS 指南)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: externaldns
    spec:
      selector:
        matchLabels:
          app: externaldns
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: externaldns
        spec:
          containers:
          - name: externaldns
            image: k8s.gcr.io/external-dns/external-dns:v0.7.3
            args:
            - --source=service
            - --source=ingress
            - --domain-filter=example.com
            - --provider=azure-private-dns
            - --azure-resource-group=externaldns
            - --azure-subscription-id=<use the id of your subscription>
            volumeMounts:
            - name: azure-config-file
              mountPath: /etc/kubernetes
              readOnly: true
          volumes:
          - name: azure-config-file
            secret:
              secretName: azure-config-file
    

    【讨论】:

    【解决方案2】:

    内部负载平衡器使 Kubernetes 服务仅可供与 Kubernetes 集群在同一虚拟网络中运行的应用程序访问。

    https://docs.microsoft.com/en-us/azure/aks/internal-lb

    看来你想要这个配置?有对等吗?您还需要允许在 NSG 中进行通信。

    【讨论】:

    • 是的,这就是我们想要实现的目标。那么我们该怎么做呢?请注意,9000 不是 HTTP 端口,而是用于 TCP 连接的端口,来自其他 VM 的其他应用程序/Windows 服务需要在该端口上建立网络连接。谢谢阿纳斯
    【解决方案3】:

    你可以kubectl get svc

    并使用服务ads-aks-testExternal IP,如注释中您提到的“true”,因此它将是内部IP。

    如果您希望在同一个集群中解析服务名称,您可以使用服务名称本身。

    https://kubernetes.io/docs/concepts/services-networking/service/

    你可以这样做:your-svc.your-namespace.svc.cluster.local

    请注意,它仅在服务位于同一个 Kubernetes 集群中时才有效。

    【讨论】:

    • 感谢您的回复。我知道我们可以使用 IP 我一直在寻找另一种方法。我们的名称空间是默认的。所以主机名是:ads-aks-test.default.svc.cluster.local 对吗?但它只能从集群中的其他 Pod 访问,还是从集群中其他节点的 Pod 访问?无法从另一个子网的虚拟机访问它,这就是我们最初创建此内部负载均衡器的原因——因此它们可以建立连接。如果是这样的话,那么不幸的是,这并不能回答我的问题如何解决我们的问题...... :(
    • ads-aks-test.default.svc.cluster.local 将跨集群工作与节点无关,但如果您尝试从同一 VPC 中的另一个子网连接,最好的方法是仅设置内部 LB 并使用它。
    • 只是在相同的上下文中,您是否期待删除该内部 LB?并将VM连接到没有LB的K8s集群?在这种情况下,您不能使用ads-aks-test.default.svc.cluster.local,但可以使用Node Port 服务。
    • 不,我们不想删除内部 LB。在 Azure 中,我们在另一个需要连接到服务的虚拟网络中有 VM。这就是我们选择使用内部负载均衡器的原因。它需要连接到端口 9000。我们希望使用内部 LB,因为这样我们将能够从不在 AKS 集群中的另一个 VM 进行连接。那是支持的!但是由于 IP 地址不可预测,我们希望使用可预测的主机名,与仅在创建服务后才生成值的 IP 地址相比,如果我们使用主机名,我们可以提前“预测”值
    • 我们希望避免使用 NodePort,因为我们在 AKS 之外的所有应用程序都知道它们应该连接到端口 9000,这是我们应用程序的标准端口。如果使用 NodePort 那么我们需要设置一些其他端口来连接,大于 30000 我们需要设置...谢谢
    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2017-09-25
    • 2016-10-29
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多