【问题标题】:Alias for Kubernetes serviceKubernetes 服务的别名
【发布时间】:2020-07-29 11:10:19
【问题描述】:

我有运行 Kubernetes 版本 1.18.2 的 Minikube。 Minikube 也在运行股票 CoreDNS。我需要为我的服务coolservice 引入一个DNS 别名。该服务在标准coolservice、coolservice.default 和coolservice.default.svc.cluster.local DNS 名称下可用。我希望我的服务也可以在 coolservice.foo.bar 域下使用。

我正在尝试为此目的使用 DNS 重写插件。这是我的 Corefile 配置:

apiVersion: v1
data:
  Corefile: |
    .:53 {
      [... unchanged ...]
    }
    foo.bar {
      rewrite name exact coolservice.foo.bar coolservice.default.svc.cluster.local
    }
kind: ConfigMap
metadata:
  [... unchanged ...]

使用 kubectl 应用 Corefile 后,我在另一个 pod 中声明 shell,并且我正在尝试使用 hostcurl 解析域。不幸的是,如果失败并出现错误Question section mismatch:

root@aks-ssh:/# host coolservice.default.svc.cluster.local
coolservice.default.svc.cluster.local has address 10.108.195.164

root@aks-ssh:/# host coolservice.foo.bar
;; Question section mismatch: got coolservice.default.svc.cluster.local/A/IN
 
;; Question section mismatch: got coolservice.default.svc.cluster.local/A/IN
;; connection timed out; no servers could be reached

root@aks-ssh:/# curl -X GET coolservice.default.svc.cluster.local:8100/health
{"results":[],"compositeStatus":"Healthy"}

root@aks-ssh:/# curl -X GET coolservice.foo.bar:8100/health
curl: (6) Could not resolve host: coolservice.foo.bar

在这个documentation section 中写道,当使用exact 名称重写规则时,答案会自动重写。我也尝试过正则表达式规则。知道这里有什么问题吗? (我也尝试在 AKS 集群上配置它,同样的问题。)。

【问题讨论】:

  • 如果它解决了您的目的,您尝试过吗kubernetes.io/docs/concepts/services-networking/dns-pod-service
  • @TarunKhosla 是的,但这对我没有帮助。它允许为 pod 添加 DNS 别名,我需要 ClusterIP 服务的别名。
  • 您是否需要该 DNS 名称在集群内可见,或在外部可访问?
  • 集群内部。

标签: kubernetes dns azure-aks coredns


【解决方案1】:

看看:https://github.com/coredns/coredns/issues/2347

似乎配置 Resonse Rewrite 很重要

请参阅文档https://coredns.io/plugins/rewrite/ 中有关响应重写的部分

同理:CoreDNS suffix rewrite causes DNS queries to return the rewritten name

【讨论】:

  • 我已经尝试过:“在本文档部分中写道,当使用确切的名称重写规则时,答案会自动重写。我也尝试过正则表达式规则。任何想法都可以这里错了吗?(我也尝试在 AKS 集群上配置它,同样的问题。)。”
【解决方案2】:

我想知道你是否看过Custom DNS Entries For Kubernetes 的文章。它还使用了rewrite 插件。

假设我们有一个服务 foo.default.svc.cluster.local 可以作为 foo.example.com 供外部客户端使用。也就是说,当在集群外部查找时, foo.example.com 将解析为负载均衡器 VIP - 服务的外部 IP 地址。在集群内部,它将解析为相同的事物,因此在内部使用此名称将导致流量发夹 - 离开集群,然后通过外部 IP 返回。相反,我们希望它解析为内部 ClusterIP,避免发夹。

在您的配置中,您添加了带有括号的 foo.bar。

foo.bar {
      rewrite name exact coolservice.foo.bar coolservice.default.svc.cluster.local
    }

您是否尝试过不这样做?根据上述文档中的示例:

.:53 {
    errors
    log
    health
    rewrite name foo.example.com foo.default.svc.cluster.local
    kubernetes cluster.local 10.0.0.0/24
    proxy . /etc/resolv.conf
    cache 30
}

在你的情况下是

.:53 {
    errors
    log
    health
    rewrite name coolservice.foo.bar coolservice.default.svc.cluster.local
    kubernetes cluster.local 10.0.0.0/24
    proxy . /etc/resolv.conf
    cache 30
}

由于您提供的信息有限,请确保您使用正确的service 名称和namespace 名称。

可以使用 to 命令完成这些更改 kubectl edit configmap coredns -n kube-system 或者 kubectl apply -f patched-coredns-deployment.yaml -n kube-system

之后,您将需要几分钟(10-15 分钟)来重新加载插件。

你也可以按文章强制

一旦我们通过 kubectl edit 或 kubectl apply 将其添加到 ConfigMap 中,我们必须让 CoreDNS 知道 Corefile 已更改。你可以给它发送一个 SIGUSR1 告诉它优雅地重新加载——也就是说,不会丢失服务:

$ kubectl exec -n kube-system <coredns-pod-name> -- kill -SIGUSR1 1

最后,您可以通过以下方式对其进行测试(将名称更改为您自己的名称):

$ kubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools
If you don't see a command prompt, try pressing enter.
/ # host foo
foo.default.svc.cluster.local has address 10.0.0.72
/ # host foo.example.com
foo.example.com has address 10.0.0.72
/ # host bar.example.com
Host bar.example.com not found: 3(NXDOMAIN)
/ #

请告诉我你的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2018-12-25
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多