《docker+k8s教程》
新建test-svc-dns目录,在test-svc-dns目录下新建两个文件busybox.yaml、myapp-pod-service.yaml
busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
myapp-pod-service.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-myapp
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: service-myapp
namespace: default
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 80
在test-svc-dns下运行部署命令
kubectl apply -f .
进入到busybox的pod中
kubectl exec -it busybox -- /bin/sh
通过域名访问Service
wget -O - -q http://service-myapp
在pod内能通过服务名获取到数据。
下面简单介绍下在pod网络,DNS的解析过程
在busybox中执行 cat /etc/resolv.conf
busybox中的DNS服务器地址是10.96.0.10
重新开一个xshell终端,连接master节点,执行命令 kubectl get svc -n kube-system
从上图可知,10.96.0.10是kube-dns的IP地址,即是说pod内的NDS服务器是kube-dns
既然知道了pod使用的DNS服务器是什么,那现在就来看下,pod解析DNS的过程。
先了解一些概念
service_name: 服务的名称
namespace:资源对象所在名称空间
domain:提供的域名后缀,比如默认的 cluster.local
在 pod 中通过 service_name.namespace.svc.domain 来访问kubernetes集群中的服务,如果 pod 和 service 在同一个 namespace 中,可以直接使用 service_name。
busybox、service-myapp都在默认名称空间default下。
所以当运行 wget -O - -q http://service-myapp 时,kubernetes会把域名修改为 service-myapp.default.svc.cluster.local
在busybox执行 nslookup service-myapp 查看DNS解析(busybox的nslookup命令似乎是有问题,时好时坏,如果无法解析,可多运行几次)
service-myapp.default.svc.cluster.local 域名对应的ip是 10.108.217.164。
10.108.217.164 就是service-myapp的ip地址。
总结下:pod的DNS服务器用的是kube-dns,pod可以通过service_name.namespace.svc.domain来访问集群中的Service。
也可以在节点上查看kube-dns的域名解析
dig -t A service-myapp.default.svc.cluster.local. @10.96.0.10