您的位置:首页 > 其它

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

2018-03-05 11:40 615 查看
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.53b. 检查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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kubernetes dns