$ oc get -n openshift-dns-operator deployment/dns-operator
在 OpenShift Dedicated 中,DNS Operator 部署和管理 CoreDNS 实例以向集群内的 Pod 提供名称解析服务,启用基于 DNS 的 Kubernetes 服务发现,并解析内部 `cluster.local` 名称。
DNS Operator 实现来自 `operator.openshift.io` API 组的 `dns` API。Operator 使用 DaemonSet 部署 CoreDNS,为 DaemonSet 创建服务,并配置 kubelet 以指示 Pod 使用 CoreDNS 服务 IP 地址进行名称解析。
DNS Operator 在安装期间使用 `Deployment` 对象部署。
使用 `oc get` 命令查看部署状态
$ oc get -n openshift-dns-operator deployment/dns-operator
NAME READY UP-TO-DATE AVAILABLE AGE
dns-operator 1/1 1 1 23h
使用 `oc get` 命令查看 DNS Operator 的状态
$ oc get clusteroperator/dns
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE
dns 4.1.15-0.11 True False False 92m
`AVAILABLE`、`PROGRESSING` 和 `DEGRADED` 提供有关 Operator 状态的信息。当 CoreDNS DaemonSet 中至少 1 个 Pod 报告 `Available` 状态条件,并且 DNS 服务具有集群 IP 地址时,`AVAILABLE` 为 `True`。
每个新的 OpenShift Dedicated 安装都具有名为 `default` 的 `dns.operator`。
使用 `oc describe` 命令查看默认 `dns`
$ oc describe dns.operator/default
Name: default
Namespace:
Labels: <none>
Annotations: <none>
API Version: operator.openshift.io/v1
Kind: DNS
...
Status:
Cluster Domain: cluster.local (1)
Cluster IP: 172.30.0.10 (2)
...
1 | 集群域名字段是用于构建完全限定的 Pod 和服务域名的基本 DNS 域名。 |
2 | 集群 IP 是 Pod 查询名称解析的地址。IP 定义为服务 CIDR 范围中的第 10 个地址。 |
您可以使用 DNS 转发以以下方式覆盖 `/etc/resolv.conf` 文件中的默认转发配置
为每个区域指定名称服务器(`spec.servers`)。如果转发的区域是由 OpenShift Dedicated 管理的入口域名,则上游名称服务器必须为此域名授权。
您必须至少指定一个区域。否则,您的集群可能会失去功能。 |
提供上游 DNS 服务器列表(`spec.upstreamResolvers`)。
更改默认转发策略。
默认域的 DNS 转发配置可以同时具有 `/etc/resolv.conf` 文件中指定的默认服务器和上游 DNS 服务器。 |
修改名为 `default` 的 DNS Operator 对象
$ oc edit dns.operator/default
发出上述命令后,Operator 将基于 `spec.servers` 创建并更新名为 `dns-default` 的配置映射,其中包含其他服务器配置块。
在为 `zones` 参数指定值时,请确保您只转发到特定区域,例如您的内网。您必须至少指定一个区域。否则,您的集群可能会失去功能。 |
如果没有任何服务器具有与查询匹配的区域,则名称解析将回退到上游 DNS 服务器。
apiVersion: operator.openshift.io/v1
kind: DNS
metadata:
name: default
spec:
cache:
negativeTTL: 0s
positiveTTL: 0s
logLevel: Normal
nodePlacement: {}
operatorLogLevel: Normal
servers:
- name: example-server (1)
zones:
- example.com (2)
forwardPlugin:
policy: Random (3)
upstreams: (4)
- 1.1.1.1
- 2.2.2.2:5353
upstreamResolvers: (5)
policy: Random (6)
protocolStrategy: "" (7)
transportConfig: {} (8)
upstreams:
- type: SystemResolvConf (9)
- type: Network
address: 1.2.3.4 (10)
port: 53 (11)
status:
clusterDomain: cluster.local
clusterIP: x.y.z.10
conditions:
...
1 | 必须符合 `rfc6335` 服务名称语法。 |
2 | 必须符合 `rfc1123` 服务名称语法中子域的定义。集群域名 `cluster.local` 是 `zones` 字段的无效子域。 |
3 | 定义选择 `forwardPlugin` 中列出的上游解析器的策略。默认值为 `Random`。您还可以使用 `RoundRobin` 和 `Sequential` 值。 |
4 | 每个 `forwardPlugin` 最多允许 15 个 `upstreams`。 |
5 | 您可以使用upstreamResolvers 覆盖默认转发策略,并将DNS解析转发到指定DNS解析器(上游解析器)以用于默认域名。如果您未提供任何上游解析器,则DNS名称查询将转到/etc/resolv.conf 中声明的服务器。 |
6 | 确定upstreams 中列出的上游服务器查询选择的顺序。您可以指定以下值之一:Random 、RoundRobin 或Sequential 。默认值为Sequential 。 |
7 | 省略此项时,平台会选择默认值,通常是原始客户端请求的协议。设置为TCP 以指定平台应将TCP用于所有上游DNS请求,即使客户端请求使用UDP也是如此。 |
8 | 用于配置传输类型、服务器名称以及转发DNS请求到上游解析器时使用的可选自定义CA或CA捆绑包。 |
9 | 您可以指定两种类型的upstreams :SystemResolvConf 或Network 。SystemResolvConf 将上游配置为使用/etc/resolv.conf ,而Network 定义一个Networkresolver 。您可以指定一个或两个。 |
10 | 如果指定的类型为Network ,则必须提供IP地址。address 字段必须是有效的IPv4或IPv6地址。 |
11 | 如果指定的类型为Network ,则您可以选择提供端口。port 字段的值必须在1 和65535 之间。如果您未为上游指定端口,则默认端口为853。 |
有关DNS转发的更多信息,请参阅CoreDNS转发文档。
您可以使用oc describe
命令检查DNS Operator的状态并查看其详细信息。
查看DNS Operator的状态
$ oc describe clusteroperators/dns
尽管特定版本中的消息和拼写可能有所不同,但预期的状态输出如下所示
Status:
Conditions:
Last Transition Time: <date>
Message: DNS "default" is available.
Reason: AsExpected
Status: True
Type: Available
Last Transition Time: <date>
Message: Desired and current number of DNSes are equal
Reason: AsExpected
Status: False
Type: Progressing
Last Transition Time: <date>
Reason: DNSNotDegraded
Status: False
Type: Degraded
Last Transition Time: <date>
Message: DNS default is upgradeable: DNS Operator can be upgraded
Reason: DNSUpgradeable
Status: True
Type: Upgradeable
您可以使用oc logs
命令查看DNS Operator日志。
查看DNS Operator的日志
$ oc logs -n openshift-dns-operator deployment/dns-operator -c dns-operator
CoreDNS和CoreDNS Operator的日志级别通过不同的方法设置。您可以配置CoreDNS日志级别以确定记录的错误消息的详细信息量。CoreDNS日志级别的有效值为Normal
、Debug
和Trace
。默认logLevel
为Normal
。
CoreDNS错误日志级别始终启用。以下日志级别设置报告不同的错误响应
|
要将logLevel
设置为Debug
,请输入以下命令
$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Debug"}}' --type=merge
要将logLevel
设置为Trace
,请输入以下命令
$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Trace"}}' --type=merge
要确保已设置所需的日志级别,请检查配置映射
$ oc get configmap/dns-default -n openshift-dns -o yaml
例如,将logLevel
设置为Trace
后,您应该在每个服务器块中看到此节
errors
log . {
class all
}
CoreDNS和CoreDNS Operator的日志级别通过不同的方法设置。集群管理员可以配置Operator日志级别,以便更快地跟踪OpenShift DNS问题。operatorLogLevel
的有效值为Normal
、Debug
和Trace
。Trace
具有最详细的信息。默认operatorlogLevel
为Normal
。Operator问题有七个日志级别:Trace、Debug、Info、Warning、Error、Fatal和Panic。设置日志级别后,将记录具有该严重性或高于该严重性的日志条目。
operatorLogLevel: "Normal"
设置 logrus.SetLogLevel("Info")
。
operatorLogLevel: "Debug"
设置 logrus.SetLogLevel("Debug")
。
operatorLogLevel: "Trace"
设置 logrus.SetLogLevel("Trace")
。
要将operatorLogLevel
设置为Debug
,请输入以下命令
$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Debug"}}' --type=merge
要将operatorLogLevel
设置为Trace
,请输入以下命令
$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Trace"}}' --type=merge
要查看结果更改,请输入以下命令
$ oc get dnses.operator -A -oyaml
您应该看到两个日志级别条目。operatorLogLevel
适用于OpenShift DNS Operator问题,logLevel
适用于CoreDNS pod的daemonset。
logLevel: Trace
operatorLogLevel: Debug
要查看daemonset的日志,请输入以下命令
$ oc logs -n openshift-dns ds/dns-default
对于CoreDNS,您可以配置成功或不成功缓存的最大持续时间,分别称为正缓存或负缓存。调整DNS查询响应的缓存持续时间可以减少任何上游DNS解析器的负载。
将TTL字段设置为低值可能会导致集群、任何上游解析器或两者的负载增加。 |
通过运行以下命令编辑名为default
的DNS Operator对象
$ oc edit dns.operator.openshift.io/default
修改生存时间 (TTL) 缓存值
apiVersion: operator.openshift.io/v1
kind: DNS
metadata:
name: default
spec:
cache:
positiveTTL: 1h (1)
negativeTTL: 0.5h10m (2)
1 | 字符串值1h 由CoreDNS转换为相应的秒数。如果省略此字段,则该值将假定为0s ,并且集群使用内部默认值900s 作为后备。 |
2 | 字符串值可以是单位的组合,例如0.5h10m ,并由CoreDNS转换为相应的秒数。如果省略此字段,则该值将假定为0s ,并且集群使用内部默认值30s 作为后备。 |
要查看更改,请再次查看配置映射,方法是运行以下命令
oc get configmap/dns-default -n openshift-dns -o yaml
验证您是否看到如下所示的条目
cache 3600 {
denial 9984 2400
}
有关缓存的更多信息,请参阅CoreDNS缓存。
DNS Operator管理CoreDNS组件,为集群中的pod和服务提供名称解析服务。DNS Operator的managementState
默认设置为Managed
,这意味着DNS Operator正在主动管理其资源。您可以将其更改为Unmanaged
,这意味着DNS Operator不管理其资源。
以下是更改DNS Operator managementState
的用例
您是开发人员,希望测试配置更改以查看它是否可以解决CoreDNS中的问题。您可以通过将managementState
设置为Unmanaged
来阻止DNS Operator覆盖配置更改。
您是集群管理员,并已报告了CoreDNS问题,但需要应用解决方法直到问题得到解决。您可以将DNS Operator的managementState
字段设置为Unmanaged
来应用解决方法。
在DNS Operator中将managementState
更改为Unmanaged
oc patch dns.operator.openshift.io default --type merge --patch '{"spec":{"managementState":"Unmanaged"}}'
使用jsonpath
命令行JSON解析器查看DNS Operator的managementState
$ oc get dns.operator.openshift.io default -ojsonpath='{.spec.managementState}'
"Unmanaged"
当 |
DNS Operator有两个守护进程集:一个用于CoreDNS,名为dns-default
;另一个用于管理/etc/hosts
文件,名为node-resolver
。
您可能需要控制哪些节点上分配并运行CoreDNS Pod,但这并非常见操作。例如,如果集群管理员配置了可以禁止节点对之间通信的安全策略,则需要限制CoreDNS守护进程集运行的节点集。如果DNS Pod在集群中的某些节点上运行,并且DNS Pod未运行的节点与运行DNS Pod的节点具有网络连接,则所有Pod都可以使用DNS服务。
node-resolver
守护进程集必须在每个节点主机上运行,因为它添加了集群镜像注册表的条目以支持拉取镜像。node-resolver
Pod只有一个任务:查找image-registry.openshift-image-registry.svc
服务的集群IP地址,并将其添加到节点主机的/etc/hosts
中,以便容器运行时可以解析服务名称。
作为集群管理员,您可以使用自定义节点选择器来配置CoreDNS的守护进程集在某些节点上运行或不运行。
您已安装oc
CLI。
您已以具有cluster-admin
权限的用户身份登录到集群。
您的DNS Operator managementState
已设置为Managed
。
要允许CoreDNS的守护进程集在特定节点上运行,请配置污点和容忍。
修改名为 `default` 的 DNS Operator 对象
$ oc edit dns.operator/default
指定污点键和污点的容忍。
spec:
nodePlacement:
tolerations:
- effect: NoExecute
key: "dns-only"
operators: Equal
value: abc
tolerationSeconds: 3600 (1)
1 | 如果污点是dns-only ,则可以无限期地容忍它。您可以省略tolerationSeconds 。 |
在高度受管控的环境中工作时,您可能需要在将请求转发到上游解析器时保护DNS流量的能力,以便您可以确保额外的DNS流量和数据隐私。
请注意,CoreDNS会缓存转发连接10秒钟。如果未发出请求,CoreDNS将保持TCP连接打开10秒钟。对于大型集群,请确保您的DNS服务器知道它可能会保持许多新的打开连接,因为您可以为每个节点启动一个连接。相应地设置您的DNS层次结构以避免性能问题。
在为 `zones` 参数指定值时,请确保您只转发到特定区域,例如您的内网。您必须至少指定一个区域。否则,您的集群可能会失去功能。 |
修改名为 `default` 的 DNS Operator 对象
$ oc edit dns.operator/default
集群管理员可以为转发的DNS查询配置传输层安全性 (TLS)。
apiVersion: operator.openshift.io/v1
kind: DNS
metadata:
name: default
spec:
servers:
- name: example-server (1)
zones:
- example.com (2)
forwardPlugin:
transportConfig:
transport: TLS (3)
tls:
caBundle:
name: mycacert
serverName: dnstls.example.com (4)
policy: Random (5)
upstreams: (6)
- 1.1.1.1
- 2.2.2.2:5353
upstreamResolvers: (7)
transportConfig:
transport: TLS
tls:
caBundle:
name: mycacert
serverName: dnstls.example.com
upstreams:
- type: Network (8)
address: 1.2.3.4 (9)
port: 53 (10)
1 | 必须符合 `rfc6335` 服务名称语法。 |
2 | 必须符合rfc1123 服务名称语法中子域的定义。集群域cluster.local 是zones 字段的无效子域。集群域cluster.local 是zones 的无效subdomain 。 |
3 | 为转发的DNS查询配置TLS时,请将transport 字段的值设置为TLS 。 |
4 | 为转发的DNS查询配置TLS时,这是一个必需的服务器名称,用作服务器名称指示 (SNI) 的一部分,用于验证上游TLS服务器证书。 |
5 | 定义选择上游解析器的策略。默认值为Random 。您还可以使用RoundRobin 和Sequential 值。 |
6 | 必需。使用它来提供上游解析器。每个forwardPlugin 条目最多允许15个upstreams 条目。 |
7 | 可选。您可以使用它来覆盖默认策略并将DNS解析转发到为默认域指定的DNS解析器(上游解析器)。如果您没有提供任何上游解析器,则DNS名称查询将转到/etc/resolv.conf 中的服务器。 |
8 | 使用TLS时,只允许Network 类型,并且必须提供IP地址。Network 类型表示此上游解析器应单独处理转发的请求,而不是/etc/resolv.conf 中列出的上游解析器。 |
9 | address 字段必须是有效的IPv4或IPv6地址。 |
10 | 您可以选择提供端口。port 的值必须介于1 和65535 之间。如果您没有为上游指定端口,则默认端口为853。 |
如果 |
查看config map
$ oc get configmap/dns-default -n openshift-dns -o yaml
apiVersion: v1
data:
Corefile: |
example.com:5353 {
forward . 1.1.1.1 2.2.2.2:5353
}
bar.com:5353 example.com:5353 {
forward . 3.3.3.3 4.4.4.4:5454 (1)
}
.:5353 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf 1.2.3.4:53 {
policy Random
}
cache 30
reload
}
kind: ConfigMap
metadata:
labels:
dns.operator.openshift.io/owning-dns: default
name: dns-default
namespace: openshift-dns
1 | 对forwardPlugin 的更改将触发CoreDNS守护进程集的滚动更新。 |
有关DNS转发的更多信息,请参阅CoreDNS转发文档。