如何利用_k8s搭建高效稳定的DNS服务器?

2026-04-02 14:411阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1001个文字,预计阅读时间需要5分钟。

如何利用_k8s搭建高效稳定的DNS服务器?

在本文中,我们将探讨如何在使用K8s部署Spring Boot和Redis的简单应用中,实现Spring Boot对Redis的直接连接。直接使用IP连接与使用服务名连接有何不同?我们将直接输出结果。

直接使用IP连接:直接使用Redis的IP地址进行连接,代码示例如下:

java@Configurationpublic class RedisConfig { @Value(${redis.host}) private String redisHost;

@Bean public RedisTemplate redisTemplate() { RedisTemplate template=new RedisTemplate(); template.setConnectionFactory(new JedisConnectionFactory(new RedisStandaloneConfiguration(redisHost, 6379))); return template; }}

使用服务名连接:在K8s中,你可以通过服务名来连接到Redis。首先,确保Redis服务已创建,然后在配置中引用服务名:

java@Configurationpublic class RedisConfig { @Bean public RedisTemplate redisTemplate() { RedisTemplate template=new RedisTemplate(); template.setConnectionFactory(new LettuceConnectionFactory(redis-service, 6379)); return template; }}

结论:直接使用IP连接可以提供更直接的连接控制,但需要确保IP地址的正确性和稳定性。使用服务名连接则更加灵活,因为服务名会随着K8s中的服务更新而自动更新。两者各有优势,选择哪种方式取决于具体的应用场景和需求。

导读在使用k8s部署springbootredis简单应用这篇文章中springboot连接redis是直接使用的IP连接那么可不可以直接使用服务名

导读

在使用k8s部署springbootredis简单应用这篇文章中spring boot连接redis是直接使用的IP连接那么可不可以直接使用服务名称进行连接呢答案是可以的这就是k8s集群范围内的DNS服务来完成服务名到ClusterIP的解析接下来就一起看一下如何搭建DNS服务器。

搭建DNS服务器

简介

k8s提供的DNS服务是skydns由四个组件组成

  • etcdDNS信息存储

    如何利用_k8s搭建高效稳定的DNS服务器?

  • kube2sky监控k8s中Service资源的变化根据Service的名称的IP地址信息生成DNS记录并将其保存到etcd中

  • skyDNS从etcd中读取DNS信息并提供DNS查询服务

  • healthz提供对skydns服务的健康检查功能

skydns配置文件说明

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

skydns-rc.yaml包含了四个容器的定义

apiVersion: v1kind: ReplicationControllermetadata: 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 - 127.0.0.1:2379,127.0.0.1:4001 - -advertise-client-urls - 127.0.0.1:2379,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: - --domaincluster.local - --kube_master_url192.168.197.100:8080 - name: skydns image: yaronr/skydns:latest resources: limits: cpu: 100m memory: 50Mi args: - -machineslocalhost:4001 - -addr0.0.0.0:53 - -domaincluster.local ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP livenessProbe: 192.168.197.100:8080

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

skydns-svc.yaml

apiVersion: v1kind: Servicemetadata: 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目录下

修改每台Node上的kubelet参数

添加以下两个参数

--cluster_dns169.169.0.100: 为dns服务的clusterIP地址--cluster_domaincluster.local: 为dns服务中设置的域名

比如我这边的是这样

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf#添加如下一行Environment"KUBELET_DNS_ARGS--cluster-dns10.96.0.10 --cluster-domaincluster.local"

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

重启kubelet

systemctl stop kubeletsystemctl daemon-reloadsystemctl start kubelet

修改完参数之后启动dns

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

验证

启动一个busybox容器。

apiVersion: v1kind: Podmetadata: name: busybox labels: name: busybox namespace: defaultspec: 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:7LABEL authorlsyENV path/usr/softRUN mkdir ${path}WORKDIR ${path}ADD jdk-8u191-linux-x64.tar.gz ${path}ENV JAVA_HOME${path}/jdk1.8.0_191ENV CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH$JAVA_HOME/bin:$PATHCOPY k8s_demo-1.0.jar ${path}EXPOSE 8080CMD java -jar -DredisIpredis k8s_demo-1.0.jar

然后进行镜像构建

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

测试

设置值

取值

结尾

经由上一节k8s的DNS服务已经搭建起来了以后就可以愉快的使用服务名进行访问了你学废了吗

秋风吹落叶天气微凉注意保暖

往期推荐
  • k8s重器之Service

  • 服务挂掉导致需要对k8s水平扩容

  • k8s基本使用

下期见

    

Liusy01

一个分享Java后端学习日志的公众号

欢迎大家点个在看

