【K8S系列】深入解析DNS

简介: 【K8S系列】深入解析DNS

1 基础介绍

1.1 概念介绍

什么是DNS

我们先来了解一下什么是DNS:

DNS(Domain Name System)是互联网上用于域名解析的分布式数据库系统

它将域名和 IP 地址之间建立了一种映射关系,使得用户可以使用易于记忆的域名来访问互联网上的各种资源,而不必记住它们的 IP 地址。

DNS工作原理

DNS(Domain Name System)的工作原理可以分为以下几个步骤:

  1. 域名解析请求:当用户在浏览器中输入一个域名时,浏览器会向本地 DNS 服务器发送一个域名解析请求。
  2. 本地 DNS 服务器查询:本地 DNS 服务器会首先查询自己的缓存,如果缓存中存在该域名的 IP 地址,则直接返回给浏览器。如果缓存中不存在,则本地 DNS 服务器会向根域名服务器发送一个查询请求。
  3. 根域名服务器响应:根域名服务器会返回给本地 DNS 服务器一个下一级域名服务器的 IP 地址。根域名服务器只负责返回下一级域名服务器的 IP 地址,不负责具体的域名解析工作。
  4. 顶级域名服务器查询:本地 DNS 服务器收到根域名服务器的响应后,会向下一级域名服务器发送一个查询请求,查询顶级域名服务器的 IP 地址。
  5. 顶级域名服务器响应:顶级域名服务器会返回给本地 DNS 服务器一个权威域名服务器的 IP 地址。
  6. 权威域名服务器查询:本地 DNS 服务器收到顶级域名服务器的响应后,会向权威域名服务器发送一个查询请求,查询该域名对应的 IP 地址。
  7. 权威域名服务器响应:权威域名服务器会返回给本地 DNS 服务器该域名对应的 IP 地址。
  8. 本地 DNS 服务器缓存:本地 DNS 服务器将该域名和 IP 地址的映射关系存储在缓存中,以便下一次查询时可以直接返回给浏览器。
  9. 浏览器访问:本地 DNS 服务器将该域名对应的 IP 地址返回给浏览器,浏览器通过该 IP 地址访问该域名对应的服务器。


DNS 的工作原理是一个分布式的系统,它可以支持海量的域名解析请求,并且具有高可用性和可靠性。在实际应用中,DNS 的性能和可靠性对于互联网服务的稳定运行具有非常重要的作用。

example.com域名解析示例:  

其他DNS的信息,专门还有一篇文章讲解,这里就不展开了,下面我们来看下k8s中,dns的k8s类型

2 k8s中的DNS

2.1 类型

在 Kubernetes 中,有两种常见的 DNS 服务器:

  • kube-dns  也是(Cluster DNS)
  • CoreDNS

这两个都是 Kubernetes 集群中的默认 DNS 服务器,用于为 Pod 和 Service 提供域名解析服务。

2.2 kube-dns

kube-dns 是 Kubernetes 集群中最早的 DNS 解决方案,它由三个组件组成:

  • kube-dns
  • etcd  
  • dnsmasq

kube-dns 组件负责接收 DNS 请求,并将请求转发到 etcd 中存储的 DNS 记录中;

nsmasq 是一个轻量级的 DNS 服务器,用于解析 DNS 请求并返回相应的 IP 地址

kube-dns 的工作原理

kube-dns 的工作原理如下:

  • 当一个 Pod 或 Service 需要解析一个域名时,它会向 Kubernetes 集群中的 DNS 服务器发送 DNS 请求。
  • kube-dns 组件会接收到这个请求,并根据请求中的域名和命名空间信息来查找相应的 Pod 或 Service,并返回对应的 IP 地址。

kube-dns 的优点在于它已经被广泛使用,并且在一些旧版本的 Kubernetes 中仍然是默认的 DNS 解决方案。

但是 kube-dns 的可扩展性和灵活性比较有限,而且它的性能也不如 CoreDNS

2.3 CoreDNS

CoreDNS 是一个开源的 DNS 服务器,它是 Kubernetes 集群中默认的 DNS 服务器。

与 kube-dns 不同,CoreDNS 可以支持更多的插件,并且具有更好的可扩展性和灵活性

在 Kubernetes 中,CoreDNS 主要用于为 Pod 和 Service 提供域名解析服务。

当一个 Pod 或 Service 需要解析一个域名时,它会向 Kubernetes 集群中的 DNS 服务器发送 DNS 请求。

