dns服务器_k8s之DNS服务器搭建

导读

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

搭建DNS服务器

简介

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

  • etcd:DNS信息存储

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

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

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

a0fa26a5c524a6577ae459548b54c921.png

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

88834a83d7f16ea7fe6bb835eb109b01.png

修改每台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 kubeletsystemctl daemon-reloadsystemctl start kubelet

bd68255d445f7687816e91bf3a1e3af4.png

修改完参数之后,启动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 服务名

3f0100eb3e6d801d9a57b356b0ba203d.png

可知解析后的ip是10.102.184.126。

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

8d0664e548f3863ebd6090da24cb66c6.png

又例如之前的springboot连接redis:

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

FROM centos:7LABEL author=lsyENV 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 -DredisIp=redis k8s_demo-1.0.jar

然后进行镜像构建:

375961742fb540d53957f5b96179b1e5.png

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

测试:

设置值:

7a4fbe9f9a5ef95edad64881fa4ba4dd.png

取值:

e9ac7f1ce2c76ca84b1f997ee5c9c136.png

结尾

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

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

67c5f5df800f272ad8d4d71f712caeba.png

c1a427893fb86819e254a3a64ddba7c8.png 往期推荐
  • k8s重器之Service

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

  • k8s基本使用

下期见

    cbbbd1ff0444104da4eb672d34266c9d.png

Liusy01

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

欢迎大家点个在看

分享至朋友圈

好文!点个在看!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值