分享至朋友圈

好文点个在看

本文共计1001个文字,预计阅读时间需要5分钟。

如何利用_k8s搭建高效稳定的DNS服务器?

在本文中,我们将探讨如何在使用K8s部署Spring Boot和Redis的简单应用中,实现Spring Boot对Redis的直接连接。直接使用IP连接与使用服务名连接有何不同?我们将直接输出结果。

直接使用IP连接:直接使用Redis的IP地址进行连接,代码示例如下:

java@Configurationpublic class RedisConfig { @Value(${redis.host}) private String redisHost;

@Bean public RedisTemplate redisTemplate() { RedisTemplate template=new RedisTemplate(); template.setConnectionFactory(new JedisConnectionFactory(new RedisStandaloneConfiguration(redisHost, 6379))); return template; }}

使用服务名连接:在K8s中,你可以通过服务名来连接到Redis。首先,确保Redis服务已创建,然后在配置中引用服务名:

java@Configurationpublic class RedisConfig { @Bean public RedisTemplate redisTemplate() { RedisTemplate template=new RedisTemplate(); template.setConnectionFactory(new LettuceConnectionFactory(redis-service, 6379)); return template; }}

结论:直接使用IP连接可以提供更直接的连接控制,但需要确保IP地址的正确性和稳定性。使用服务名连接则更加灵活,因为服务名会随着K8s中的服务更新而自动更新。两者各有优势,选择哪种方式取决于具体的应用场景和需求。

导读在使用k8s部署springbootredis简单应用这篇文章中springboot连接redis是直接使用的IP连接那么可不可以直接使用服务名

导读

在使用k8s部署springbootredis简单应用这篇文章中spring boot连接redis是直接使用的IP连接那么可不可以直接使用服务名称进行连接呢答案是可以的这就是k8s集群范围内的DNS服务来完成服务名到ClusterIP的解析接下来就一起看一下如何搭建DNS服务器。

搭建DNS服务器

简介

k8s提供的DNS服务是skydns由四个组件组成

  • etcdDNS信息存储

    如何利用_k8s搭建高效稳定的DNS服务器?

  • kube2sky监控k8s中Service资源的变化根据Service的名称的IP地址信息生成DNS记录并将其保存到etcd中

  • skyDNS从etcd中读取DNS信息并提供DNS查询服务

  • healthz提供对skydns服务的健康检查功能

skydns配置文件说明

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

skydns-rc.yaml包含了四个容器的定义

apiVersion: v1kind: ReplicationControllermetadata: 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 - 127.0.0.1:2379,127.0.0.1:4001 - -advertise-client-urls - 127.0.0.1:2379,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: - --domaincluster.local - --kube_master_url192.168.197.100:8080 - name: skydns image: yaronr/skydns:latest resources: limits: cpu: 100m memory: 50Mi args: - -machineslocalhost:4001 - -addr0.0.0.0:53 - -domaincluster.local ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP livenessProbe: 192.168.197.100:8080

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

skydns-svc.yaml

apiVersion: v1kind: Servicemetadata: 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目录下

修改每台Node上的kubelet参数

添加以下两个参数

--cluster_dns169.169.0.100: 为dns服务的clusterIP地址--cluster_domaincluster.local: 为dns服务中设置的域名

比如我这边的是这样

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf#添加如下一行Environment"KUBELET_DNS_ARGS--cluster-dns10.96.0.10 --cluster-domaincluster.local"

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

重启kubelet

systemctl stop kubeletsystemctl daemon-reloadsystemctl start kubelet

修改完参数之后启动dns

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

验证

启动一个busybox容器。

apiVersion: v1kind: Podmetadata: name: busybox labels: name: busybox namespace: defaultspec: 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:7LABEL authorlsyENV path/usr/softRUN mkdir ${path}WORKDIR ${path}ADD jdk-8u191-linux-x64.tar.gz ${path}ENV JAVA_HOME${path}/jdk1.8.0_191ENV CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH$JAVA_HOME/bin:$PATHCOPY k8s_demo-1.0.jar ${path}EXPOSE 8080CMD java -jar -DredisIpredis k8s_demo-1.0.jar

然后进行镜像构建

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

测试

设置值

取值

结尾

经由上一节k8s的DNS服务已经搭建起来了以后就可以愉快的使用服务名进行访问了你学废了吗

秋风吹落叶天气微凉注意保暖

往期推荐
  • k8s重器之Service

  • 服务挂掉导致需要对k8s水平扩容

  • k8s基本使用

下期见

    

Liusy01

一个分享Java后端学习日志的公众号

欢迎大家点个在看

分享至朋友圈

好文点个在看