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

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

01 引言

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

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

02 DNS服务在k8s的发展

2.1 SkyDNS

在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

从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

从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命令依次把资源对象创建,然后可以看到创建成功:

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进行测试:

可以看到,通过DNS服务器 169.169.0.100 成功解析了redis-master服务的IP地址 169.169.8.10


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

下面以查找kube-dns服务为例,将其所在**Namespace“kube-system”**补充在服务名之后,用 “.” 连接为“kube- dns.kube-system,即可查询成功:

如果仅使用 “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服务搭建与配置,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
9月前
|
弹性计算 运维 安全
优化管理与服务:操作系统控制平台的订阅功能解析
本文介绍了如何通过操作系统控制平台提升系统效率,优化资源利用。首先,通过阿里云官方平台开通服务并安装SysOM组件,体验操作系统控制平台的功能。接着,详细讲解了订阅管理功能,包括创建订阅、查看和管理ECS实例的私有YUM仓库权限。订阅私有YUM仓库能够集中管理软件包版本、提升安全性,并提供灵活的配置选项。最后总结指出,使用阿里云的订阅和私有YUM仓库功能,可以提高系统可靠性和运维效率,确保业务顺畅运行。
|
5月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
7月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
276 4
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
479 3
|
10月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
336 3
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
249 0
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
917 29

推荐镜像

更多