提问者:小点点

有没有办法将任意记录添加到库贝-dns?


我会用非常具体的方式来解释我的问题,但我认为这比用抽象的方式解释要好…

例如,在库伯内特斯集群之外但在网络中有一个MongoDB副本集。副本集所有成员的IP地址由应用服务器和数据库服务器中的 /etc/hosts解析。

在实验/过渡阶段,我需要从kubernetes pod访问那些mongodb服务器。然而,kubernetes似乎不允许在pod/容器中添加自定义条目来 /etc/hosts。

MongoDB副本集已经在处理大型数据集,在集群中创建新的副本集不是一个选项。

因为我使用GKE,所以我想应该避免更改库贝-dns命名空间中的任何资源。配置或替换库贝-dns以适合我的需要是最后一件事。

有没有办法解析库伯内特斯集群中自定义主机名的IP地址?

这只是一个想法,但是如果kube2sky可以读取config map的一些条目并将它们用作dns记录,那就太好了。例如rep1. mongo.local:192.168.10.100

编辑:我引用了https://github.com/kubernetes/kubernetes/issues/12337的问题


共3个答案

匿名用户

现在这个问题有两种可能的解决方案:

  1. pod-wise(将更改添加到解析这些域所需的每个pod)
  2. 集群(将更改添加到所有pod都可以访问的中心位置,在我们的例子中是DNS

从Kunbernetes 1.7开始,现在可以直接使用. spec.hostAliase将条目添加到Pod的/etc/host

例如:要将foo. localbar.local解析为127.0.0.1foo.Remotebar.Remote解析为10.1.2.3,您可以在.spec.hostAliase下为Pod配置HostAliase:

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox
    command:
    - cat
    args:
    - "/etc/hosts"

从库伯内特斯v1.12开始,CoreDNS是推荐的DNS服务器,取代了库贝-dns。如果您的集群最初使用库贝-dns,您可能仍然部署了库贝-dns而不是CoreDNS。我将假设您使用CoreDNS作为您的K8SDNS。

在CoreDNS中,可以在集群域中添加任意条目,这样所有pod都可以直接从DNS解析此条目,而无需更改每个pod中的每个/etc/host文件。

第一:

让我们更改coreos ConfigMap并添加所需的更改:

kubectl edit cm coredns -n kube-system 

apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        errors
        health {
          lameduck 5s
        }
        hosts /etc/coredns/customdomains.db example.org {
          fallthrough
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . "/etc/resolv.conf"
        cache 30
        loop
        reload
        loadbalance
    }
  customdomains.db: |
    10.10.1.1 mongo-en-1.example.org
    10.10.1.2 mongo-en-2.example.org
    10.10.1.3 mongo-en-3.example.org
    10.10.1.4 mongo-en-4.example.org

基本上我们添加了两件事:

>

  • kubernetes插件之前托管插件,并使用host插件的回退选项来满足我们的案例。

    为了进一步阐明回退选项。任何给定的后端通常是其区域的最终单词——它要么返回结果,要么返回NXDOMAIN进行查询。然而,有时这不是所需的行为,因此一些插件支持回退选项。当启用回退时,插件将在未找到记录时返回NXDOMAIN,而不是在链中向下传递请求。链更下游的后端然后有机会处理请求,在我们的例子中,该后端是kubernetes

    我们在ConfigMap中添加了一个新文件(自定义域. db),并在其中添加了自定义域(mongo-en-*.example.org)。

    最后一件事是记住将自定义域. db文件添加到CoreDNS pod模板的config-卷

    kubectl edit -n kube-system deployment coredns
    
    volumes:
            - name: config-volume
              configMap:
                name: coredns
                items:
                - key: Corefile
                  path: Corefile
                - key: customdomains.db
                  path: customdomains.db
    

    最后让kubernetes重新加载CoreDNS(每个pod运行):

    $ kubectl rollout restart -n kube-system deployment/coredns
    

  • 匿名用户

    @OxMH的回答非常棒,为了简洁可以简化。CoreDNS允许您直接在host插件(https://coredns.io/plugins/hosts/#examples)中指定主机。

    因此,可以像这样编辑ConfigMap:

    $ kubectl edit cm coredns -n kube-system 
    
    
    apiVersion: v1
    kind: ConfigMap
    data:
      Corefile: |
        .:53 {
            errors
            health {
              lameduck 5s
            }
            hosts {
              10.10.1.1 mongo-en-1.example.org
              10.10.1.2 mongo-en-2.example.org
              10.10.1.3 mongo-en-3.example.org
              10.10.1.4 mongo-en-4.example.org
              fallthrough
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . "/etc/resolv.conf"
            cache 30
            loop
            reload
            loadbalance
        }
    

    您仍然需要重新启动coredns,以便它重新读取配置:

    $ kubectl rollout restart -n kube-system deployment/coredns
    

    内联主机文件的内容消除了从配置图映射主机文件的需要。这两种方法实现了相同的结果,取决于您想要在哪里定义主机的个人偏好。

    匿名用户

    访问kubernetes之外的主机或ips需要一种外部名称。

    以下对我有用。

    {
        "kind": "Service",
        "apiVersion": "v1",
        "metadata": {
            "name": "tiny-server-5",
            "namespace": "default"
        },
        "spec": {
            "type": "ExternalName",
            "externalName": "192.168.1.15",
            "ports": [{ "port": 80 }]
        }
    }