如果 CoreDNS 是 Kubernetes 集群中的默认 DNS 服务器,它就会接收到这个请求,并根据请求中的域名和命名空间信息来查找相应的 Pod 或 Service,并返回对应的 IP 地址。

CoreDNS 的工作原理

CoreDNS 的工作原理可以分为以下几个步骤:

  1. 监听:CoreDNS 监听 Kubernetes 集群中的 DNS 服务 IP 地址和端口,这个地址一般是 10.96.0.10:53。当一个 Pod 或 Service 需要解析一个域名时,它会向这个地址发送 DNS 请求。
  2. 转发:CoreDNS 接收到 DNS 请求后,会检查请求中的域名是否以 .cluster.local 结尾。如果是,则 CoreDNS 会将请求转发给 Kubernetes 集群内部的 Service 或 Pod。
  3. 判断:如果请求中的域名是一个 Service 的 DNS 名称,则 CoreDNS 会查找该 Service 的所有后端 Pod 的 IP 地址,并将其中一个返回给请求的 Pod 或 Service。
  4. pod判断:如果请求中的域名是一个 Pod 的 DNS 名称,则 CoreDNS 会直接返回该 Pod 的 IP 地址。
  5. 上游判断:如果请求的域名不是以 .cluster.local 结尾,则 CoreDNS 会将请求转发给上游 DNS 服务器进行解析。

CoreDNS 在 Kubernetes 中的工作原理与 kube-dns 类似,但它具有更好的可扩展性和灵活性。

CoreDNS 可以通过插件进行扩展,例如可以添加文件插件来支持从文件中读取 DNS 记录,也可以添加 forward 插件来支持将 DNS 请求转发给外部 DNS 服务器进行解析。通过这些插件,CoreDNS 可以满足不同的 DNS 解析需求。

需要注意的是,从 Kubernetes 1.13 版本开始,kube-dns 被 CoreDNS 替代成为了默认的 DNS 解决方案。因此,在新版本的 Kubernetes 中,建议使用 CoreDNS 作为 DNS 解决方案。

配置修改

在 Kubernetes 中,可以通过修改 kubelet 的启动参数来选择使用哪种类型的 DNS 服务。默认情况下,Kubernetes 使用 Cluster DNS。要使用 CoreDNS,需要在 kubelet 的启动参数中设置 --cluster-dns 选项。例如:

ini

Copy

--cluster-dns=10.96.0.10
--cluster-domain=cluster.local

这将使用 IP 地址为 10.96.0.10 的 CoreDNS 服务,并将集群域设置为 cluster.local

3 DNS在k8s中的应用

DNS 在 Kubernetes 中有以下几种应用

  1. 服务发现:Kubernetes 中的 DNS 服务可以让容器和服务通过域名进行通信,而不用关心容器 IP 地址的变化。每个 Kubernetes Service 都会被分配一个 DNS 名称,可以通过该名称访问该服务中的所有容器。
  2. Pod 间通信:Kubernetes 中的每个 Pod 都会被分配一个唯一的 DNS 名称,可以通过该名称访问同一节点上的其他 Pod。
  3. 横向扩展:当一个 Kubernetes Deployment 水平扩展时,新创建的 Pod 也会被自动注册到 DNS 中,从而使得它们可以被其他 Pod 和服务发现。
  4. 集群内部域名解析:Kubernetes 集群中的 DNS 服务可以解析集群内部的域名,比如 Kubernetes API Server 的域名和 Service 的域名等。
  5. 集群外部域名解析:Kubernetes 集群中的 DNS 服务可以配置为解析集群外部的域名,从而使得容器和服务可以访问外部的服务和资源。

4 应用案例介绍

1 服务发现

在 Kubernetes 中,每个 Service 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Service 名称和所在的命名空间组成。

形式为 servicename.namespace.svc.cluster.local

这个 DNS 名称可以被 Kubernetes 集群中的任何容器和服务使用,通过该名称访问该服务中的所有容器。

这种服务发现机制使得容器和服务可以轻松地进行通信,而不用关心容器 IP 地址的变化。

下面是一个使用 Service 发现机制的示例代码。

假设我们有一个名为 my-service 的 Service,它将流量路由到名为 my-pod 的 Pod。可以在另一个 Pod 中使用 my-service 的 DNS 名称来访问该服务:

import requests
# 使用 Service 的 DNS 名称访问服务
response = requests.get("http://my-service.namespace.svc.cluster.local")
# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

2 Pod 间通信

在 Kubernetes 中,每个 Pod 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Pod 名称和所在的命名空间组成。

