k8s教程(service篇)-DNS服务搭建和配置

这篇具有很好参考价值的文章主要介绍了k8s教程(service篇)-DNS服务搭建和配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP地址的解析。

02 DNS服务在k8s的发展

2.1 SkyDNS

k8s教程(service篇)-DNS服务搭建和配置

在Kubernetes1.2版本时,DNS服务是由SkyDNS提供的,它由4个容器组成(kube2sky、skydns、etcd和healthz):

  • kube2sky容器:监控Kubernetes中Service 资源的变化,根据Service的名称和IP地址信息生成DNS记录,并将其保存到etcd 中;
  • skydns容器:从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务
  • healthz容器:提供对skydns服务的健康检查功能。

2.2 KubeDNS

k8s教程(service篇)-DNS服务搭建和配置

从Kubernetes1.4版本开始,SkyDNS组件便被KubeDNS替换,主要考虑的是SkyDNS组件之间通信较多,整体性能不高

KubeDNS由3个容器组成(kubedns、dnsmasq和sidecar),去掉了SkyDNS中的etcd存储,将DNS记录直接保存在内存中,以提高查询性能:

  • kubedns容器 :监控Kubernetes中Service资源的变化,根据Service的名称和IP地址生成DNS记录,并将DNS记录保存在内存中;
  • dnsmasq容器:从kubedns中获取DNS记录,提供DrS缓存,为客户端容器应用提供DNS查询服务;
  • sidecar容器:提供对kubedns和dnsmasq服务的健康检查功能。

2.3 CoreDNS

k8s教程(service篇)-DNS服务搭建和配置
从Kubernetes1.11版本开始,Kubernetes集群的DNS服务由CoreDNS提供

  • 它是由go语言实现的一套高性能、插件式,易于扩展的DNS服务端;
  • 解决了KubeDNS的一些问题, 例如dnsmasq的安全漏洞、externalName不能使用stubDomains进行设置等等;
  • 支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS;
  • 它没有使用多个容器的架构,只用一个容器便实现了KubeDNS内3个容器的全部功能。

03 搭建CoreDNS服务

3.1 修改每个Node上kubelet的DNS启动参数

修改每个Node上kubelet的启动参数,在其中加上以下两个参数:

  • --cluster-dns=169.169.0.100:为DNS服务的ClusterIP地址。
  • --cluster-domain=cluster.local:为在DNS服务中设置的域名。

然后重启kubelet服务。

3.2 部署CoreDNS服务

部署CoreDNS服务时需要创建3个资源对象:1个ConfigMap、1个Deployment和1个Service

在启用了RBAC的集群中,还可以设置ServiceAccount、ClusterRole 、ClusterRoleBinding对CoreDNS容器进行权限设置。

3.2.1 ConfigMap

ConfigMap 的 “coredns” 主要设置CoreDNS的主配置文件Corefile的内容,其中可以定义各种域名的解析方式和使用的插件,示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
	name: coredns
	namespace: kube-system 
	labels: 
		addonmanager.kubernetes.io/mode: EnsureExists
data:
	Corefile: | 
		cluster.local{
			errors
			health{
				lameduck 5s 
			}
			ready
			kubernetes cluster.local 169.169.0.0/16{ 
				fallthrough in-addr.arpa ip6.arpa
			}
			prometheus: 9153
			forward	./etc/resolv.conf 
			cache 30 
			loop
			reload
			loadbalance
		}
		. {
			cache 30 
			loadbalance
			forward /etc/resolv.conf
		}

3.2.2 Deployment

Deployment 的“coredns” 主要设置CoreDNS容器应用的内容。

其中,replicas副本的数量通常应该根据集群的规模和服务数量确定,如果单个CoreDNS进程不足以支撑整个集群的DNS查询,则可以通过水平扩展提高查询能力。由于DNS服务是Kubernetes集群的关键核心服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量。

另外,对资源限制部分(CPU限制和内存限制)的设置也应根据实际环境进行调整:

