kubernetes 服务发现实现(kube-dns)

DNS会监控Kubernetes的新的Service并且会为其创建一组DNS记录。如果DNS在整个集群中都被启用的话,那所有的Pod应该能自动对Service进行命名解析。

例如,如果你有一个叫做my-service的Service,其位于"my-ns"的Namespace下,那么对于"my-service.my-ns"就会有一个DNS的记录被创建。位于名为"my-ns" Namespace下的Pod可以通过简单地使用"my-service"进行查找。而位于其他Namespaces的Pod必须把查找名称指定为"my-service.my-ns"。这些命名查找的结果是一个集群的IP地址。
对于命名的端口,Kubernetes也支持DNS SRV (service)记录。如果名为"my-service.my-ns"的Service 有一个协议为TCP的名叫"http"的端口,你可以对"_http._tcp.my-service.my-ns"做一次DNS SRV查询来发现”http”的端口号。


一、安装DNS服务

DNS 服务不是独立的系统服务,而是一种 addon ,作为插件来安装的,不是 kubernetes 集群必须的(但是非常推荐安装)。可以把它看做运行在集群上的应用,只不过这个应用比较特殊而已。
DNS 有两种配置方式,在 1.3 之前使用 etcd + kube2sky + skydns 的方式,在 1.3 之后可以使用 kubedns + dnsmasq 的方式。

下载kubernetes安装包 

https://github.com/kubernetes/kubernetes/releases/download/v1.7.8/kubernetes.tar.gz, 
解压后在kubernetes/cluster/addons/dns目录下有kubedns的部署文件。

1.kubedns-cm.yaml和kubedns-sa.yaml
kubedns-cm.yaml和kubedns-sa.yaml无须修改,直接使用。

2.kubedns-svc.yaml
kubedns-svc.yaml有三种类型的模板文件,我们使用kubedns-svc.yaml.sed文件来生成kubedns-svc.yaml文件,替换$DNS_SERVER_IP为指定K8s DNS IP(默认为apiserver ip 加 1),我们使用10.254.0.2。
cp kubedns-svc.yaml.sed kubedns-svc.yaml
sed -i 's/$DNS_SERVER_IP/10.254.0.2/g' kubedns-svc.yaml

3.kubedns-controller.yaml
kubedns-controller.yaml有三种类型的模板文件,我们使用kubedns-controller.yaml.sed文件来生成kubedns-controller.yaml文件,替换$DNS_DOMAIN为cluster.local.(在与kube-apiserver定义的一致)。
cp kubedns-controller.yaml.sed kubedns-controller.yaml
sed -i 's/$DNS_DOMAIN/cluster.local./g' kubedns-controller.yaml

4.启动kubedns服务
kubectl create -f kubedns-cm.yaml
kubectl create -f kubedns-sa.yaml
kubectl create -f kubedns-svc.yaml
kubectl create -f kubedns-controller.yaml

二、测试DNS:

1. 创建一个测试 pod 和svr :
[root@maste curl]# cat ./curl-system.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: curl
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: curl
    spec:
      containers:
      - name: curl
        image: appropriate/curl
        command: ["sleep"]
        args: ["5000"]

---

apiVersion: v1
kind: Service
metadata:
  name: curl
  namespace: kube-system
  labels:
    app: curl
spec:
  type: ClusterIP
  selector:
    app: curl
  ports:
  - port: 80
    targetPort: 80
    name: http
    protocol: TCP

2. 启动一个dns测试工具POD
[root@master busybox]# cat test.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tools-dns
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tools-dns
    spec:
      containers:
      - name: tools-dns
        image: tutum/dnsutils:latest
        command: ["sleep"]
        args: ["5000"]


3. 进入dns工具POD,检查DNS:

a. 检查A记录

kubectl exec -it tools-dns-4108965606-5rrtb bash

root@tools-dns-4108965606-5rrtb:/# nslookup -query=a  _http._tcp.curl.kube-system
Server:		10.254.0.2
Address:	10.254.0.2#53

_http._tcp.curl.kube-system.svc.cluster.local	canonical name = curl.kube-system.svc.cluster.local.
Name:	curl.kube-system.svc.cluster.local
Address: 10.254.186.53
b. 检查srv记录
SRV记录是一个域名系统(DNS)资源记录,用于标识承载特定服务的计算机。
SRV记录是一个域名系统(DNS)资源记录,用于标识承载特定服务的计算机。
root@tools-dns-4108965606-5rrtb:/# nslookup -query=srv  _http._tcp.curl.kube-system
Server:		10.254.0.2
Address:	10.254.0.2#53

_http._tcp.curl.kube-system.svc.cluster.local	service = 10 100 80 curl.kube-system.svc.cluster.local.
(说明:service = 10(优先级) 100(比重) 80(端口) curl.kube-system.svc.cluster.local(主机名).)

参考:

https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

安装参考:

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns

http://blog.csdn.net/zhuchuangang/article/details/76093887


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值