共计 1574 个字符,预计需要花费 4 分钟才能阅读完成。
AI 智能摘要
在容器化环境中,自定义 DNS 解析是常见的调试需求。文章详细介绍了在 Docker 和 Kubernetes 中添加 Hosts 条目的方法,包括通过命令行、Docker Compose 或 Pod Manifest 配置 hostAliases,并附有示例说明。同时提及了动态修改和版本兼容性等注意事项。
— 此摘要由 AI 分析文章内容生成,仅供参考。
引言
在容器化环境中,自定义 DNS 解析(如添加特定 Hosts 条目)是调试、服务发现或访问内部系统的常见需求。Docker 和 Kubernetes(K8s)提供了灵活的机制实现这一目标。本文将深入探讨两者的实现方法,并通过具体示例演示操作流程。
一、Docker 中添加自定义 Hosts
1. 单次容器运行时添加
通过 docker run 命令的 --add-host 参数直接注入 Hosts 条目。
示例:将 api.internal.com 指向 IP 10.0.0.100
[root@centos ~]# docker run -it --rm \
> --add-host "api.internal.com:10.0.0.100" \
> alpine:latest cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.0.100 api.internal.com # 自定义 hosts
172.17.0.4 fdfc2241428f
[root@centos ~]#
2. Docker Compose 中持久化配置
在 docker-compose.yml 中使用 extra_hosts 字段定义。
示例:
version: '3'
services:
webapp:
image: nginx:alpine
extra_hosts:
- "db.local:192.168.1.5"
- "auth.service:10.2.3.4"
启动后,容器内 /etc/hosts 将自动包含对应条目。
3. 修改容器内部 Hosts 文件(临时)
直接进入容器编辑文件(不推荐生产环境使用):
docker exec -it <container_id> sh
echo "10.10.10.2 legacy.system" >> /etc/hosts
二、Kubernetes 中添加自定义 Hosts
1. 通过 Pod Manifest 配置hostAliases
K8s 允许在 Pod 定义中通过 hostAliases 字段添加 Hosts。
示例 YAML:
apiVersion: v1
kind: Pod
metadata:
name: hostalias-demo
spec:
containers:
- name: nginx
image: nginx:1.19
hostAliases:
- ip: "172.16.1.2"
hostnames:
- "redis.master"
- "cache.prod"
- ip: "192.168.3.45"
hostnames:
- "monitor.grafana"
应用配置:
kubectl apply -f pod-with-hostaliases.yaml
kubectl exec hostalias-demo -- cat /etc/hosts
2. 动态修改运行中的 Pod
通过 kubectl patch 命令即时更新 Hosts(需 Pod 允许重启):
kubectl patch pod hostalias-demo --type json \
-p '[{"op":"add","path":"/spec/hostAliases","value": [{"ip":"10.88.0.15","hostnames": ["test.env"]
}]
}]'
3. 注意事项
- 版本兼容性:K8s v1.7+ 支持
hostAliases - 优先级:HostAliases 条目位于系统生成内容之后
- DaemonSet/Deployment:需修改模板中的
spec.template.spec.hostAliases
附录:
正文完
2025-05-28