apiversion: apps/v1
kind: Deployment
metadata:
	name: coredns
	namespace: kube-system 
	labels:
		k8s-app: kube-dns
		kubernetes.io/name: "CoreDNS"
spec:
	replicas: 1
	strategy:
		type: RollingUpdate
		rollingUpdate:
			maxUnavailable: 1
	selector:
		matchLabels: 
			k8s-app: kube-dns
	template:
		metadata:
			labels:
				k8s-app: kube-dns
		spec:
		priorityClassName: system-cluster-critical 
		tolerations:
			- key: "CriticalAddonsonly"
			  operator: "Exists"
		nodeSelector:
			kubernetes.io/os: linux 
		affinity:
			podAntiAffinity:
			preferredDuringSchedulingIgnoredDuringExecution: 
			- weight: 100
			  podAffinityTerm:
			  	labelSelector:
					matchExpressions:
					- key: k8s-app
			          operator: In
			          values: ["kube-dns"]
			    topologyKey: kubernetes.io/hostname
		containers:
		- name: coredns
		  image: coredns/coredns:1.7.0 
		  imagePullPolicy: IfNotPresent
		  resources:
		    limits:
		      memory: 170Mi
		    requests:
		      cpu: 100m
		      memory: 70Mi
		  args: ["-conf","/etc/coredns/Corefile" ]
		volumeMounts:
		- name: config-volume 
		  mountPath: /etc/coredns 
		  readOnly: true
		ports:
		- containerPort: 53
		  name: dns
		  protocol: UDP
		- containerPort: 53
		  name: dns-tcp
		  protocol: TCP
		- containerPort: 9153
		  name: metrics
		  protocol: TCP
		securityContext:
		  allowPrivilegeEscalation: false
		  capabilities:
		    add:
		    - NET_BIND_SERVICE
		    drop:
		    - a11
		  readOnlyRootFilesystem: true 
		livenessProbe:
		  httpGet:
		    path: /health
		    port: 8080
		    scheme: HTTP
		  initialDelaySeconds: 60 
		  timeoutSeconds: 5
		  successThreshold: 1
		  failureThreshold: 5
		readinessProbe:
		  httpGet:
		    path: /ready
		    port: 8181
		    scheme: HTTP
		dnsPolicy: Default
		volumes:
		- name: config-volume
		  configMap:
		    name: coredns
		    items:
		    - key: Corefile
		      path: Corefile

3.2.3 Service

Service“kube-dns” 是DNS服务的配置,这个服务需要设置固定的ClusterIP地址,也需要将所有Node上的kubelet启动参数--cluster-dns都设置为这个ClusterIP 地址:

apiVersion: v1
kind: Service
metadata:
	name: kube-dns
	namespace: kube-system 
	annotations:
		prometheus.io/port: "9153" 
		prometheus.io/scrape: "true" 
	labels:
		k8s-app: kube-dns
		kubernetes.io/cluster-service: "true" 
		kubernetes.io/name: "CoreDNS" 
spec:
	selector:
		k8s-app: kube-dns
	clusterIP: 169.169.0.100 
	ports:
	- name: dns
	  port: 53
	  protocol: UDP
	- name: dns-tcp
	  port: 53
	  protocol: TCP
	- name: metrics
	  port: 9153
	  protocol: TCP

使用kubectl create命令依次把资源对象创建,然后可以看到创建成功:
k8s教程(service篇)-DNS服务搭建和配置

04 服务名的DNS解析

接下来使用一个带有 nslookup工具 的pod来验证DNS是否正常工作。

apiVersion: v1
kind: Pod
metadata:
	name: busybox
	namespace: default
spec:
containers:
- name: busybox
  image: gcr.io/google containers/busybox 
  command:
	- sleep
	- "3600"

在该容器成功启动后,通过kubectl exec<container_id>--nslookup进行测试:
k8s教程(service篇)-DNS服务搭建和配置
可以看到,通过DNS服务器 169.169.0.100 成功解析了redis-master服务的IP地址 169.169.8.10


