kubernetes Service-04 DNS 配置

概述

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

CoreDNS是一个高效、模块化且可扩展的DNS服务器,它在k8s集群中自动部署并配置,以响应集群内Pod和ServiceDNS查询。当创建一个新的Service后,Kubernetes会自动为其生成对应的DNS记录,使得其他Pod可以通过服务名访问到该ServiceCluster 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服务能否正常工作

测试 PodService

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 策略

  • DefaultPod继承其所在Node节点的DNS配置。
  • ClusterFirst (默认策略):Pod首先查询由Kubernetes集群提供的内部DNS服务(如CoreDNS),尝试解析服务名和集群内部的DNS条目;如果集群DNS服务不能解析,则请求转发给节点的DNS配置。
  • ClusterFirstWithHostNet :类似ClusterFirst,但特别适用于那些使用hostNetwork模式运行的Pod,确保它们也能正确使用集群DNS
  • NoneKubernetes不会为Pod提供任何默认的DNS配置,此时需要在Podspec.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配置。

结语

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

相关推荐
❀͜͡傀儡师4 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community5 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao5 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
回忆是昨天里的海5 小时前
k8s暴露服务-Ingress环境部署
云原生·容器·kubernetes
tzhou644526 小时前
Kubernetes Pod 入门
云原生·容器·kubernetes
java_logo6 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer7 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟7 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝7 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手7 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker