专栏名称: 院长技术
《院长技术》专注于DevOps技术栈研究,云原生、Istio,CICD、Docker、Prometheus、K8s、ServiceMesh、Jenkins、Linux、微服务、分布式存储、监控、日志收集、安全渗透、虚拟化等技术栈。
目录
相关文章推荐
算法爱好者  ·  清北 DeepSeek 教程"神仙打架",北 ... ·  昨天  
北京本地宝  ·  北京领证结婚指南和免费福利! ·  3 天前  
北京本地宝  ·  通通免费!北京8个被严重低估的小众景点! ·  3 天前  
北京吃货小分队  ·  哪吒2周边合集!你抢到了吗 ·  4 天前  
51好读  ›  专栏  ›  院长技术

K8s配置Pod里访问以指定结尾的域名走指定的DNS服务器

院长技术  · 公众号  ·  · 2025-02-18 14:36

正文


### CoreDNS 介绍

CoreDNS 是一个灵活、可扩展的 DNS 服务器,专为云原生环境设计。它是 Kubernetes 的默认 DNS 服务,用于服务发现和域名解析。CoreDNS 以其模块化架构和高性能著称,支持通过插件扩展功能,适用于各种场景。

---

### 1. CoreDNS 的特点
1. **模块化设计**:
- CoreDNS 采用插件化架构,每个功能都是一个插件(Plugin),用户可以根据需求启用或禁用插件。
- 插件可以组合使用,实现复杂的 DNS 解析逻辑。

2. **高性能**:
- CoreDNS 使用 Go 语言编写,具有高并发处理能力,适合大规模集群环境。

3. **云原生支持**:
- 原生支持 Kubernetes 服务发现,能够动态解析 Kubernetes 集群中的 Service 和 Pod。
- 支持通过 API 动态更新 DNS 记录。

4. **轻量级**:
- CoreDNS 的二进制文件体积小,资源占用低,适合容器化部署。

5. **灵活的配置**:
- 使用 `Corefile` 配置文件,语法简单直观,易于维护。

6. **丰富的插件生态**:
- 支持多种插件,如缓存、转发、日志、监控、重写、模板等,满足不同场景需求。

---

### 2. CoreDNS 的核心概念

#### 2.1 Corefile
- Corefile 是 CoreDNS 的配置文件,定义了 DNS 服务器的行为。
- 每个 Corefile 由一个或多个 `Server Block` 组成,每个 Server Block 监听一个特定的端口和协议,并定义如何处理 DNS 请求。
- 示例:
```plaintext
.:53 {
forward . 8.8.8.8
cache
}
```

#### 2.2 插件(Plugin)
- CoreDNS 的功能通过插件实现,每个插件负责特定的任务。
- 常见的插件:
- **kubernetes**:支持 Kubernetes 服务发现,解析 Service 和 Pod 的 DNS 记录。
- **forward**:将 DNS 请求转发到上游 DNS 服务器。
- **cache**:缓存 DNS 查询结果,提高性能。
- **log**:记录 DNS 查询日志。
- **rewrite**:重写 DNS 请求或响应。
- **prometheus**:提供 Prometheus 监控指标。

---

### 3. CoreDNS 在 Kubernetes 中的作用
在 Kubernetes 中,CoreDNS 是默认的 DNS 服务,主要用于:
1. **服务发现**:
- 解析 Kubernetes Service 的 DNS 名称(如 `my-service.namespace.svc.cluster.local`)。
- 解析 Pod 的 DNS 名称(如 `pod-ip.namespace.pod.cluster.local`)。

2. **域名解析**:
- 解析集群外部的域名(如 `example.com`),通过 `forward` 插件将请求转发到上游 DNS 服务器。

3. **自定义 DNS 规则**:
- 通过插件(如 `rewrite`、`template`)实现自定义的 DNS 解析逻辑。

---

### 4. CoreDNS 的工作流程
1. **接收 DNS 请求**:
- CoreDNS 监听指定的端口(默认 53),接收来自客户端(如 Pod)的 DNS 查询请求。

2. **匹配 Server Block**:
- 根据请求的域名和端口,匹配 Corefile 中的 Server Block。

3. **执行插件链**:
- 按照配置的顺序依次执行插件链中的插件,处理 DNS 请求。

4. **返回响应**:
- 将处理结果返回给客户端。

---

### 5. CoreDNS 的配置文件示例
以下是一个典型的 CoreDNS 配置文件(Corefile):
```plaintext
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
```

- **`errors`**:记录错误日志。
- **`health`**:提供健康检查端点。
- **`kubernetes`**:启用 Kubernetes 服务发现。
- **`prometheus`**:提供 Prometheus 监控指标。
- **`forward`**:将外部域名解析请求转发到上游 DNS 服务器。
- **`cache`**:缓存 DNS 查询结果。
- **`loop`**:检测 DNS 循环解析。
- **`reload`**:支持配置文件热更新。
- **`loadbalance`**:对 DNS 响应进行负载均衡。

---

### 6. CoreDNS 的安装与部署
在 Kubernetes 中,CoreDNS 通常作为集群的 DNS 服务部署。可以通过以下方式安装:
1. **使用 kubeadm 部署 Kubernetes 集群**:
- kubeadm 会自动部署 CoreDNS。
2. **手动部署 CoreDNS**:
- 使用官方提供的部署文件:
```bash
kubectl apply -f https://github.com/coredns/deployment/blob/master/kubernetes/coredns.yaml
```

---

### 7. CoreDNS 的插件列表
CoreDNS 支持丰富的插件,以下是一些常用插件:
- **kubernetes**:Kubernetes 服务发现。
- **forward**:转发 DNS 请求。
- **cache**:缓存 DNS 查询结果。
- **log**:记录日志。
- **rewrite**:重写 DNS 请求或响应。
- **template**:根据模板生成 DNS 响应。
- **prometheus**:提供监控指标。
- **file**:从文件加载 DNS 记录。
- **hosts**:使用 `/etc/hosts` 文件解析域名。

完整的插件列表可以参考 [CoreDNS 官方文档](https://coredns.io/plugins/)。

---

### 8. CoreDNS 的优势
- **灵活性**:通过插件机制支持高度定制化。
- **易用性**:配置文件简单直观,易于维护。
- **高性能**:适合大规模集群环境。
- **云原生支持**:与 Kubernetes 深度集成。

---




在 Kubernetes 中,CoreDNS 是默认的 DNS 解析服务。你可以通过修改 CoreDNS 的配置文件(`Corefile`)来实现对特定域名(如以 `hello.com` 结尾的域名)的定制化解析规则,使其指向指定的 DNS 服务器(如 `192.168.1.254`)。

以下是实现步骤:

---

### 1. 修改 CoreDNS 配置
CoreDNS 的配置文件通常位于 Kubernetes 集群中的 ConfigMap 中。你可以通过以下步骤修改它:

#### 1.1 获取当前的 CoreDNS ConfigMap
运行以下命令获取当前的 CoreDNS 配置:
```bash
kubectl -n kube-system get configmap coredns -o yaml
```

#### 1.2 编辑 CoreDNS ConfigMap
编辑 ConfigMap,添加对 `hello.com` 的定制化解析规则:
```bash
kubectl -n kube-system edit configmap coredns
```

在 `Corefile` 中添加以下内容:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns







请到「今天看啥」查看全文