K8s系列之:DNS服务搭建指南

  • 一、skydns配置文件说明
  • 二、修改每台Node上的kubelet启动参数
  • 三、创建skydns RC和Service
  • 四、通过DNS查找Service
  • 五、DNS服务的工作原理解析

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

K8s提供的虚拟DNS服务名为skydns,由4个组件组成。

  • etcd:DNS存储
  • kube2sky:将K8s Master中的Service(服务注册到etcd)。
  • skyDNS:提供DNS域名解析服务
  • healthz:提供对skydns服务的健康检查功能。

一、skydns配置文件说明

skydns服务由一个RC和一个Service的定义组成,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义。

skydns的RC配置文件skydns-rc.yaml的内容如下,包含了4个容器的定义:
skydns-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:name: kube-dns-v11namespace: kube-systemlabels:k8s-app: kube-dnsversion: v11kubernetes.io/cluster-service: "true"
spec:replicas: 1selector:k8s-app: kube-dnsversion: v11template:metadata:labels:k8s-app: kube-dnsversion: v11kubernetes.io/cluster-service: "true"spec:containers:- name: etcdimage: gcr.io/google_containers/etcd-amd64:2.2.1resources:limits:cpu: 100mmemory: 50Mirequests:cpu: 100mmemory: 50Micommand:- /usr/local/bin/etcd- -data-dir- /tmp/data- -listen-client-urls- http://127.0.0.1:2379,http://127.0.0.1:4001- -advertise-client-urls- http://127.0.0.1:2379,http://127.0.0.1:4001- -initial-cluster-token- skydns-etcdvolumeMounts:- name: etcd-storagemountPath: /tmp/data- name: kube2skyimage: gcr.io/google_containers/kube2sky-amd64:1.15resources:limits:cpu: 100m#kube2sky watches all podsmemory: 50Mirequests:cpu: 100mmemory: 50MilivenessProbe:httpGet:path: /healthzport: 8080schema: HTTPinitialDelaySeconds: 60timeoutSeconds: 5successThreshold: 5successThreshold: 1failureThreshold: 5readinessProbe:httpGet:path: /readinessport: 8081schema: HTTPinitialDelaySeconds: 30timeoutSeconds: 5args:- --kube-master-url=http://192.168.18.3:8080- --domain=cluster.local- name: skydnsimage: gcr.io/google_containers/skydns:2015-10-13-8c72f8cresources:limits:cpu: 100mmemory: 50Mirequests:cpu: 100mmemory: 50Miargs:- -machines=http://127.0.0.1:4001- -addr=0.0.0.0:53- -ns-rotate=false- -domain=cluster.localports:- containerPort: 53name: dnsprotocol: UDP- containerPort: 53name: dns-tcpprotocol: TCP- name:image: gcr.io/google_containers/exechealthz:1.0resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Miargs:- -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null- -port=8080ports:- containerPort: 8080protocol: TCPvolumes:- name: etcd-storageemptyDir: {}dnsPolicy: Default

需要修改的几个配置参数如下:

  • kube2sky容器需要访问K8s Master,需要配置Master所在物理主机的IP地址和端口号,本例中设置参数–kube_master_url的值为http://192.168.18.3:8080

  • kube2sky容器和skydns容器的启动参数–domain,设置kubernetes集群中Service所属的域名,本例中为cluster.local。启动后,kube2sky会通过API Server监控集群中全部Service的定义,生成相应的记录并保存到etcd中。kube2sky为每个Service生成以下两条记录。

  • <service_name>.<namespace_name>.

  • <service_name>.<namespace_name>.svc.<domain>

  • skydns的启动参数-addr=0.0.0.0:53表示使用本机TCP和UDP的53端口提供服务。

skydns-svc.yaml

apiVersion: v1
kind: Service
metadata:name: kube-dnsnamespace: kube-systemlabels:k8s-app: kube-dnskubernetes.io/cluster-service: "true"kubernetes.io/name: "KubeDNS"
spec:selector:k8s-app: kube-dnsclusterIP: 169.169.0.100ports:- name: dnsport: 53protocol: UDP- name: dns-tcpport: 53protocol: TCP

注意:skydns服务使用的clusterIP需要指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kubernetes自动分配。

这个IP地址需要在kube-apiserver启动参数–service-cluster-ip-range指定的IP地址范围内。
在创建skydns容器之前,先修改每个Node上kubelet的启动参数。

二、修改每台Node上的kubelet启动参数

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

  • –cluster_dns=169.169.0.100:为DNS服务的ClusterIP地址
  • –cluster_domain=cluster.local:为DNS服务中设置的域名。

重启kubelet服务

三、创建skydns RC和Service

通过kubectl create完成skydns的RC和Service的创建:

