一、导读

在使用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包含了四个容器的定义:

  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: kube-dns-v8
  5. namespace: kube-system
  6. labels:
  7. k8s-app: kube-dns
  8. version: v8
  9. kubernetes.io/cluster-service: "true"
  10. spec:
  11. replicas: 1
  12. selector:
  13. k8s-app: kube-dns
  14. version: v8
  15. template:
  16. metadata:
  17. labels:
  18. k8s-app: kube-dns
  19. version: v8
  20. kubernetes.io/cluster-service: "true"
  21. spec:
  22. containers:
  23. - name: etcd
  24. image: empiregeneral/etcd-amd64:latest
  25. resources:
  26. limits:
  27. cpu: 100m
  28. memory: 50Mi
  29. command:
  30. - /usr/local/bin/etcd
  31. - -data-dir
  32. - /var/etcd/data
  33. - -listen-client-urls
  34. - http://127.0.0.1:2379,http://127.0.0.1:4001
  35. - -advertise-client-urls
  36. - http://127.0.0.1:2379,http://127.0.0.1:4001
  37. - -initial-cluster-token
  38. - skydns-etcd
  39. volumeMounts:
  40. - name: etcd-storage
  41. mountPath: /var/etcd/data
  42. - name: kube2sky
  43. image: syncgooglecontainers/kube2sky-amd64:1.15
  44. resources:
  45. limits:
  46. cpu: 100m
  47. memory: 50Mi
  48. args:
  49. - --domain=cluster.local
  50. - --kube_master_url=http://192.168.197.100:8080
  51. - name: skydns
  52. image: yaronr/skydns:latest
  53. resources:
  54. limits:
  55. cpu: 100m
  56. memory: 50Mi
  57. args:
  58. - -machines=http://localhost:4001
  59. - -addr=0.0.0.0:53
  60. - -domain=cluster.local
  61. ports:
  62. - containerPort: 53
  63. name: dns
  64. protocol: UDP
  65. - containerPort: 53
  66. name: dns-tcp
  67. protocol: TCP
  68. livenessProbe:
  69. httpGet:
  70. path: /healthz
  71. port: 8080
  72. scheme: HTTP
  73. initialDelaySeconds: 30
  74. timeoutSeconds: 5
  75. - name: healthz
  76. image: syncgooglecontainers/exechealthz:1.1
  77. resources:
  78. limits:
  79. cpu: 10m
  80. memory: 20Mi
  81. args:
  82. - -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null
  83. - -port=8080
  84. ports:
  85. - containerPort: 8080
  86. protocol: TCP
  87. volumes:
  88. - name: etcd-storage
  89. emptyDir: {}
  90. dnsPolicy: Default # Don't use cluster DNS.

  

上述需要注意的是,需要将

  1. --kube_master_url=http://192.168.197.100:8080

  

改成集群中master的IP,镜像如果下载失败,可从docker hub里面找,我就是从docker hub里面找到相应的镜像。

skydns-svc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: kube-dns
  5. namespace: kube-system
  6. labels:
  7. k8s-app: kube-dns
  8. kubernetes.io/cluster-service: "true"
  9. kubernetes.io/name: "KubeDNS"
  10. spec:
  11. selector:
  12. k8s-app: kube-dns
  13. clusterIP: 10.96.0.10
  14. ports:
  15. - name: dns
  16. port: 53
  17. protocol: UDP
  18. - name: dns-tcp
  19. port: 53
  20. protocol: TCP

  

需要指定一个clusterIP,不能靠k8s自动分配,每个Node的kubelet都是用这个IP地址,另外,这个IP需要在kube-apiserver启动参数--service-cluster-ip-range指定的IP范围内

kube-apiserver的配置文件在/etc/kubernetes/manifests目录下:

(3)修改每台Node上的kubelet参数

添加以下两个参数:

  1. --cluster_dns=169.169.0.100: dns服务的clusterIP地址
  2. --cluster_domain=cluster.local: dns服务中设置的域名

  

比如我这边的是这样:

  1. vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
  2. #添加如下一行
  3. Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"

  

然后重启kubelet,使用ps -ef | grep kubelet查看是否生效

重启kubelet

  1. systemctl stop kubelet
  2. systemctl daemon-reload
  3. systemctl start kubelet

  

修改完参数之后,启动dns

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

  

(4)验证

启动一个busybox容器。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: busybox
  5. labels:
  6. name: busybox
  7. namespace: default
  8. spec:
  9. containers:
  10. - image: busybox
  11. imagePullPolicy: IfNotPresent
  12. command:
  13. - sleep
  14. - "3600"
  15. name: busybox
  16. restartPolicy: Always

  

启动之后进入容器内部:

  1. nsloogup 服务名

可知解析后的ip是10.102.184.126。

然后查找对应的redis 的Service的ip,可以看到,两个IP是对的上的。

又例如之前的springboot连接redis:

在构建镜像的时候直接使用ip,这次改为使用服务名:

  1. FROM centos:7
  2.  
  3. LABEL author=lsy
  4.  
  5. ENV path=/usr/soft
  6.  
  7. RUN mkdir ${path}
  8.  
  9. WORKDIR ${path}
  10.  
  11. ADD jdk-8u191-linux-x64.tar.gz ${path}
  12.  
  13. ENV JAVA_HOME=${path}/jdk1.8.0_191
  14. ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  15. ENV PATH=$JAVA_HOME/bin:$PATH
  16.  
  17. COPY k8s_demo-1.0.jar ${path}
  18.  
  19. EXPOSE 8080
  20.  
  21. CMD java -jar -DredisIp=redis k8s_demo-1.0.jar

  

