kubernetes Service-04 DNS 配置

概述

在Kubernetes(k8s)集群中,DNS服务是其核心组件之一,用于实现服务发现,允许Pod之间通过域名而非硬编码的IP地址相互通信。早期K8s使用SkyDNS作为DNS解决方案,之后过渡到了KubeDNS,而现在默认的DNS服务则是CoreDNS。

CoreDNS是一个高效、模块化且可扩展的DNS服务器,它在k8s集群中自动部署并配置,以响应集群内Pod和Service的DNS查询。当创建一个新的Service后,Kubernetes会自动为其生成对应的DNS记录,使得其他Pod可以通过服务名访问到该Service的Cluster IP。

在集群节点层面,kubelet在启动时会配置相应的DNS参数,确保Pod的/etc/resolv.conf文件包含集群DNS服务的地址作为首选DNS服务器。这样,Pod内部发起的DNS查询会被转发至CoreDNS服务,进而解析成正确的服务IP地址。

CoreDNS 架构图

查看RC、Pod、Service状态

bash 复制代码
[root@master1 ~]# kubectl get deployment -n kube-system
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
coredns                   2/2     2            2           34d

[root@master1 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-bvwt6                   1/1     Running   15         34d
coredns-7f89b7bc75-vdrdn                   1/1     Running   15         34d

[root@master1 ~]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.10.0.10   <none>        53/UDP,53/TCP,9153/TCP   34d

服务名的 DNS 解析

通过一个带有nslookup工具的Pod来验证DNS服务能否正常工作

测试 Pod 和 Service

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30660
  selector:
    app: webapp
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    image: tomcat
    imagePullPolicy: Never
    ports:
    - containerPort: 8080
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: busybox
    image: busybox:1.28.3
    command:
    - sleep
    - "3600"

运行并查看结果

bash 复制代码
[root@master1 service]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   0          3m58s
webapp    1/1     Running   1          6d

[root@master1 service]# kubectl get svc
NAME     TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
webapp   NodePort   10.10.157.91   <none>        8080:30660/TCP   6d

[root@master1 service]# kubectl exec busybox -- nslookup webapp
Server:    10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local

Name:      webapp
Address 1: 10.10.157.91 webapp.pod-ns.svc.cluster.local

可以看到,通过DNS服务器 10.10.0.10 找到 webapp 服务IP地址 10.10.157.91

Pod 级别 DNS 配置说明

除了使用集群范围的 DNS 服务,在 Pod级别也能设置DNS的相关策略和配置

DNS 策略

  • Default :Pod继承其所在Node节点的DNS配置。
  • ClusterFirst (默认策略):Pod首先查询由Kubernetes集群提供的内部DNS服务(如CoreDNS),尝试解析服务名和集群内部的DNS条目;如果集群DNS服务不能解析,则请求转发给节点的DNS配置。
  • ClusterFirstWithHostNet :类似ClusterFirst,但特别适用于那些使用hostNetwork模式运行的Pod,确保它们也能正确使用集群DNS。
  • None :Kubernetes不会为Pod提供任何默认的DNS配置,此时需要在Pod的spec.dnsConfig字段下显式地指定DNS服务器、搜索域和其他DNS参数。
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  dnsPolicy: Default

自定义 DNS 配置

  • nameservers :一组DNS服务列表,最多设置3个。
  • searches :用于域名搜索的DNS域名后缀,最多设置6个
  • options :设置其他可选DNS参数。
yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: dns-example
spec:
  containers:
  - name: test
    image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
    - 1.2.3.4
    searches:
    - ns1.svc.cluster.local
    - my.dns.search.suffix
    options:
    - name: ndots
      value: "2"
    - name: edns0

运行并查看结果

bash 复制代码
[root@master1 service]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
dns-example   1/1     Running   0          18s

[root@master1 service]# kubectl exec dns-example -- more /etc/resolv.conf
::::::::::::::
/etc/resolv.conf
::::::::::::::
nameserver 1.2.3.4
search ns1.svc.cluster.local my.dns.search.suffix
options ndots:2 edns0

表示该Pod完全使用自定义的DNS配置。

结语

K8s的DNS服务简化了服务间通信,确保了服务发现的稳定性和可靠性,是支撑云原生应用在Kubernetes环境下平滑运行的关键基础设施。用户可以根据需要自定义CoreDNS配置,比如添加上游DNS服务器以便内外部域名解析等。

相关推荐
VIP_CQCRE23 分钟前
给团队搭一个 AI 工作台:Open WebUI 接入 Ace Data Cloud 实战
docker·ai·rag·open webui·ace data cloud
程序员老赵4 小时前
Docker 部署 Portainer CE:轻松搭建容器管理平台
docker·容器·开源
TTATTC4 小时前
Gmail、Drive、日历共用一套命令:gws 如何在运行时把 Discovery 文档编译成 CLI
docker·开源
大侠归来5 小时前
Docker 部署 Dolibarr:从零开始的完整指南
运维·docker·容器
七月吃橘子5 小时前
WSL2+Docker+Ollama,本地部署大模型实践(Qwen1.8b)
运维·docker·容器
Nontee6 小时前
K3s vs K8s:差的不是功能,是交付方式
云原生·容器·kubernetes
做运维的阿瑞6 小时前
Docker常见故障全方位排查指南
运维·docker·云原生·容器
木子欢儿6 小时前
Zabbix 7.4 Alpine 版 Docker Compose 部署
android·运维·docker·容器·zabbix
朱包林7 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
打工仔折腾 AI7 小时前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战