形式为 podname.namespace.pod.cluster.local。这个 DNS 名称可以被同一节点上的其他 Pod 使用,通过该名称访问同一节点上的其他 Pod。


下面是一个使用 Pod 间通信的示例代码。假设有两个名为 pod1pod2 的 Pod,它们都运行在同一个节点上。我们可以在 pod1 中使用 pod2 的 DNS 名称来访问 pod2

import requests
# 使用 Pod 的 DNS 名称访问另一个 Pod
response = requests.get("http://pod2.namespace.pod.cluster.local")
# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

3 横向扩展

在 Kubernetes 中,当一个 Deployment 水平扩展时,新创建的 Pod 也会被自动注册到 DNS 中,从而使得它们可以被其他 Pod 和服务发现。

这意味着我们可以轻松地扩展我们的应用程序,并确保所有新创建的 Pod 都可以与其他 Pod 和服务进行通信

下面是一个使用横向扩展的示例代码。假设有一个名为 my-deployment 的 Deployment,它由一个名为 my-pod 的 Pod 组成。我们可以使用该 Deployment 的名称来访问 my-pod,并且可以轻松地扩展 Deployment,以便添加更多的 Pod:

import requests
# 使用 Deployment 的名称访问 Pod
response = requests.get("http://my-deployment.namespace.svc.cluster.local")
# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

4 集群内部域名解析

在 Kubernetes 中,集群内部的域名可以被自动解析

例如,Kubernetes API Server 的域名为 kubernetes.default.svc.cluster.local,可以被 Kubernetes 集群中的任何容器和服务使用。


这个域名可以用于访问 Kubernetes API Server,以及其他需要访问 Kubernetes 集群内部资源的情况。

下面是一个使用集群内部域名解析的示例代码。假设我们需要访问 Kubernetes API Server,我们可以使用 kubernetes.default.svc.cluster.local 的 DNS 名称来访问它:

import requests
# 使用 Kubernetes API Server 的 DNS 名称访问它
response= requests.get("https://kubernetes.default.svc.cluster.local/api/v1/namespaces")
# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

5 集群外部域名解析

Kubernetes 集群中的 DNS 服务可以配置为解析集群外部的域名,从而使得容器和服务可以访问外部的服务和资源。

这个功能可以通过在 Kubernetes 中配置外部 DNS 服务器来实现。


下面是一个使用集群外部域名解析的示例代码。假设我们需要访问 Google 的网站,我们可以使用 Google 的域名来访问它:

import requests
# 使用 Google 的域名访问它
response = requests.get("https://www.google.com")
# 处理响应
if response.status_code == 200:
    print("Success!")
else:
    print("Error!")

需要注意的是,这个示例代码并没有直接使用 Kubernetes 集群中的 DNS 服务来解析 Google 的域名。

为了使用 Kubernetes 集群中的 DNS 服务解析外部域名,需要在 Kubernetes 中配置外部 DNS 服务器。

5 投票

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
分布式计算 网络协议 Hadoop
Hadoop节点扩展配置DNS和主机名解析
【4月更文挑战第19天】
11 1
|
1月前
|
域名解析 弹性计算 网络协议
阿里云DNS常见问题之确认域名是否在Private zone解析失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
1月前
|
域名解析 缓存 网络协议
阿里云DNS常见问题之新购域名阿里云DNS无法解析如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
1月前
|
Kubernetes Linux Docker
深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤
本文旨在为读者提供一份详尽的Kubernetes 1.28.2集群安装指南,帮助您从零开始构建稳定、高效的Kubernetes集群。我们将从环境准备、软件安装、集群初始化到节点添加等各个环节进行逐步讲解,确保您能够顺利完成集群的搭建。
|
2月前
|
域名解析 网络协议 网络安全
dns云解析问题之开发票操作如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
43 2
dns云解析问题之开发票操作如何解决
|
2月前
|
域名解析 网络协议 数据安全/隐私保护
DNS解析问题之授权RAM子账号管理指定域名如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
234 1
|
2月前
|
域名解析 弹性计算 网络协议
DNS问题之域名云解析接口关闭如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
60 1
DNS问题之域名云解析接口关闭如何解决
|
2月前
|
域名解析 网络协议 API
DNS问题之是否支持多公网IP健康检查
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
47 3
|
2月前
|
域名解析 网络协议 SEO
DNS问题之如何实现自动的域名解析切换
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
33 1
|
2月前
|
域名解析 网络协议 应用服务中间件
云解析DNS问题之配置域名解析ip地址如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
48 1

推荐镜像

更多