如何将名称服务器添加到Google容器引擎[GKE]中的所有Pod?

9

我尝试将我的本地集群迁移到GKE。为了促进这一转变,我需要能够解析传统服务的名称。

假设网络/VPN问题已得到解决。

目前是否有一种方法可以在GKE上实现这一点?

事实上,我正在尝试向每个/etc/resolv.conf添加NS。

3个回答

3
我想对Eric所说的内容进行补充,并稍微改变一下。
在kubernetes 1.1 "settling period"期间,我们意识到像resolv.conf和resolver behavior这样的东西实际上没有规范。不同的解析器库做不同的事情,这给我们的用户带来了痛苦。
具体来说,一些常见的解析器假定所有的nameserver都是相互可替换的,如果你有处理DNS命名空间不同部分的nameserver,它们就会出现问题。我们决定在kube 1.2中不会将多个nameserver行传递给容器。相反,我们只传递kube-dns服务器,该服务器处理cluster.local查询并将任何其他查询转发到"upstream" nameserver。
我们如何知道"upstream"是什么?我们使用节点的nameservers。每个pod的dnsPolicy字段控制此选择。最终结果是,容器在resolv.conf中只看到一个我们拥有的单个nameserver,并且该nameserver处理整个DNS命名空间。
这实际上意味着你没有很好的机会插入自己的nameserver。你可以更改kubelets的--cluster-dns标志以指向自己的DNS服务器,然后将其转发到kube-dns,然后再转发到"upstream"。问题在于GKE并不真正支持以这种方式更改标志。如果/当节点更新时,标志将消失,以默认值为准。
可能的解决方案:
- 让kubelets从集群内配置中读取它们的标志。这已经是记录计划,但不在v1.2中。 - 使kube-dns接受一个指示"upstream"是什么的标志。Kube-dns是一个"cluster addon",因此不能被最终用户改变(我们会用你的集群更新它并丢失你的更改)。 - 让kube-dns从集群内配置中读取其标志,并接受一个指示"upstream"是什么的标志。这是可行的想法,但可能不适用于v1.2(太晚了)。可能可以将其打补丁到v1.2.x中,但这不是一个bugfix,而是一个功能。 - 将自己的DNS服务器放入每个节点的resolv.conf中,以便kube-dns将您用作上游。我认为GKE没有一种方法来配置这个,否则也会在节点升级时丢失。你可以编写一个控制器,定期SSH到VM并将其写出,然后检查你的kube-dns容器是否正确。

我认为正确的答案是使用集群内的configmaps来向kubelet或DNS(或两者)提供信息。如果您认为这些可能是可行的答案(尽管时间框架问题),如果您打开一个GitHub问题进行讨论,那就太好了。在那里它会得到更多的关注。


1

实际上不行。

如果您修改了节点的resolv.conf文件,Pod将继承更改。

然而,glibc禁止使用超过3个名称服务器或超过6个搜索记录。

GCE VMs使用2个名称服务器和3个搜索来访问节点元数据和项目网络。而GKE使用1个名称服务器和3个搜索。这意味着您没有可用的名称服务器和搜索。

请参阅此问题:https://github.com/kubernetes/kubernetes/issues/9079 和此问题:https://github.com/kubernetes/kubernetes/issues/9132


然而,也许您可以将所有遗留服务的DNS记录复制到Google Cloud DNS中(https://cloud.google.com/dns/what-is-cloud-dns)。这将使它们在所有GCP项目实例和所有GKE容器中都能够被解析。 - Eric Tune
是的,但如果发布者使用内部 DNS 而不是公共 DNS 记录呢? - nelasx

1
我通过在k8s集群中设置dnsmasq服务并将除dnsmasq以外的所有pod nameserver指向dnsmasq服务来解决了这个问题。
dnsmasq将根据域后缀将请求转发到正确的nameserver。因此,内部和外部vpn查找都可以正常工作。
  1. setup a dnsmasq service.
    The pods can look something like this, make sure this is has at least 2 pods as it needs to be HA.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dnsmasq
    spec:
      containers:
      - name: dnsmasq
        image: "andyshinn/dnsmasq:2.76"
        ports:
        - containerPort: 53
          hostPort: 53
          protocol: UDP
        - containerPort: 53
          hostPort: 53
          protocol: TCP
        args: [
          "-S", "/consul/10.3.20.86",
          "-S", "/consul/10.3.20.88",
          "-S", "/consul/10.3.20.90",
          "-S", "/your-vpn-domain.dom/10.3.128.22",
          "-S", "/your-vpn-domain.dom/10.3.128.23"
        ]
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
    
  2. Add a resolv-conf config map.

    #!/bin/bash
    
    DNS_IP=$(kubectl get svc --template '{{.spec.clusterIP}}' dnsmasq)
    DNS_POD=$(kubectl get pod -n kube-system | grep -v kube-dns-autoscaler | grep ^kube-dns  | head -1 | awk '{ print $1; }')
    DOMAIN=$(kubectl describe -n kube-system pod/${DNS_POD} | grep -- --domain= | sed -Ee 's/.*--domain=(.*)\..*/\1/')
    SEARCH=$(kubectl exec -n kube-system  ${DNS_POD} -c kubedns -- cat /etc/resolv.conf | grep ^search | cut -d' '  -f2-)
    VPN_SEARCH="your-vpn-domain.dom"
    
    kubectl create -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: resolv-conf
    data:
      resolv.conf: |
        # This file is created by resolv-conf config map and points to the dnsmasq service.
        search default.svc.${DOMAIN} svc.${DOMAIN} ${DOMAIN} ${SEARCH} ${VPN_SEARCH}
        nameserver ${DNS_IP}
        ndots:5
    EOF
    
  3. Mount the cfgmap in your services/pods. add this to your pods

      volumeMounts:
      - mountPath: /etc/resolv.conf
        name: resolv-conf
        subPath: resolv.conf
        readOnly: true
    volumes:
      - name: resolv-conf
        configMap:
          name: resolv-conf
    
这个解决方案可能有点丑陋,但目前没有太多其他的选择。希望将来能看到Google Cloud或kube-dns提供DNS转发功能。真是有些疯狂,Google Cloud竟然不为指定的域/区提供DNS转发功能。

2
这篇文章有帮助吗?http://blog.kubernetes.io/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes.html - Kuberchaun
看起来正是 OP 和我需要的。我将在 GKE 上进行测试,并在之后报告结果。 - Raboo
感谢Raboo提供的简洁解决方案。我喜欢它如何很好地适应我的Kubernetes工作流程,并且不需要在我的节点上进行配置管理。感谢GoatWalker提供的链接。我很高兴现在已经内置了。 - Jake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接