k8sKubernetesCKA认证

【K8s 精选】CKA - 如何配置和使用 CoreDNS

2022-03-05  本文已影响0人  熊本极客

1. CoreDNS 简介

CoreDNS 是插拔化的 DNS 服务器,即 CoreDNS 内部采用插件机制,所有功能都是插件形式编写。用户可以使用 Corefile 来配置功能,甚至可以自定义插件扩展 CoreDNS。 CoreDNS 总体的工作流程如下:

image.png

2.如何配置 CoreDNS

参考 CoreDNS 的安装命令CoreDNS 的 Corefile 配置文件

2.1 CoreDNS 的安装步骤

$kubeadm init phase addon coredns [flags]
#flags 如下选项
--config string
kubeadm 配置文件的路径。
--feature-gates string
一组用来描述各种功能特性的键值(key=value)对。选项是:
IPv6DualStack=true|false (ALPHA - 默认值=false)
-h, --help
coredns 操作的帮助命令
--image-repository string     默认值:"k8s.gcr.io"
选择用于拉取控制平面镜像的容器仓库
--kubeconfig string     默认值:"/etc/kubernetes/admin.conf"
与集群通信时使用的 kubeconfig 文件。如果未设置该参数,则可以在一组标准位置中搜索现有的 kubeconfig 文件。
--kubernetes-version string     默认值:"stable-1"
为控制平面选择特定的 Kubernetes 版本。
--service-cidr string     默认值:"10.96.0.0/12"
为服务 VIP 选择 IP 地址范围。
--service-dns-domain string     默认值:"cluster.local"
服务使用其它的域名,例如:"myorg.internal"。

#kubeadm init phase 安装 CoreDNS 命令样例
$kubeadm init phase addon coredns --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20

2.2 CoreDNS 请求处理工作流和 Corefile 文件详解

2.2.1 CoreDNS 请求处理工作流

CoreDNS 的 Corefile 配置文件:

coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}
example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}
example.net:53 {
file /etc/coredns/zones/example.net.db
}
.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
}

通过 Corefile 配置文件可知,两个定义的 DNS Server,分别监听 5300 和 53 端口,即 CoreDNS 的请求处理逻辑,如下图所示。

image.png

2.2.2 Corefile 配置文件详解

集群管理员可以修改 CoreDNS CorefileConfigMap,以更改服务发现的工作方式。

Corefile 配置文件格式如下:

ZONE:[PORT] {
[PLUGIN] ...
}
• ZONE:定义DNS server负责的zone,PORT是可选项,默认为53;
• PLUGIN:定义DNS server要加载的插件,每个插件可以有多个参数。

在 Kubernetes 中,CoreDNS 安装时使用如下默认 Corefile 配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
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
        cache 30
        loop
        reload
        loadbalance
    }    

Corefile 配置文件说明:
errors:错误记录到标准输出。
health:在 http://localhost:8080/health 处提供 CoreDNS 的健康报告。
ready:#在端口 8181 上提供的一个 HTTP 末端,当所有能够 表达自身就绪的插件都已就绪时,在此末端返回 200 OK。
kubernetes:处理 k8s 域名解析,ttl 表示响应的超时时间。
prometheus:CoreDNS 的度量指标值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。
forward:不在 Kubernetes 集群域内的任何查询都将转发到 预定义的解析器 (/etc/resolv.conf)。
cache:启用前端缓存。
loop:检测到简单的转发环,如果发现死循环,则中止 CoreDNS 进程。
reload:允许自动重新加载已更改的 Corefile。 编辑 ConfigMap 配置后,请等待两分钟,以使更改生效。
loadbalance:这是一个轮转式 DNS 负载均衡器, 它在应答中随机分配 A、AAAA 和 MX 记录的顺序。

3.如何使用 CoreDNS

自定义 DNS 设置的 Pod 示例:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: pod-dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 10.96.0.10
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
      - cluster.local
      - openstacklocal
    options:
      - name: ndots
        value: "4"
      - name: edns0

创建上面的 Pod 后,容器 test 会在其 /etc/resolv.conf 文件内容如下所示,可以查看命令是 kubectl exec -it dns-example -- cat /etc/resolv.conf

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:4 edns0

/etc/resolv.conf 文件解析
nameserver 表示 CoreDNS 的 ClusterIP
search 表示域名解析时候,依次添加后缀
options 表示当域名包含的 “.” 少于 n 个的时候,则先添加 search 后缀。

上一篇下一篇

猜你喜欢

热点阅读