K8s系列之:DNS服务搭建指南
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服务搭建指南相关推荐
- 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 ...
- centos7下dns服务搭建
centos7下dns服务搭建 第一步 环境准备 第二步 修改dns配置文件并启动dns 第三步 配置文件详解(摘抄) 第四步 测试dns服务 第一步 环境准备 1.配置网络 vi /etc/sysc ...
- 【k8s系列】一分钟搭建MicroK8s Dashboard
本文基于上一篇文章的内容进行Dashboard搭建,如果没有看过上一篇的同学请先查阅上一篇文章 k8s系列]使用MicroK8s 5分钟搭建k8s集群含踩坑经验 使用MicroK8s搭建Dashboa ...
- DNS服务搭建和正反区域解析
今天教大家如何在Linux上搭建DNS服务,希望大家支持,如果觉得好就给个赞吧. 首先装好bind全部软件包和caching-nameserver这个就不说了,可以用RPM软件包进行安装,系统镜像里面 ...
- Linux DNS服务详解——DNS服务搭建细节
前几天,我陆续给大家介绍了DNS服务的相关内容,今天,我给大家补充介绍一下DNS服务中一些小问题. 前文链接: Linux DNS服务详解--DNS基础知识 Linux DNS服务详解--DNS实战配 ...
- linux bind 分离 DNS,Linux智能DNS服务搭建之Bind服务(一)
一.准备工作 1.DNS学前准备 学习目标: 1.了解原理:dns实现原理及实际dns应用 2.动手搭建:掌握Bind服务的搭建过程及DNS测试方法 3.深入学习:dns负载均衡实现 4.掌握应用:只 ...
- DNS服务——搭建企业内网DNS服务器的作用
前言 DNS服务--服务端 和 客户端 配置 介绍了如何在DNS安装DNS服务,更改一下配置文件就可以依据根提示解析全球域名.既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DN ...
- redhatEL7下的dns服务搭建以及ddns配置
#################### ####配置dns服务器 #################### 服务器配置: yum install bind -y ##安装dns服务 ...
- Gitea服务搭建指南
1|0环境准备 常用的私有Git服务器包含GitLab.Gitea.Gogs等.相对来说,GitLab功能最为全面,内置CI,但对内存和CPU的要求比较高,而Gogs和Gitea均比较轻量化.根据实际 ...
最新文章
- 微生物组-扩增子16S分析研讨会(2020.1)
- ****** 三十五 ******、软设笔记【网络基础】-安全性、可靠性与系统性能评测-数据安全与保密...
- c语言设置程序自动执行,c语言如何设置程序进程执行优先权
- 用workbench给表重命名_MySQL Workbench的使用方法(图文)
- Oracle 常用伎俩和剧本
- Sightseeing Cows(POJ-3621)
- 详解PostgreSQL数据库中的两阶段锁
- P3930 SAC E#1 - 一道大水题 Knight
- springboot redis token_Spring Boot + Redis 实现接口幂等性,看这篇就太好了!
- cpu缓冲区大小怎么设置_遇到问题怎么办?手把手教你定位常见Java性能问题
- 北漂码农的我,把在大城市过成了屯子一样舒服,哈哈哈哈哈!
- 【python】微信朋友圈分析
- 中柏平板刷linux教程,中柏 ezpad 平板安装Fedora 21 (Linux)
- 如何在微信小程序开发中添加组件?
- 服务器ae是什么位置,ae 渲染服务器
- pyecharts画饼形图,圆形图,环形图(含百分比显示)【python干货】
- Chrome网页接口测试工具
- 关于 Python Pip的安装
- arcgis新建图层信息复制_怎么在arcgis中把一个图层复制到另一个图层上
- [文献精读] End-to-End Model-Free Reinforcement Learning for Urban Driving using Implicit Affordances
热门文章
- IDL---批量波段合成(只要点击运行,自动化处理,解放生产力)
- linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法
- redis专题-----11-----redis订阅发布以及stream
- Linux中awk后面的RS, ORS, FS, OFS 用法
- 乐山计算机学校军训,心有多大,舞台就有多大!乐山这名中职学生考上双一流211重点大学...
- matlab 贪吃的蛇,贪吃的蛇教案
- 易知微母公司袋鼠云获过亿元C+轮融资,深耕国产自研数字化领域
- 【Qualcomm】浏览器无法登录高通网站的修改方法
- GB28181实现对安防摄像头的直播回放控制
- oracle profile 参数,oracle profile的参数详解