如果某个Service属于不同的命名空间,那么在进行Service查找时,需要补充
Namespace的名称,将其组合成完整的域名

下面以查找kube-dns服务为例,将其所在**Namespace“kube-system”**补充在服务名之后,用 “.” 连接为 “kube- dns.kube-system,即可查询成功:
k8s教程(service篇)-DNS服务搭建和配置
如果仅使用 “kube-dns” 进行查找,则会失败:

nslookup: can't resolve 'kube-dns'

05 CoreDNS配置

CoreDNS的主要功能是通过插件系统实现的,CoreDNS实现了一种链式插件结构,将DNS的逻辑抽象成了一个个插件,能够灵活组合使用。常用的插件如下:

插件 描述
loadbalance 提供基于DNS的负载均衡功能
loop 检测在DNS解析过程中出现的简单循环问题
cache 提供前端缓存功能
health 对Endpoint进行健康检查
kubernetes 从Kubernetes中读取zone数据
etcd 从etcd中读取zone数据,可用于自定义域名记录
file 从RFC 1035格式文件中读取zone数据
hosts 使用/etc/hosts文件或者其他文件读取zone数据,可用于自定义域名记录
auto 从磁盘中自动加载区域文件
reload 定时自动重新加载Corefile配置文件的内容
forward 转发域名查询到上游DNS服务器上
prometheus 为Prometheus系统提供采集性能指标数据的URL
pprof 在URL路径/debug/pprof下提供运行时的性能数据
log 对DNS查询进行日志记录
errors 对错误信息进行日志记录

5.1 示例一:设置插件

在下面的示例中为域名 “cluster.local” 设置了一系列插件,包括errors、 health、ready、kubernetes、prometheus、forward、cache、loop、reload和 loadbalance,在进行域名解析时,这些插件将以从上到下的顺序依次执行:

cluster.local {
	errors
	health{
		lameduck 5s
	}
	ready
	kubernetes cluster.local 169.169.0.0/16 {
		fallthrough in-addr.arpa ip6.arpa
	}
	prometheus: 9153
	forward	./etc/resolv.conf 
	cache 30 
	loop
	reload
	loadbalance
}

5.2 示例二:自定义域名

另外,etcd和hosts插件都可以用于用户自定义域名记录

下面是使用etcd插件的配置示例,将以“.com”结尾的域名记录配置为从etcd中获取,并将域名记录保存在/skydns路径下:

{
	etcd com{
		path /skydns
		endpoint http://192.168.18.3:2379 
		upstream /etc/resolv.conf 
	}
	cache 160 com 
	loadbalance
	proxy /etc/resolv.conf
}

如果用户在etcd中插入一条“10.1.1.1 mycompany” DNS记录:

$ ETCDCTL_API=3 etcdctl put "/skydns/com/mycompany" '["host":"10.1.1.","ttl":60]'

客户端应用就能访问域名"mycompany.com"了:

$ nslookup mycompany.com
Server:				169.169.0.100
Address:			169.169.0.100#53

Name:				mycompany.com
Address:			10.1.1.1

5.3 示例三:转发域名查询到上游DNS服务器上

forward插件用于配置上游DNS服务器或其他DNS服务器,当在CoreDNS中查
询不到域名时,会到其他DNS服务器上进行查询。在实际环境中,可以将Kubernetes集群外部的DNS纳入CoreDNS,进行统一的DNS管理。

06 引言

本文主要讲解k8s里面的DNS服务搭建与配置,希望能帮助到大家,谢谢大家的阅读,本文完!文章来源地址https://www.toymoban.com/news/detail-472336.html

