本文主要介绍Kubernetes集群中DNS域名解析原理和在SCE集群中安装DNS服务器CoreDNS。
背景信息
DNS为Kubernetes集群内的工作负载提供域名解析服务。CoreDNS是Kubernetes集群中负责DNS解析的组件,能够支持解析集群内部自定义服务域名和集群外部域名。CoreDNS具备丰富的插件集,在集群层面支持自建DNS、自定义hosts、CNAME、rewrite等需求。与Kubernetes一样,CoreDNS项目由 CNCF托管,关于CoreDNS的更多信息,可浏览CoreDNS的官网。SCE集群使用CoreDNS负责集群的服务发现,您可以根据不同使用场景配置CoreDNS及使用CoreDNS提升集群DNS QPS性能。
前提条件
- 确保您已经创建SCE集群,具体操作请参阅创建SCE集群。
- 确保kubectl工具已经连接目标集群。
操作步骤
步骤一:安装CoreDNS插件
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“插件”下的“插件市场”,安装CoreDNS插件。
- 提交“安装插件”,稍后会在集群中创建2个coredns pod,集群会根据Pod内的配置,将域名请求发往集群DNS服务器获取结果。
- 查看coredns是否正常运行。
步骤二:创建Nginx工作负载,以及service
- 创建无状态工作负载,参考如下:
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
name: "nginx-deploy"
namespace: "default"
spec:
replicas: 2
selector:
matchLabels:
name: "nginx-deploy"
template:
metadata:
labels:
name: "nginx-deploy"
source:"CCSE"
spec:
containers:
- image: "registry-vpc-crs-huadong1.ctyun.cn/open-source/nginx:1.25-alpine-amd64"
imagePullPolicy: "IfNotPresent"
name: "nginx"
- 查看nginx pod是否正常运行,从eci控制台进入pod容器内部。
kubectl get po -ndefault |grep nginx
查看Pod内的DNS域名解析配置文件为/etc/resolv.conf,文件内容如下:
nameserver 10.96.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
- 创建service,参考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy
namespace: default
spec:
ports:
- name: tcp80
port: 30002
protocol: TCP
targetPort: 80
selector:
name: nginx-deploy
type: ClusterIP
步骤三:访问Nginx服务
- 当业务Pod(Pod Client)试图访问Nginx服务(Service Nginx)时,先会请求本地DNS配置文件(/etc/resolv.conf)中指向的DNS服务器(nameserver 10.96.0.10,即Service kube-dns)获取服务IP地址,得到解析结果为10.96.84.23的IP地址。
- 业务Pod(Pod Client)再直接发起往该IP地址的请求,请求最终经过Nginx服务(Service Nginx)转发到达后端的Nginx容器(Pod Nginx-1和Pod Nginx-2)上。