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包含了四个容器的定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | 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. |
上述需要注意的是,需要将
1 | --kube_master_url=http: //192 .168.197.100:8080 |
改成集群中master的IP,镜像如果下载失败,可从docker hub里面找,我就是从docker hub里面找到相应的镜像。
skydns-svc.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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参数
添加以下两个参数:
1 2 | --cluster_dns=169.169.0.100: 为dns服务的clusterIP地址 --cluster_domain=cluster. local : 为dns服务中设置的域名 |
比如我这边的是这样:
1 2 3 | 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
1 2 3 | systemctl stop kubelet systemctl daemon-reload systemctl start kubelet |
修改完参数之后,启动dns
1 2 | kubectl create -f skydns-rc.yaml kubectl create -f skydns-svc.yaml |
(4)验证
启动一个busybox容器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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,这次改为使用服务名:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 |
然后进行镜像构建:
然后改为使用当前镜像进行容器的构建,之后创建容器
测试:
设置值:
取值:
结尾:
祝愿大家在新的一年里心想事成!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!