到了这里,关于k8s教程(service篇)-DNS服务搭建和配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S之服务Service(十三)

     二,Pod与Service的关系 Service通过标签关联一组Pod Service为一组Pod提供负载均衡能力  三,定义与创建 创建service: kubectl apply -f service.yaml 查看service: kubectl get service  四,服务类型 • ClusterIP:集群内部使用 • NodePort:对外暴露应用 • LoadBalancer:对外暴露应用,适用公有云

    2024年02月08日
    浏览(36)
  • 从业务出发,K8S环境自建和非自建整体架构设计比较

    新钛云服已累计为您分享 751 篇技术干货 随着数字化转型的大潮到来,越来越多的企业开始上云,同时也纷纷加入到微服务和K8S队伍中。但在K8S整体环境究竟应该用自建的还是非自建?以及他们需要用到的服务,究竟应该自建还是直接用PAAS服务?这些问题往往会困扰住大家。

    2024年02月09日
    浏览(39)
  • k8s-服务发现service和ingress

    回到目录 service用于集群内部应用的网络调用,处理东西流量 ingress用于集群外部用户访问内部服务,处理南北流量 kubernetes集群中有三层网络,一类是真实存在的,例如Node Network、Pod Network,提供真实IP地址;一类是虚拟的,例如Cluster Network或Service Network,提供虚拟IP地址,不会

    2024年02月14日
    浏览(47)
  • 持续集成部署-k8s-服务发现-Service

    在K8s中, Service 是一种可以暴露一个或多个 Pod 的稳定的网络终点,从而形成逻辑上的应用服务单元,为服务发现、负载均衡、容错等提供了基础设施支持。 Service 的主要作用包括以下几个方面: 1. 实现内部服务发现 :在K8s中,往往会有多个 Pod 运行同一种应用服务, Servi

    2024年02月08日
    浏览(56)
  • Kubernetes(k8s)服务service:service的发现和service的发布

    目录 一.系统环境 二.前言 三.Kubernetes service简介 四.使用hostPort向外界暴露应用程序 4.1 创建deploy 4.2 使用hostPort向外界暴露pod的端口 五.使用service服务向外界暴露应用程序 5.1 使用service服务向外界暴露pod 5.1.1 创建service服务 5.1.2 测试svc的负载均衡 六.service服务的发现 6.1 使用

    2024年02月08日
    浏览(54)
  • k8s 中的无头服务 (Headless Services)

            有时候我们不需要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 \\\"None\\\" 来创建无头服务。通过无头服务的标签选择器(Label Selector)可以将后端的 Pod 列表返回给调用的客户端。         对于无头服务,不会为其分

    2024年02月15日
    浏览(42)
  • Kubernetes技术--k8s核心技术Service服务

    1.service概述         Service 是 Kubernetes 最核心概念, 通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上 。 2.service存在的意义 -1: 防止pod失联(服务发现) 我们先说一下什么叫pod失联。     -2:

    2024年02月10日
    浏览(43)
  • k8s服务发现之第二弹Service详解

    Kubernetes Servies 是一个 RESTFul 接口对象,可通过 yaml 文件创建。 例如,假设您有一组 Pod: 每个 Pod 都监听 9376 TCP 端口 每个 Pod 都有标签 app=MyApp 上述 YAML 文件可用来创建一个 Service: 名字为 my-service 目标端口为 TCP 9376 选取所有包含标签 app=MyApp 的 Pod 关于 Service,您还需要了解

    2024年02月16日
    浏览(47)
  • k8s服务发现之第一弹Service概述

    Kubernetes 中 Pod 是随时可以消亡的(节点故障、容器内应用程序错误等原因)。如果使用 Deployment 运行您的应用程序,Deployment 将会在 Pod 消亡后再创建一个新的 Pod 以维持所需要的副本数。每一个 Pod 有自己的 IP 地址,然而,对于 Deployment 而言,对应 Pod 集合是动态变化的。

    2024年02月12日
    浏览(48)
  • 阿里云使用SLB实现k8s的服务service

    k8s容器的服务service实现有以下常用方式: NodePort 用于为集群外部访问Service后面Pod提供访问接入端口。 开发测试环境,可以使用这种方式,不依赖其他中间件。 好处是,可以访问Node节点的IP+${NodePort} 比如Node节点的IP地址是192.168.80.180,NodePort的端口是31767。那么外部访问地址

    2024年01月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包