k8s之DNS服务器搭建
一、导读
在使用k8s部署springboot+redis简单应用这篇文章中,spring boot连接redis是直接使用的IP连接,那么可不可以直接使用服务名称进行连接呢?答案是可以的,这就是k8s集群范围内的DNS服务来完成服务名到ClusterIP的解析,接下来就一起看一下如何搭建DNS服务器。
二、搭建DNS服务器
(1)简介
k8s提供的DNS服务是skydns,由四个组件组成
- etcd:DNS信息存储
- kube2sky:监控k8s中Service资源的变化,根据Service的名称的IP地址信息生成DNS记录,并将其保存到etcd中
- skyDNS:从etcd中读取DNS信息,并提供DNS查询服务
- healthz:提供对skydns服务的健康检查功能
(2)skydns配置文件说明
skydns服务有一个RC和一个Service组成,分别由配置文件skydns-rc.yaml和skydns-svc.yaml定义。
skydns-rc.yaml包含了四个容器的定义:
- apiVersion: v1
- kind: ReplicationController
- metadata:
- name: kube-dns-v8
- namespace: kube-system
- labels:
- k8s-app: kube-dns
- version: v8
- kubernetes.io/cluster-service: "true"
- spec:
- replicas: 1
- selector:
- k8s-app: kube-dns
- version: v8
- template:
- metadata:
- labels:
- k8s-app: kube-dns
- version: v8
- kubernetes.io/cluster-service: "true"
- spec:
- containers:
- - name: etcd
- image: empiregeneral/etcd-amd64:latest
- resources:
- limits:
- cpu: 100m
- memory: 50Mi
- command:
- - /usr/local/bin/etcd
- - -data-dir
- - /var/etcd/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-etcd
- volumeMounts:
- - name: etcd-storage
- mountPath: /var/etcd/data
- - name: kube2sky
- image: syncgooglecontainers/kube2sky-amd64:1.15
- resources:
- limits:
- cpu: 100m
- memory: 50Mi
- args:
- - --domain=cluster.local
- - --kube_master_url=http://192.168.197.100:8080
- - name: skydns
- image: yaronr/skydns:latest
- resources:
- limits:
- cpu: 100m
- memory: 50Mi
- args:
- - -machines=http://localhost:4001
- - -addr=0.0.0.0:53
- - -domain=cluster.local
- ports:
- - containerPort: 53
- name: dns
- protocol: UDP
- - containerPort: 53
- name: dns-tcp
- protocol: TCP
- livenessProbe:
- httpGet:
- path: /healthz
- port: 8080
- scheme: HTTP
- initialDelaySeconds: 30
- timeoutSeconds: 5
- - name: healthz
- image: syncgooglecontainers/exechealthz:1.1
- resources:
- limits:
- cpu: 10m
- memory: 20Mi
- args:
- - -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null
- - -port=8080
- ports:
- - containerPort: 8080
- protocol: TCP
- volumes:
- - name: etcd-storage
- emptyDir: {}
- dnsPolicy: Default # Don't use cluster DNS.
上述需要注意的是,需要将
- --kube_master_url=http://192.168.197.100:8080
改成集群中master的IP,镜像如果下载失败,可从docker hub里面找,我就是从docker hub里面找到相应的镜像。
skydns-svc.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: kube-dns
- namespace: kube-system
- labels:
- k8s-app: kube-dns
- kubernetes.io/cluster-service: "true"
- kubernetes.io/name: "KubeDNS"
- spec:
- selector:
- k8s-app: kube-dns
- clusterIP: 10.96.0.10
- ports:
- - name: dns
- port: 53
- protocol: UDP
- - name: dns-tcp
- port: 53
- protocol: TCP
需要指定一个clusterIP,不能靠k8s自动分配,每个Node的kubelet都是用这个IP地址,另外,这个IP需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP范围内
kube-apiserver的配置文件在/etc/kubernetes/manifests目录下:
(3)修改每台Node上的kubelet参数
添加以下两个参数:
- --cluster_dns=169.169.0.100: 为dns服务的clusterIP地址
- --cluster_domain=cluster.local: 为dns服务中设置的域名
比如我这边的是这样:
- vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
- #添加如下一行
- Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
然后重启kubelet,使用ps -ef | grep kubelet查看是否生效
重启kubelet
- systemctl stop kubelet
- systemctl daemon-reload
- systemctl start kubelet
修改完参数之后,启动dns
- kubectl create -f skydns-rc.yaml
- kubectl create -f skydns-svc.yaml
(4)验证
启动一个busybox容器。
- apiVersion: v1
- kind: Pod
- metadata:
- name: busybox
- labels:
- name: busybox
- namespace: default
- spec:
- containers:
- - image: busybox
- imagePullPolicy: IfNotPresent
- command:
- - sleep
- - "3600"
- name: busybox
- restartPolicy: Always
启动之后进入容器内部:
nsloogup 服务名
可知解析后的ip是10.102.184.126。
然后查找对应的redis 的Service的ip,可以看到,两个IP是对的上的。
又例如之前的springboot连接redis:
在构建镜像的时候直接使用ip,这次改为使用服务名:
- FROM centos:7
- LABEL author=lsy
- ENV path=/usr/soft
- RUN mkdir ${path}
- WORKDIR ${path}
- ADD jdk-8u191-linux-x64.tar.gz ${path}
- ENV JAVA_HOME=${path}/jdk1.8.0_191
- ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- ENV PATH=$JAVA_HOME/bin:$PATH
- COPY k8s_demo-1.0.jar ${path}
- EXPOSE 8080
- CMD java -jar -DredisIp=redis k8s_demo-1.0.jar
然后进行镜像构建:
然后改为使用当前镜像进行容器的构建,之后创建容器
测试:
设置值:
取值:
结尾:
祝愿大家在新的一年里心想事成!!!
k8s之DNS服务器搭建的更多相关文章
- Linux下dns服务器搭建
Linux下dns服务器搭建1-环境Red Hat Enterprise Linux Server release 6.7 (Santiago)2-配置本地yum源安装dns相关包yum -y ins ...
- DNS服务器搭建(主、从、缓)
主dns服务器搭建 在本机上搭建一个管理hngd.com域名的域名服务器1. 确保安装好以下bind域名服务器 [root@主人 ~]# rpm -qa |grep ^bindbind-chroot- ...
- 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS)
点击返回架构师成长之路 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS) 采用LVS-DR模式负载均衡,多IDC,多套DNS集群,通过master-slave技术保证dns配置的一致性. 1 ...
- 架构师成长之路6.5 DNS服务器搭建(添加记录、负载均衡、DNS视图)
点击返回架构师成长之路 架构师成长之路6.5 DNS服务器搭建(添加记录.负载均衡.DNS视图) 部署主DNS : 点击 部署从DNS : 点击 1.添加A记录.CNAME记录.MX记录.PTR记录 ...
- 架构师成长之路6.4 DNS服务器搭建(部署主从DNS)
点击返回架构师成长之路 架构师成长之路6.3 DNS服务器搭建(部署主从DNS) 部署主DNS : 点击 部署从DNS : 如下步骤 1.与主DNS一样,安装bind yum -y install ...
- 架构师成长之路6.3 DNS服务器搭建(部署单台DNS)
点击返回架构师成长之路 架构师成长之路6.3 DNS服务器搭建(部署单台DNS) 1.安装bind yum -y install bind-utils bind bind-devel bind-chr ...
- Linux下DNS服务器搭建详解
Linux下DNS服务器搭建详解 DNS 即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析 ...
- DNS服务器搭建与配置
DNS服务器搭建与配置目录 1.DNS查询方式 2.DNS服务器类型 3.DNS主要配置文件组 4.name.conf文件配置介绍 5.DNS的资源记录格式 6.DNS服务器和客户端配置 7.简单搭建 ...
- Linux:DNS服务器搭建
DNS简介 DNS(Domain Name System)域名系统: 是一种采用客户端/服务器机制,负责实现计算机名称与IP地址转换的系统.DNS作为一种重要的网络服务,既是国际互联网工作的基础,同时 ...
随机推荐
- Python中使用“模块名.__all__”查看模块建议导出的属性
在<第10.5节 使用__all__定义Python模块导入白名单>中,老猿介绍了在自定义模块中使用定义__all__属性来提供模块对外可见的白名单,使用该机制除了可以定义访问的白名单外, ...
- Object.prototype.toString.call()为什么可以用来检测数据类型?
obj.toString()方法是用来干什么的 每一个对象都有一个toString()方法,默认情况下toString()被每一个Object对象继承,如果此方法未被重写,toString()返回&q ...
- 算法数据结构——数的深搜和广搜(dfs和bfs)
leetcode104 二叉树的最大深度 https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 深度搜索分两种:递归(使用栈) ...
- 百度前端技术学院-基础-day22-24
第二十二天到第二十四天:JavaScript里面的居民们 task1 题目: <div> <label>Number A:<input id="radio-a& ...
- day106:MoFang:BUG:获取数据验证token是否过期&相册/相机取消头像无法显示&MongoDB
目录 BUG1:前端在获取数据时,要检验token是否过期 BUG2:相册/相机取消后设置页面头像无法显示 MongoDB 1.MongoDB基本介绍 2.MongoDB安装 3.MongoDB:通用 ...
- Chrome DevTools — Network -- 转载
转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...
- 纯css 实现文本换行
业务场景:dialog中嵌套的表单,实现信息展示,由于存储路径过长并且在一行显示,导致多出的文字出现在弹出框外面了,页面极丑,所以需要将存储路径实现自动换行. 技术点:<p style=&quo ...
- STL——容器(List)List 的概念
1. List 容器的基本概念 1. list 是一个双向链表容器,可高效的进行插入删除元素,他的原理在于每个元素都有两个指针来记录前后两个元素的地址,像火车车厢一样,list 中各个元素在物理存储单 ...
- 记:create-react-app暴露配置报错
上面主要是说 webpack 版本冲突 不是create-react-app本身的问题,需要手动解决. 解决办法: npm run eject // 显示所有的依赖项 如果运行出现类似这样的报错 Ar ...
- vue第九单元(非父子通信 events 单向数据流)
第九单元(非父子通信 events 单向数据流) #课程目标 了解非父子组件通信的原理,熟练实现非父子组件间的通信(重点) 了解单向数据流的含义,并且明白单向数据流的好处 #知识点 #1.非父子组件间 ...