[zh]Update content/zh/docs/concepts/services-networking/dns-pod-service.md

[zh]Update 1

[zh]8
This commit is contained in:
Kinzhi
2022-05-28 01:23:40 +08:00
parent ed7737f30d
commit 902eb2ab11
@@ -37,27 +37,27 @@ Kubernetes DNS 在集群上调度 DNS Pod 和服务,并配置 kubelet 以告
<!-- <!--
Every Service defined in the cluster (including the DNS server itself) is Every Service defined in the cluster (including the DNS server itself) is
assigned a DNS name. By default, a client Pod's DNS search list includes the assigned a DNS name. By default, a client Pod's DNS search list includes the
Pod's own namespace and the cluster's default domain. Pod's own namespace and the cluster's default domain.
--> -->
集群中定义的每个 Service (包括 DNS 服务器自身)都被赋予一个 DNS 名称。 集群中定义的每个 Service (包括 DNS 服务器自身)都被赋予一个 DNS 名称。
默认情况下,客户端 Pod 的 DNS 搜索列表会包含 Pod 自身的名字空间和集群 默认情况下,客户端 Pod 的 DNS 搜索列表会包含 Pod 自身的名字空间和集群
的默认域。 的默认域。
<!-- <!--
### Namespaces of Services ### Namespaces of Services
A DNS query may return different results based on the namespace of the pod making A DNS query may return different results based on the namespace of the pod making
it. DNS queries that don't specify a namespace are limited to the pod's it. DNS queries that don't specify a namespace are limited to the pod's
namespace. Access services in other namespaces by specifying it in the DNS query. namespace. Access services in other namespaces by specifying it in the DNS query.
For example, consider a pod in a `test` namespace. A `data` service is in For example, consider a pod in a `test` namespace. A `data` service is in
the `prod` namespace. the `prod` namespace.
A query for `data` returns no results, because it uses the pod's `test` namespace. A query for `data` returns no results, because it uses the pod's `test` namespace.
A query for `data.prod` returns the intended result, because it specifies the A query for `data.prod` returns the intended result, because it specifies the
namespace. namespace.
--> -->
### Service 的名字空间 ### Service 的名字空间
@@ -73,11 +73,11 @@ Pod 查询 `data` 时没有返回结果,因为使用的是 Pod 的名字空间
Pod 查询 `data.prod` 时则会返回预期的结果,因为查询中指定了名字空间。 Pod 查询 `data.prod` 时则会返回预期的结果,因为查询中指定了名字空间。
<!-- <!--
DNS queries may be expanded using the pod's `/etc/resolv.conf`. Kubelet DNS queries may be expanded using the pod's `/etc/resolv.conf`. Kubelet
sets this file for each pod. For example, a query for just `data` may be sets this file for each pod. For example, a query for just `data` may be
expanded to `data.test.cluster.local`. The values of the `search` option expanded to `data.test.svc.cluster.local`. The values of the `search` option
are used to expand queries. To learn more about DNS queries, see are used to expand queries. To learn more about DNS queries, see
[the `resolv.conf` manual page.](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html) [the `resolv.conf` manual page.](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html)
--> -->
DNS 查询可以使用 Pod 中的 `/etc/resolv.conf` 展开。kubelet 会为每个 Pod DNS 查询可以使用 Pod 中的 `/etc/resolv.conf` 展开。kubelet 会为每个 Pod
生成此文件。例如,对 `data` 的查询可能被展开为 `data.test.svc.cluster.local` 生成此文件。例如,对 `data` 的查询可能被展开为 `data.test.svc.cluster.local`
@@ -91,7 +91,7 @@ options ndots:5
``` ```
<!-- <!--
In summary, a pod in the _test_ namespace can successfully resolve either In summary, a pod in the _test_ namespace can successfully resolve either
`data.prod` or `data.prod.svc.cluster.local`. `data.prod` or `data.prod.svc.cluster.local`.
--> -->
概括起来,名字空间 `test` 中的 Pod 可以成功地解析 `data.prod` 或者 概括起来,名字空间 `test` 中的 Pod 可以成功地解析 `data.prod` 或者
@@ -127,12 +127,14 @@ For more up-to-date specification, see
### A/AAAA records ### A/AAAA records
"Normal" (not headless) Services are assigned a DNS A or AAAA record for a name of the "Normal" (not headless) Services are assigned a DNS A or AAAA record,
form `my-svc.my-namespace.svc.cluster-domain.example`. This resolves to the cluster IP depending on the IP family of the service, for a name of the form
`my-svc.my-namespace.svc.cluster-domain.example`. This resolves to the cluster IP
of the Service. of the Service.
"Headless" (without a cluster IP) Services are also assigned a DNS A record for "Headless" (without a cluster IP) Services are also assigned a DNS A or AAAA record,
a name of the form `my-svc.my-namespace.svc.cluster-domain.example`. Unlike normal depending on the IP family of the service, for a name of the form
`my-svc.my-namespace.svc.cluster-domain.example`. Unlike normal
Services, this resolves to the set of IPs of the pods selected by the Service. Services, this resolves to the set of IPs of the pods selected by the Service.
Clients are expected to consume the set or else use standard round-robin Clients are expected to consume the set or else use standard round-robin
selection from the set. selection from the set.
@@ -314,9 +316,9 @@ along with its IP.
Endpoints 对象可以为任何端点地址及其 IP 指定 `hostname` Endpoints 对象可以为任何端点地址及其 IP 指定 `hostname`
<!-- <!--
Because A records are not created for Pod names, `hostname` is required for the Pod's A Because A or AAAA records are not created for Pod names, `hostname` is required for the Pod's A or AAAA
record to be created. A Pod with no `hostname` but with `subdomain` will only create the record to be created. A Pod with no `hostname` but with `subdomain` will only create the
A record for the headless service (`default-subdomain.my-namespace.svc.cluster-domain.example`), A or AAAA record for the headless service (`default-subdomain.my-namespace.svc.cluster-domain.example`),
pointing to the Pod's IP address. Also, Pod needs to become ready in order to have a pointing to the Pod's IP address. Also, Pod needs to become ready in order to have a
record unless `publishNotReadyAddresses=True` is set on the Service. record unless `publishNotReadyAddresses=True` is set on the Service.
--> -->
@@ -341,12 +343,13 @@ record unless `publishNotReadyAddresses=True` is set on the Service.
{{< feature-state for_k8s_version="v1.22" state="stable" >}} {{< feature-state for_k8s_version="v1.22" state="stable" >}}
<!-- <!--
When a Pod is configured to have fully qualified domain name (FQDN), its hostname is the short hostname. For example, if you have a Pod with the fully qualified domain name `busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example`, then by default the `hostname` command inside that Pod returns `busybox-1` and the `hostname -fqdn` command returns the FQDN. When a Pod is configured to have fully qualified domain name (FQDN), its hostname is the short hostname. For example, if you have a Pod with the fully qualified domain name `busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example`, then by default the `hostname` command inside that Pod returns `busybox-1` and the `hostname --fqdn` command returns the FQDN.
When you set `setHostnameAsFQDN: true` in the Pod spec, the kubelet writes the Pod's FQDN into the hostname for that Pod's namespace. In this case, both `hostname` and `hostname --fqdn` return the Pod's FQDN.
--> -->
**前置条件**`SetHostnameAsFQDN` 当 Pod 配置为具有全限定域名 (FQDN) 时,其主机名是短主机名。
[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) 例如,如果你有一个具有完全限定域名 `busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example` 的 Pod
必须在 {{< glossary_tooltip text="API 服务器" term_id="kube-apiserver" >}} 则默认情况下,该 Pod 内的 `hostname` 命令返回 `busybox-1`,而 `hostname --fqdn` 命令返回 FQDN。
上启用。
当你在 Pod 规约中设置了 `setHostnameAsFQDN: true` 时,kubelet 会将 Pod 当你在 Pod 规约中设置了 `setHostnameAsFQDN: true` 时,kubelet 会将 Pod
的全限定域名(FQDN)作为该 Pod 的主机名记录到 Pod 所在名字空间。 的全限定域名(FQDN)作为该 Pod 的主机名记录到 Pod 所在名字空间。
@@ -392,10 +395,11 @@ following pod-specific DNS policies. These policies are specified in the
for details on how DNS queries are handled in those cases. for details on how DNS queries are handled in those cases.
- "`ClusterFirstWithHostNet`": For Pods running with hostNetwork, you should - "`ClusterFirstWithHostNet`": For Pods running with hostNetwork, you should
explicitly set its DNS policy "`ClusterFirstWithHostNet`". explicitly set its DNS policy "`ClusterFirstWithHostNet`".
- Note: This is not supported on Windows. See [below](#dns-windows) for details
- "`None`": It allows a Pod to ignore DNS settings from the Kubernetes - "`None`": It allows a Pod to ignore DNS settings from the Kubernetes
environment. All DNS settings are supposed to be provided using the environment. All DNS settings are supposed to be provided using the
`dnsConfig` field in the Pod Spec. `dnsConfig` field in the Pod Spec.
See [Pod's DNS config](#pod-s-dns-config) subsection below. See [Pod's DNS config](#pod-dns-config) subsection below.
--> -->
### Pod 的 DNS 策略 {#pod-s-dns-policy} ### Pod 的 DNS 策略 {#pod-s-dns-policy}
@@ -411,6 +415,7 @@ DNS 策略可以逐个 Pod 来设定。目前 Kubernetes 支持以下特定 Pod
了解在这些场景中如何处理 DNS 查询的信息。 了解在这些场景中如何处理 DNS 查询的信息。
- "`ClusterFirstWithHostNet`":对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 - "`ClusterFirstWithHostNet`":对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略
"`ClusterFirstWithHostNet`"。 "`ClusterFirstWithHostNet`"。
- 注意:这在 Windows 上不支持。 有关详细信息,请参见[下文](#dns-windows)。
- "`None`": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 `dnsConfig` 字段 - "`None`": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 `dnsConfig` 字段
所提供的 DNS 设置。 所提供的 DNS 设置。
参见 [Pod 的 DNS 配置](#pod-dns-config)节。 参见 [Pod 的 DNS 配置](#pod-dns-config)节。
@@ -450,7 +455,7 @@ spec:
``` ```
<!-- <!--
### Pod's DNS Config ### Pod's DNS Config {#pod-dns-config}
{{< feature-state for_k8s_version="v1.14" state="stable" >}} {{< feature-state for_k8s_version="v1.14" state="stable" >}}
@@ -535,8 +540,7 @@ kubectl exec -it dns-example -- cat /etc/resolv.conf
<!-- <!--
The output is similar to this: The output is similar to this:
--> -->
输出类似于 输出类似于
``` ```
nameserver fd00:79:30::a nameserver fd00:79:30::a
search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example
@@ -565,6 +569,42 @@ a list of search domains of up to 2048 characters.
如果启用 kube-apiserver 和 kubelet 的特性门控 `ExpandedDNSConfig`Kubernetes 将可以有最多 32 个 如果启用 kube-apiserver 和 kubelet 的特性门控 `ExpandedDNSConfig`Kubernetes 将可以有最多 32 个
搜索域以及一个最多 2048 个字符的搜索域列表。 搜索域以及一个最多 2048 个字符的搜索域列表。
<!--
## DNS resolution on Windows nodes {#dns-windows}
-->
## Windows 节点上的 DNS 解析 {#dns-windows}
<!--
- ClusterFirstWithHostNet is not supported for pods that run on Windows nodes.
Windows treats all names with a `.` as a FQDN and skips FQDN resolution.
- On Windows, there are multiple DNS resolvers that can be used. As these come with
slightly different behaviors, using the
[`Resolve-DNSName`](https://docs.microsoft.com/powershell/module/dnsclient/resolve-dnsname)
powershell cmdlet for name query resolutions is recommended.
- On Linux, you have a DNS suffix list, which is used after resolution of a name as fully
qualified has failed.
On Windows, you can only have 1 DNS suffix, which is the DNS suffix associated with that
pod's namespace (example: `mydns.svc.cluster.local`). Windows can resolve FQDNs, services,
or network name which can be resolved with this single suffix. For example, a pod spawned
in the `default` namespace, will have the DNS suffix `default.svc.cluster.local`.
Inside a Windows pod, you can resolve both `kubernetes.default.svc.cluster.local`
and `kubernetes`, but not the partially qualified names (`kubernetes.default` or
`kubernetes.default.svc`).
-->
- 在 Windows 节点上运行的 Pod 不支持 ClusterFirstWithHostNet。
Windows 将所有带有 `.` 的名字视为 FQDN 并跳过 FQDN 解析。
- 在 Windows 上,可以使用多个 DNS 解析器。由于这些解析器的行为上略有不同,建议使用
[`Resolve-DNSName`](https://docs.microsoft.com/powershell/module/dnsclient/resolve-dnsname)
这个 PowerShell cmdlet 进行名字查询解析。
- 在 Linux 上,你会有一个 DNS 后缀列表,在全限定域名解析失败之后会使用这里的后缀。
在 Windows 上,你只能有 1 个 DNS 后缀,即与 Pod 的命名空间关联的 DNS
后缀(例如:`mydns.svc.cluster.local`)。 Windows 可以解析能够使用此唯一后缀解析的
FQDN、服务与网络名字。
例如,在 `default` 命名空间中产生的某个 Pod 将具有 DNS 后缀 `default.svc.cluster.local`
在 Windows Pod 中,你可以解析 `kubernetes.default.svc.cluster.local`
`kubernetes`,但无法解析部分限定名称(`kubernetes.default`
`kubernetes.default.svc`)。
## {{% heading "whatsnext" %}} ## {{% heading "whatsnext" %}}
<!-- <!--