kubectl create -f skydns-rc.yaml
kubectl create -f skydns-svc.yaml

查看RC、Pod和Service,确保容器成功启动:

kubectl get rc --namespace=kube-system
kubectl get pods --namespace=kube-system
kubectl get services --namespace=kube-system

为redis-master应用创建一个Service
redis-master-service.yaml

apiVersion: v1
kind: Service
metadata:name: redis-masterlabels:name: redis-master
spec:ports:- port: 6379targetPort: 6379selector:name: redis-master

查看创建好的redis-master service:

kubectl get services
NAME       CLUSTER-IP         EXTERNAL-IP     PORT(S)   AGE
redis-master    169.169.8.10    <none>        6379/TCP   1h

系统为redis-master服务分配了一个虚拟IP地址:169.169.8.10。

至此在K8s集群内虚拟DNS服务就搭建好了。在需要访问redis-master的应用中,仅需要配置上redis-master Service的名称和服务的端口号,就能够访问到redis-master应用了。

redis-slave镜像的启动脚本/run.sh的内容为:

if [[ ${GET_HOSTS_FROM:-dns} == "env" ]]; thenredis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379
elseredis-server --slaveof redis-master 6379
fi

在使用DNS模式的情况下,redis-slave配置的Master地址为:redis-master:6379。通过服务名进行配置,能够极大地简化客户端应用对后端服务变化的感知,包括服务虚拟IP地址的变化、服务后端Pod的变化等,对应用程序的微服务架构实现提供了强有力的支撑。

四、通过DNS查找Service

接下来使用一个带有nslookup工具的Pod来验证DNS服务是否能够正常工作。

busybox.yaml

apiVersion: v1
kind: Pod
metadata:name: busyboxnamespace: default
spec:containers:- name: busyboximage: gcr.io/google_containers/busyboxcommand:- sleep- "3600"

运行kubectl create -f busybox.yaml完成创建。

在该容器成功启动后,通过kubectl exec <container_id> nslookup进行测试。

kubectl exec busybox -- nslookup redis-master
Server:        169.169.0.100
Address 1:     169.169.0.100Name:          redis-master
Address 1:     169.169.8.10

可以看到,通过DNS服务器169.169.0.100成功找到了名为"redis-master"服务的IP地址:169.169.8.10.

如果某个Service属于不同的命名空间,在进行Service查找时,需要带上namespace的名字。下面以查找kube-dns服务为例:

kubectl exec busybox -- nslookup kube-dns.kube-system
Server: 169.169.0.100
Address 1: 169.169.0.100Name:    kube-dns.kube-system
Address 1: 169.169.0.100

仅使用kube-dns来进行查找,将会失败:
nslookup: can’t resolve ‘kube-dns’

五、DNS服务的工作原理解析

(1)kube2sky容器应用通过调用K8s Master的API获得集群中所有Service的信息,并持续监控新Service的生成,然后写入etcd中。

查看etcd中存储的Service信息:

kubectl exec kube-dns-v8-5tpm2 -c etcd --namespace=kube-system etcdctl ls /skydns/local/cluster/skydns/local/cluster/default
/skydns/local/cluster/svc
/skydns/local/cluster/kube-system

查看redis-master服务对应的键值:

kubectl exec kube-dns-v8-5tpm2 -c etcd --namespace=kube-system etcdctl get /skydns/local/cluster/default/redis-master{"host":"169.169.8.10","priority":10,"weight":10,"ttl":30,"targetstrip":0}

可以看到,redis-master服务对应的完整域名为redis-master.default.cluster.local,并且IP地址为169.169.8.10。

(2)根据kubelet启动参数的设置(–cluster_dns),kubelet会在每个新创建的Pod中设置DNS域名解析配置文件/etc/resolv.conf文件,在其中增加了一条namespace配置和一条search配置:

nameserver            169.169.0.100
search default.svc.cluster.local          svc.cluster.local          cluster.local     localdomain

通过名字服务器169.169.0.100访问的实际上就是skydns在53端口上提供的DNS解析服务。

(3)最后,应用程序就能够像访问网站域名一样,仅仅通过服务的名字就能访问到服务了。

以redis-slave为例,假设启动了redis-slave Pod,登陆redis-slave容器进行查看,可以看到其通过DNS域名服务找到了redis-master的IP地址169.169.8.10,并成功进行了连接。

