kubernetes的DNS解析

新建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

发布了51 篇原创文章 · 获赞 14 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u010606397/article/details/90756816