8

我想通过向我的 DNS 服务器添加一个存根区域来从 Kubernetes 集群外部解析 kube-dns 名称。这需要将 cluster.local 域更改为适合我的 DNS 命名空间的内容。

集群 DNS 与 cluster.local 一起工作正常。要更改域,我已将 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 上的 KUBELET_DNS_ARGS 行修改为:

Environment="KUBELET_DNS_ARGS=--cluster-dns=x.y.z --cluster-domain=cluster.mydomain.local --resolv-conf=/etc/resolv.conf.kubernetes"

重启 kubelet 后,外部名称是可解析的,但 kubernetes 名称解析失败。

我可以看到 kube-dns 仍在运行:

/kube-dns --domain=cluster.local. --dns-port=10053 --config-dir=/kube-dns-config --v=2

我唯一能找到 cluster.local 的地方是在 pods yaml 配置中,内容如下:

  containers:
  - args:
    - --domain=cluster.local.
    - --dns-port=10053
    - --config-dir=/kube-dns-config
    - --v=2

修改 yaml 并使用重新创建 pod 后

kubectl replace --force -f kube-dns.yaml

我仍然看到 kube-dns 从 --domain=cluster.local 开始。

我错过了什么?

4

6 回答 6

11

我有一个类似的问题,我一直在将基于微服务的应用程序移植到 Kubernetes。将内部 DNS 区域更改为 cluster.local 将是一项相当复杂的任务,我们并不想处理。

在我们的例子中,我们从 KubeDNS 切换到 CoreDNS,并简单地启用coreDNS 重写插件来翻译我们的our.internal.domainto ourNamespace.svc.cluster.local

完成此操作后,我们的 CoreDNS configmap 的 corefile 部分看起来像这样:

data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        rewrite name substring our.internal.domain ourNamespace.svc.cluster.local
        proxy . /etc/resolv.conf
        cache 30

    }

这使我们的 kubernetes 服务能够同时响应默认 DNS 区域和我们自己的区域。

于 2018-06-08T13:44:12.383 回答
2

我部署了入口控制器的内部实例,并将 CNAME 添加到 coreDNS 配置。部署内部 nginx-ingress

helm install int -f ./values.yml stable/nginx-ingress --namespace ingress-nginx

值.yaml:

controller:
  ingressClass: 'nginx-internal'
  reportNodeInternalIp: true
  service:
    enabled: true
    type: ClusterIP

编辑 coreDNS 配置:KUBE_EDITOR=nano kubectl edit configmap coredns -n kube-system

我的核心文件:

apiVersion: v1
data:
  Corefile: |
    .:53 {
        reload 5s
        log
        errors
        health {
          lameduck 5s
        }
        ready
        template ANY A int {
          match "^([^.]+)\.([^.]+)\.int\.$"
          answer "{{ .Name }} 60 IN CNAME int-nginx-ingress-controller.ingress-nginx.svc.cluster.local"
          upstream 127.0.0.1:53
        }
        template ANY CNAME int {
          match "^([^.]+)\.([^.]+)\.int\.$"
          answer "{{ .Name }} 60 IN CNAME int-nginx-ingress-controller.ingress-nginx.svc.cluster.local"
          upstream 127.0.0.1:53
        }
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . "/etc/resolv.conf"
        cache 30
        loop
        reload
        loadbalance
    }

kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"Corefile":".:53 {\n    errors\n    health {\n      lameduck 5s\n    }\n    ready\n    kubernetes >
  creationTimestamp: "2020-02-27T16:02:20Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "16293672"
  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  uid: 8f0ebf84-6451-4f9b-a6e1-c386d44f2d43

如果您现在添加到入口资源.int 域,并添加适当的注释以使用 nginx-internal ingress,你可以有更短的域,例如你可以在 jenkins helm chart 中这样配置它:

master:
  ingress:
    annotations:
      kubernetes.io/ingress.class: nginx-internal

    enabled: true
    hostName: jenkins.devtools.int
于 2020-04-25T13:45:36.210 回答
2

我假设您使用的是 CoreDNS。

您可以通过编辑位于此处的所有节点上的 kubelet 配置文件来更改集群基础 DNS,/var/lib/kubelet/config.yaml或者在kubeadm init.

改变

clusterDomain: cluster.local

至:

clusterDomain: my.new.domain

现在您还需要更改 CoreDNS 配置。CoreDNS 为此使用了 ConfigMap。您可以通过运行获取当前的 CoreDNS ConfigMap

kubectl get -n kube-system cm/coredns -o yaml

然后改变

kubernetes cluster.local in-addr.arpa ip6.arpa {
    ...
}

像这样匹配您的新域:

kubernetes my.new.domain in-addr.arpa ip6.arpa {
    ...
}

现在将更改应用到 CoreDNS ConfigMap。如果您重新启动 kubelet 和您的 CoreDNS pod,那么您的集群应该使用新域。

例如,如果您有一个名为grafana-service 的服务,现在可以使用以下地址访问它: grafana-service.default.svc.my.new.domain

# kubectl get service
NAME              TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
grafana-service   ClusterIP    <Internal-IP>   <none>        3000/TCP   100m

# nslookup grafana-service.default.svc.my.new.domain
Server:    <Internal-IP>
Address 1: <Internal-IP> kube-dns.kube-system.svc.my.new.domain

Name:      grafana-service.default.svc.my.new.domain
Address 1: <Internal-IP> grafana-service.default.svc.my.new.domain
于 2021-02-08T17:49:04.380 回答
0

除了更改之外/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,您还应该运行kubeadm initwhich--service-dns-domain cluster.mydomain.local将为 kube-dns 创建正确的清单。

如果不查看您当前的配置,很难说出为什么您的 mod 不起作用。也许您可以发布以下输出:

kubectl get pod -n kube-system -l k8s-app=kube-dns -o jsonpath={.items[0].spec.containers[0]}

所以我们可以看到你运行了什么。

于 2018-06-13T06:05:22.277 回答
-1

如果您使用 kubeadm 部署了 k8s,那么您可以cluster.local/var/lib/kubelet/config.yaml每个节点上进行更改。如果您打算将更多节点添加到集群中,也可以更改它kubeadm-configkubelet-config-1.17配置映射(命名空间)。kube-system并且不要忘记重新启动节点。

于 2020-03-28T15:58:25.367 回答
-3

当您修改 /etc/kubernetes/manifests/ yaml 文件时,您需要再次重启 kubelet。

此外,如果这不起作用,请仔细检查 kubelet 日志以查看是否正在加载正确的 yaml 文件。

于 2018-01-19T08:38:13.657 回答