K8s系列之:DNS服务搭建指南相关推荐

  1. Linux随笔16-主从DNS服务搭建以及智能DNS服务搭建、基于CentOS7.6编译安装MySQL-5.7.32

    Contents 1. DNS主从服务器搭建 1.1. DNS简介 1.2. DNS主从服务搭建 1.2.1. 主DNS服务器配置 1.2.2. 从DNS服务器配置 1.2.3. Web服务器准备 1 ...

  2. centos7下dns服务搭建

    centos7下dns服务搭建 第一步 环境准备 第二步 修改dns配置文件并启动dns 第三步 配置文件详解(摘抄) 第四步 测试dns服务 第一步 环境准备 1.配置网络 vi /etc/sysc ...

  3. 【k8s系列】一分钟搭建MicroK8s Dashboard

    本文基于上一篇文章的内容进行Dashboard搭建,如果没有看过上一篇的同学请先查阅上一篇文章 k8s系列]使用MicroK8s 5分钟搭建k8s集群含踩坑经验 使用MicroK8s搭建Dashboa ...

  4. DNS服务搭建和正反区域解析

    今天教大家如何在Linux上搭建DNS服务,希望大家支持,如果觉得好就给个赞吧. 首先装好bind全部软件包和caching-nameserver这个就不说了,可以用RPM软件包进行安装,系统镜像里面 ...

  5. Linux DNS服务详解——DNS服务搭建细节

    前几天,我陆续给大家介绍了DNS服务的相关内容,今天,我给大家补充介绍一下DNS服务中一些小问题. 前文链接: Linux DNS服务详解--DNS基础知识 Linux DNS服务详解--DNS实战配 ...

  6. linux bind 分离 DNS,Linux智能DNS服务搭建之Bind服务(一)

    一.准备工作 1.DNS学前准备 学习目标: 1.了解原理:dns实现原理及实际dns应用 2.动手搭建:掌握Bind服务的搭建过程及DNS测试方法 3.深入学习:dns负载均衡实现 4.掌握应用:只 ...

  7. DNS服务——搭建企业内网DNS服务器的作用

    前言 DNS服务--服务端 和 客户端 配置 介绍了如何在DNS安装DNS服务,更改一下配置文件就可以依据根提示解析全球域名.既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DN ...

  8. redhatEL7下的dns服务搭建以及ddns配置

    #################### ####配置dns服务器 #################### 服务器配置: yum install bind -y          ##安装dns服务 ...

  9. Gitea服务搭建指南

    1|0环境准备 常用的私有Git服务器包含GitLab.Gitea.Gogs等.相对来说,GitLab功能最为全面,内置CI,但对内存和CPU的要求比较高,而Gogs和Gitea均比较轻量化.根据实际 ...

最新文章

  1. 微生物组-扩增子16S分析研讨会(2020.1)
  2. ****** 三十五 ******、软设笔记【网络基础】-安全性、可靠性与系统性能评测-数据安全与保密...
  3. c语言设置程序自动执行,c语言如何设置程序进程执行优先权
  4. 用workbench给表重命名_MySQL Workbench的使用方法(图文)
  5. Oracle 常用伎俩和剧本
  6. Sightseeing Cows(POJ-3621)
  7. 详解PostgreSQL数据库中的两阶段锁
  8. P3930 SAC E#1 - 一道大水题 Knight
  9. springboot redis token_Spring Boot + Redis 实现接口幂等性,看这篇就太好了!
  10. cpu缓冲区大小怎么设置_遇到问题怎么办?手把手教你定位常见Java性能问题
  11. 北漂码农的我,把在大城市过成了屯子一样舒服,哈哈哈哈哈!
  12. 【python】微信朋友圈分析
  13. 中柏平板刷linux教程,中柏 ezpad 平板安装Fedora 21 (Linux)
  14. 如何在微信小程序开发中添加组件?
  15. 服务器ae是什么位置,ae 渲染服务器
  16. pyecharts画饼形图,圆形图,环形图(含百分比显示)【python干货】
  17. Chrome网页接口测试工具
  18. 关于 Python Pip的安装
  19. arcgis新建图层信息复制_怎么在arcgis中把一个图层复制到另一个图层上
  20. [文献精读] End-to-End Model-Free Reinforcement Learning for Urban Driving using Implicit Affordances

热门文章

  1. IDL---批量波段合成(只要点击运行,自动化处理,解放生产力)
  2. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法
  3. redis专题-----11-----redis订阅发布以及stream
  4. Linux中awk后面的RS, ORS, FS, OFS 用法
  5. 乐山计算机学校军训,心有多大,舞台就有多大!乐山这名中职学生考上双一流211重点大学...
  6. matlab 贪吃的蛇,贪吃的蛇教案
  7. 易知微母公司袋鼠云获过亿元C+轮融资,深耕国产自研数字化领域
  8. 【Qualcomm】浏览器无法登录高通网站的修改方法
  9. GB28181实现对安防摄像头的直播回放控制
  10. oracle profile 参数,oracle profile的参数详解