目录

一: CoreDns

二: CoreDns yaml文件

1) coredns-configmap配置信息

2)CoreDNS 服务在其 metadata.name 字段被命名为 kube-dns

3)  CoreDNS以Deployment方式运行

三:Service与CoreDNS

1) service 的名字空间

2) POD与CoreDNS

3) POD的无头服务

四: POD的DNS策略 

1)dnsPolicy = None

2)  dnsPolicy = Default

3)dnsPolicy = ClusterFirst

4)  dnsPolicy = ClusterFirstWithHostNet 


一: CoreDns

  CoreDNS 是通用的权威 DNS 服务器,可以用作集群 DNS,符合 DNS 规范

  CoreDNS 是使用 插件管理器 集群插件自动启动的 Kubernetes 内置服务。

二: CoreDns yaml文件

apiVersion: v1
kind: ServiceAccount
metadata:
  name: coredns
  namespace: kube-system
  labels:
      kubernetes.io/cluster-service: "true"
      addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: Reconcile
  name: system:coredns
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  - pods
  - namespaces
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - discovery.k8s.io
  resources:
  - endpointslices
  verbs:
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: EnsureExists
  name: system:coredns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:coredns
subjects:
- kind: ServiceAccount
  name: coredns
  namespace: kube-system
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
  labels:
      addonmanager.kubernetes.io/mode: EnsureExists
data:
#coredns配置文件信息
  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 . [DNS服务器地址]
        forward . /etc/resolv.conf {
            max_concurrent 1000
        }
        cache 30
        reload
        loadbalance
    }



---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: coredns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "CoreDNS"
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      priorityClassName: system-cluster-critical
      serviceAccountName: coredns
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                  - key: k8s-app
                    operator: In
                    values: ["kube-dns"]
              topologyKey: kubernetes.io/hostname
      tolerations:
        - key: "CriticalAddonsOnly"
          operator: "Exists"
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - name: coredns
        image: easzlab.io.local:5000/coredns/coredns:1.9.3
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 70Mi
        args: [ "-conf", "/etc/coredns/Corefile" ]
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
          readOnly: true
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9153
          name: metrics
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /ready
            port: 8181
            scheme: HTTP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - all
          readOnlyRootFilesystem: true
      dnsPolicy: Default
      volumes:
        - name: config-volume
          configMap:
            name: coredns
            items:
            - key: Corefile
              path: Corefile
---
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  annotations:
    prometheus.io/port: "9153"
    prometheus.io/scrape: "true"
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "CoreDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.68.0.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP
  - name: metrics
    port: 9153
    protocol: TCP

 

1) coredns-configmap配置信息

#errors:错误记录到标准输出。

#health:在 http://localhost:8080/health 处提供 CoreDNS 的健康报告。 在这个扩展语法中,lameduck 会使此进程不健康,等待 5 秒后进程被关闭。

#ready:在端口 8181 上提供的一个 HTTP 端点, 当所有能够表达自身就绪的插件都已就绪时,在此端点返回 200 OK。

#kubernetes:CoreDNS 将基于服务和 Pod 的 IP 来应答 DNS 查询。 你可以在 CoreDNS 网站找到有关此插件的更多细节。

  #你可以使用 ttl 来定制响应的 TTL。默认值是 5 秒钟。TTL 的最小值可以是 0 秒钟, 最大值为 3600 秒。将 TTL 设置为 0 可以禁止对 DNS 记录进行缓存。
  #pods insecure 选项是为了与 kube-dns 向后兼容。
  #你可以使用 pods verified 选项,该选项使得仅在相同名字空间中存在具有匹配 IP 的 Pod 时才返回 A 记录。
  #如果你不使用 Pod 记录,则可以使用 pods disabled 选项。

#prometheus:CoreDNS 的度量指标值以 Prometheus 格式(也称为 OpenMetrics)在 http://localhost:9153/metrics 上提供。

#forward: 不在 Kubernetes 集群域内的任何查询都将转发到预定义的解析器 (/etc/resolv.conf)。

#cache:启用前端缓存。

#loop:检测简单的转发环,如果发现死循环,则中止 CoreDNS 进程。

#reload:允许自动重新加载已更改的 Corefile。 编辑 ConfigMap 配置后,请等待两分钟,以使更改生效。

#loadbalance:这是一个轮转式 DNS 负载均衡器, 它在应答中随机分配 A、AAAA 和 MX 记录的顺序。

#你可以通过修改 ConfigMap 来更改默认的 CoreDNS 行为。

 

2)CoreDNS 服务在其 metadata.name 字段被命名为 kube-dns

      这是为了能够与依靠传统 kube-dns 服务名称来解析集群内部地址的工作负载具有更好的互操作性。 使用 kube-dns 作为服务名称可以抽离共有名称之后运行的是哪个 DNS 提供程序这一实现细节 

3)  CoreDNS以Deployment方式运行

      该 Deployment 通常会向外暴露为一个具有静态IP 地址 

三:Service与CoreDNS

1) service 的名字空间

    不同的名字空间,查询出来的service结果不同,例如:同样为data的pod在 test和prod的名称空间返回的信息不同

    prod名称空间:data.prod.svc.cluster.local

    test名称空间:data.test.svc.cluster.local

整体总结名字信息为:my-svc.my-namespace.svc.cluster-domain.example   --->  Service IP

2) POD与CoreDNS

     一般而言,Pod 会对应如下 DNS 名字解析 pod-ip-address.my-namespace.pod.cluster-domain.example

     但是当pod的yaml文件中有设置spec.hostname 时,hostname的名字优先级大于 pod-ip-address 此时DNS名字解析会变成 hostname.my-namespace.pod.cluster-domain.example

     pod的subdomain , pod设置subdomain后,此时DNS名字解析会变成 hostname.subdomain.my-namespace.pod.cluster-domain.example

 3) POD的无头服务

     pod无头服务,可以直接通过DNS解析访问pod,即使POD的IP地址发生变化,但是通过DNS解析一样可以访问到指定的POD

k8s官方示例

apiVersion: v1
kind: Service
metadata:
  name: busybox-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # 实际上不需要指定端口号
    port: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: busybox-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: busybox-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

     

测试 无头服务是否直接解析的是POD的IP地址 

k8s容器之间dns不通 k8s dns_DNS

 

从上面示例可以看出满足无头服务需要以下几个条件:

1) service 的spec.clusterip  为 none

2) pod的 spec.subdomain 和 service的metadata.name 一致

四: POD的DNS策略 

  1)dnsPolicy = None

    此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段所提供的 DNS 设置

   当 Pod 的 dnsPolicy 设置为 "None" 时,必须指定 dnsConfig 字段

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils-none
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: jessie-dnsutils:1.3
    command:
      - sleep
      - "infinity"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 10.68.0.2
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local

    options:
      - name: ndots
        value: "5"

2)  dnsPolicy = Default

    "Default": Pod 从运行所在的节点继承名称解析配置

     Pod 里的 /etc/resolv.conf  里的nameserver 继承自 本pod所在的node节点。

3)dnsPolicy = ClusterFirst

      与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务      器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器

4)  dnsPolicy = ClusterFirstWithHostNet 

 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设                             为 "ClusterFirstWithHostNet"。否则,以 hostNetwork 方式和 "ClusterFirst" 策略运     行的 Pod 将会做出回退至 "Default" 策略的行为。