Kubernetes DNS服务配置
来源:互联网 发布:4g通信软件 编辑:程序博客网 时间:2024/05/16 17:22
Kubernetes DNS服务配置
Kubernetes提供的DNS由以下三个组件组成:
1. etcd:DNS存储
2. kube2sky:将kubernetes master中的service(服务)注册到etcd
3. skyDNS:提供DNS域名解析服务 这三个组件以pod的方式启动和运行
skydns配置文件
首先创建DNS服务的ReplicationController配置文件skydns-rc.yaml:
apiVersion: v1kind: ReplicationControllermetadata: name: kube-dns 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: gcr.io/google_containers/etcd:2.0.9 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: gcr.io/google_containers/kube2sky:1.11 resources: limits: cpu: 100m memory: 50Mi args: # command: # - /kube2sky - --kube_master_url=http://172.16.36.50:8080 - -domain=cluster.local - name: skydns image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c resources: limits: cpu: 100m memory: 50Mi args: #command: #- /skydns - -machines=http://127.0.0.1:4001 - -addr=0.0.0.0:53 - -domain=cluster.local ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP volumes: - name: etcd-storage emptyDir: {} dnsPolicy: Default
需要修改的几个配置参数如下:
- kube2sky容器需要访问kubernetes master,需要配置master所在物理主机的ip地址和端口号
- kube2sky容器和skydns容器的启动参数-domain,设置kubernetes集群中service所属的域名,本例中为cluster.local。启动后,kube2sky会监听kubernetes,当有新的service创建时,就会生成相应的记录并保存到etcd中。Kube2sky为每个service生成两条记录:
<service_name>.<namespace_name>.<domain> <service_name>.<namespace_name>.svc.<domain> - skydns的启动参数-addr=0.0.0.0:53表示使用本机TCP和UDP的53端口提供服务
创建DNS服务的service配置文件,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.254.10.20 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
注意:skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个node的kubelet进程都将使用这个ip地址,不能通过kubernetes自动分配,另外,这个ip地址需要在kube-apiserver启动参数--service-cluster-ip-range指定的ip地址范围内
修改每个node上的/etc/kubernetes/kubelet启动参数
--cluster_dns=10.254.10.20,为dns服务的clusterIP
--cluster_domain=cluster.local,为dns服务中设置的域名
重启kubelet服务
systemctl daemon-reload systemctl restart kubelet
创建kube-system namespace 创建kube-system.yaml,内容如下
apiVersion: v1kind: Namespacemetadata: name: kube-system
创建namespace:
kubectl create -f kube-system.yaml# 查看namespace:kubectl get namespace
创建skydns pod服务
kubectl create -f skydns-rc.yaml
kubectl create -f skydns-svc.yaml
创建完成后,查看是否创建成功
[root@cti-m dns]# kubectl get rc --namespace=kube-systemNAME DESIRED CURRENT AGEkube-dns 1 1 11h[root@cti-m dns]# kubectl get pod --namespace=kube-systemNAME READY STATUS RESTARTS AGEkube-dns-gvvcj 3/3 Running 0 11h
然后,我们创建一个普通的service,以redis-master服务为例:
apiVersion: v1kind: Servicemetadata: name: redis-master labels: name: redis-masterspec: ports: - port: 6379 selector: name: redis-master
查看创建出来的service:
[root@cti-m dns]# kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1dredis-master 10.254.47.239 <none> 6379/TCP 9s
通过DNS查找service
使用一个带有nslookup工具的pod来验证DNS服务是否能够正常工作,以busybox.yaml为例
[root@cti-m dns]# cat busybox.yamlapiVersion: v1kind: Podmetadata: name: busybox namespace: defaultspec: containers: - image: gcr.io/google_containers/busybox command: - sleep - "3600" imagePullPolicy: IfNotPresent name: busybox restartPolicy: Always
运行kubectl create -f busybox.yaml完成创建
在该容器启动完成后,通过kubectl exec <container_id> -- nslookup进行测试
[root@cti-m dns]# kubectl exec busybox -- nslookup redis-masterServer: 10.254.10.20Address 1: 10.254.10.20Name: redis-masterAddress 1: 10.254.47.239[root@cti-m dns]#
如果某个service属于自定义的命名空间,那么在进行service查找时,需要带上namespace的名字
[root@cti-m dns]# kubectl exec busybox -- nslookup kube-dns.kube-systemServer: 10.254.10.20Address 1: 10.254.10.20Name: kube-dns.kube-systemAddress 1: 10.254.10.20[root@cti-m dns]#
DNS服务的工作原理解析
- kube2sky容器应用通过调用kubernetes master的API获得集群中所有service的信息,并持续监控新service的生成,然后写入etcd中
查看etcd中存储的service信息:
[root@cti-m dns]# kubectl exec kube-dns-gvvcj -c etcd --namespace=kube-system etcdctl ls /skydns/local/cluster/skydns/local/cluster/default/skydns/local/cluster/svc/skydns/local/cluster/kube-system
可以看到在skydns键下面,根据我们配置的域名(cluster.local)生成了local/cluster子键,接下来是namespace(default和kube-system)和svc(下面也按namespace生成子键)。
[root@cti-m dns]# kubectl exec kube-dns-gvvcj -c etcd --namespace=kube-system etcdctl get /skydns/local/cluster/default/redis-master{"host":"10.254.47.239","priority":10,"weight":10,"ttl":30,"targetstrip":0}[root@cti-m dns]#
可以看到,redis-master服务对应的完整域名为redis-master.default.cluster.local,并且其ip地址为:10.254.47.239
- 根据kubelet启动参数的设置(--cluster_dns),kubelet会在每个新创建的pod中设置DNS域名解析配置文件/etc/resolv.conf文件,在其中增加了一条nameserver配置和一条search配置:
# cat /etc/resolv.confsearch default.svc.cluster.local svc.cluster.local cluster.localnameserver 10.254.10.20nameserver 114.114.114.114options ndots:5
通过名字服务器10.254.10.20访问的实际上就是skydns在53端口上提供的DNS解析服务
- Kubernetes DNS服务配置
- Kubernetes DNS服务的安装与配置
- kubernetes配置dns插件
- 如何配置dns服务
- DNS 服务基本配置
- DNS服务配置
- Linux配置DNS服务
- bind DNS服务配置
- DNS服务配置
- Kubernetes如何使用kube-dns实现服务发现
- Kubernetes如何使用kube-dns实现服务发现
- Kubernetes(k8s)如何使用kube-dns实现服务发现
- Kubernetes(k8s)如何使用kube-dns实现服务发现
- kubernetes基础入门之-配置kubernetes skyDNS服务
- Kubernetes安装配置与服务部署
- solaris 10 DNS服务配置
- Server2003 DNS服务配置篇
- linux下DNS服务配置
- Hive 5. 数据类型
- 快速排序法
- 卖票线程
- OBS学习
- K-D树算法的一些总结
- Kubernetes DNS服务配置
- JavaMail发送邮件简单实例及易错点分析
- JAVA装饰者模式(从现实生活角度理解代码原理)
- Android 源码 修改 分区大小
- linux下普通用户获取root权限
- 安卓底层开发学习经验第二十期
- HDOJ--1248|寒冰王座
- 程序运行的时间的估算
- [hihocoder1032]最长回文子串