貔貅云原生

貔貅云原生

DNS

100
0
0
2023-12-05
DNS

DNS

通常集群内部访问的是 Service 的域名serviceName.default.svc.cluster.local,域名访问的作用时解决 Pod IP 不固定的问题,Kubernetes 提供 CoreDNS 解决这个问题。

查看 CoreDNS 服务

[root@kube01 dns]# kubectl get pod -n kube-system
NAME                                        READY   STATUS    RESTARTS           AGE
coredns-65c54cc984-7fkp7                    1/1     Running   4 (6d6h ago)       167d
coredns-65c54cc984-cq95z                    1/1     Running   4 (6d6h ago)       167d

CoreDns 是用 GO 写的高性能,高扩展性的 DNS 服务,基于 HTTP/2 Web 服务 Caddy 进行编写的。CoreDns 内部采用插件机制,所有功能都是插件形式编写,用户也可以扩展自己的插件,以下是 Kubernetes 部署 CoreDns 时的默认配置:

[root@kube01 dns]# kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2023-03-09T03:24:41Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "231"
  uid: 43b05dd4-e392-4cd1-9da4-a9feaa525ba1

.:53表示监听 53 端口的域名配置。您可以在其中添加类似的条目,根据您的需求设置名称、重定向、转发等,实现自定义域名解析。例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        ...
        your-custom-domain.com {
            rewrite name some.other.domain.com
            forward . 8.8.8.8
        }
        your-a-record.com {
            rewrite name some.ip.address
        }
    }

CoreDNS 的 Service 地址一般情况下是固定的,类似于 kubernetes 这个 Service 地址一般就是第一个 IP 地址 10.254.0.1,CoreDNS 的 Service 地址就是 10.254.0.10,该 IP 被分配后 kubelet 会将使用--cluster-dns=<dns-service-ip>参数配置的 DNS 传递给每个容器。DNS 名称也需要域名,本地域可以使用参数--cluster-domain = <default-local-domain>在 kubelet 中配置

[root@kube01 ~]# cat /var/lib/kubelet/config.yaml
......
clusterDNS:
- 10.254.0.10
clusterDomain: cluster.local

Pod 使用 DNS

在 Pod 中,默认会自动添加 DNS 信息,但也可以指定 DNS 服务器信息成集群之外的DNS
默认使用的 ClusterFirst

[root@kube01 ~]# kubectl get pod test-nginx-6c6fb7db4b-ssfql  -o yaml
apiVersion: v1
kind: Pod
metadata:
......
spec:
  containers:
  - image: nginx:1.7.9
    imagePullPolicy: Always
    name: test-nginx
      ......
  dnsPolicy: ClusterFirst

此处 dns 类型为 ClusterFirst,就是以集群 dns 优先,dnsPolicy 的类型有多种分别为:

  • ClusterFirst: 这是默认的 DNS 解析策略。在此模式下,Pod 会首先尝试通过集群的 DNS 服务解析域名。如果集群 DNS 无法解析,那么将尝试使用节点上的 DNS 解析服务。这是一种较为常见的解析策略。

  • Default: 这是另一种默认的 DNS 解析策略。在此模式下,Pod 会先尝试通过节点上的 DNS 解析服务解析域名。如果无法解析,那么会尝试使用集群的 DNS 服务。这种策略适用于需要在节点本地解析的特定场景。

  • None: 在此模式下,Pod 不会配置 DNS 设置。它不会添加 /etc/resolv.conf 文件,这意味着在容器内无法进行域名解析。此选项适用于需要自行配置 DNS 设置的情况。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
  dnsConfig:
    nameservers:
      - 8.8.8.8
    searches:
      - my-domain.local
  dnsPolicy: None

其实配置 dns 到 pod 内还是 kubelet 的功能,只不过 coreDNS 提供了动态解析域名与 ip。如果需要使用本机 resolve 文件,则可以使用 default