然后进行镜像构建:

然后改为使用当前镜像进行容器的构建,之后创建容器

测试:

设置值:

取值:

结尾:

祝愿大家在新的一年里心想事成!!!

k8s之DNS服务器搭建的更多相关文章

  1. Linux下dns服务器搭建

    Linux下dns服务器搭建1-环境Red Hat Enterprise Linux Server release 6.7 (Santiago)2-配置本地yum源安装dns相关包yum -y ins ...

  2. DNS服务器搭建(主、从、缓)

    主dns服务器搭建 在本机上搭建一个管理hngd.com域名的域名服务器1. 确保安装好以下bind域名服务器 [root@主人 ~]# rpm -qa |grep ^bindbind-chroot- ...

  3. 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS)

    点击返回架构师成长之路 架构师成长之路6.6 DNS服务器搭建(构建企业级DNS) 采用LVS-DR模式负载均衡,多IDC,多套DNS集群,通过master-slave技术保证dns配置的一致性. 1 ...

  4. 架构师成长之路6.5 DNS服务器搭建(添加记录、负载均衡、DNS视图)

    点击返回架构师成长之路 架构师成长之路6.5 DNS服务器搭建(添加记录.负载均衡.DNS视图)  部署主DNS : 点击 部署从DNS : 点击 1.添加A记录.CNAME记录.MX记录.PTR记录 ...

  5. 架构师成长之路6.4 DNS服务器搭建(部署主从DNS)

    点击返回架构师成长之路 架构师成长之路6.3 DNS服务器搭建(部署主从DNS)  部署主DNS : 点击 部署从DNS : 如下步骤 1.与主DNS一样,安装bind yum -y install ...

  6. 架构师成长之路6.3 DNS服务器搭建(部署单台DNS)

    点击返回架构师成长之路 架构师成长之路6.3 DNS服务器搭建(部署单台DNS) 1.安装bind yum -y install bind-utils bind bind-devel bind-chr ...

  7. Linux下DNS服务器搭建详解

    Linux下DNS服务器搭建详解 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析 ...

  8. DNS服务器搭建与配置

    DNS服务器搭建与配置目录 1.DNS查询方式 2.DNS服务器类型 3.DNS主要配置文件组 4.name.conf文件配置介绍 5.DNS的资源记录格式 6.DNS服务器和客户端配置 7.简单搭建 ...

  9. Linux:DNS服务器搭建

    DNS简介 DNS(Domain Name System)域名系统: 是一种采用客户端/服务器机制,负责实现计算机名称与IP地址转换的系统.DNS作为一种重要的网络服务,既是国际互联网工作的基础,同时 ...

随机推荐

  1. Python中使用“模块名.__all__”查看模块建议导出的属性

    在<第10.5节 使用__all__定义Python模块导入白名单>中,老猿介绍了在自定义模块中使用定义__all__属性来提供模块对外可见的白名单,使用该机制除了可以定义访问的白名单外, ...

  2. Object.prototype.toString.call()为什么可以用来检测数据类型?

    obj.toString()方法是用来干什么的 每一个对象都有一个toString()方法,默认情况下toString()被每一个Object对象继承,如果此方法未被重写,toString()返回&q ...

  3. 算法数据结构——数的深搜和广搜(dfs和bfs)

    leetcode104 二叉树的最大深度 https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 深度搜索分两种:递归(使用栈) ...

  4. 百度前端技术学院-基础-day22-24

    第二十二天到第二十四天:JavaScript里面的居民们 task1 题目: <div> <label>Number A:<input id="radio-a& ...

  5. day106:MoFang:BUG:获取数据验证token是否过期&相册/相机取消头像无法显示&MongoDB

    目录 BUG1:前端在获取数据时,要检验token是否过期 BUG2:相册/相机取消后设置页面头像无法显示 MongoDB 1.MongoDB基本介绍 2.MongoDB安装 3.MongoDB:通用 ...

  6. Chrome DevTools — Network -- 转载

    转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...

  7. 纯css 实现文本换行

    业务场景:dialog中嵌套的表单,实现信息展示,由于存储路径过长并且在一行显示,导致多出的文字出现在弹出框外面了,页面极丑,所以需要将存储路径实现自动换行. 技术点:<p style=&quo ...

  8. STL——容器(List)List 的概念

    1. List 容器的基本概念 1. list 是一个双向链表容器,可高效的进行插入删除元素,他的原理在于每个元素都有两个指针来记录前后两个元素的地址,像火车车厢一样,list 中各个元素在物理存储单 ...

  9. 记:create-react-app暴露配置报错

    上面主要是说 webpack 版本冲突 不是create-react-app本身的问题,需要手动解决. 解决办法: npm run eject // 显示所有的依赖项 如果运行出现类似这样的报错 Ar ...

  10. vue第九单元(非父子通信 events 单向数据流)

    第九单元(非父子通信 events 单向数据流) #课程目标 了解非父子组件通信的原理,熟练实现非父子组件间的通信(重点) 了解单向数据流的含义,并且明白单向数据流的好处 #知识点 #1.非父子组件间 ...