[k8s系列六]K8S网络补充之DNS

前面两章介绍了service和ingress,service有Cluster IP和Node Port两种类型:

  • ClusterIP提供一个集群内部的虚拟IP(clusterIP),以便在集群内部通过clutserIP:port访问;
  • NodePort:在每个节点上打开一个端口,在集群外部可以通过nodeIP:nodePort访问,在内部依然可以通过clutserIP:port 访问。

但实际上,集群内部一般不直接用Cluster IP,而是用service名作为域名,通过Core DNS组件做一次域名解析后得到cluster IP。跨集群一般也不用nodePort,而是走Ingress ,或者loadbalance service。

1. DNS

DNS(Domain Name System) 用于将域名解析成IP地址,例如

# host www.baidu.com
www.baidu.com has address 180.101.49.11
www.baidu.com is an alias for www.a.shifen.com.
www.baidu.com is an alias for www.a.shifen.com.

2. CoreDns

Kubernetes 早期的 DNS 组件叫 KubeDNS。CNCF 社区后来引入了更加成熟的开源项目 CoreDNS 替换了 KubeDNS。所以我们现在提到 KubeDNS,其实默认指代的是 CoreDNS 项目。

# kubectl get deployment -n kube-system -o wide
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS                IMAGES                                                               SELECTOR
calico-kube-controllers   1/1     1            1           53d   calico-kube-controllers   docker.io/calico/kube-controllers:v3.22.1                            k8s-app=calico-kube-controllers
coredns                   2/2     2            2           53d   coredns                   registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6   k8s-app=kube-dns

# kubectl get svc -n kube-system -o wide
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE   SELECTOR
kube-dns   ClusterIP   10.96.0.10           53/UDP,53/TCP,9153/TCP   53d   k8s-app=kube-dns

集群中的每一个 Service(包括 DNS 服务本身)都将被分配一个 DNS name。格式为:..svc.。cluster_domain默认为cluster.local。
每一个Pod创建时,都会在Pod的/etc/resolv.conf文件中,自动加入kube-dns service的domain name与相对应的IP地址。因此Pods可以透过名为kube-dns的service组件,找到正在运行的kube-dns。

3. 示例

根据附录1创建dnsutils pod,并按照DNS格式,尝试解析kube-dns(kube-system命名空间)和whoami-clusterip(default命名空间)。然后查看pod的域名解析文件/etc/resolv.conf中的内容,最后尝试在通过域名+端口号访问whoami-clusterip服务。

# 01 创建dnsutils pod
# kubectl apply -f dnsutils-pod.yaml

# 02 查询kube-dns服务域名解析
# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10           53/UDP,53/TCP,9153/TCP   53d

# kubectl exec dnsutils -- nslookup kube-dns.kube-system.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kube-dns.kube-system.svc.cluster.local
Address: 10.96.0.10

# 03 查询whoami-clusterip服务域名解析,是之前文章示例创建的
# kubectl get svc
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes         ClusterIP   10.96.0.1               443/TCP    53d
whoami-clusterip   ClusterIP   10.106.29.136           8080/TCP   16d

# kubectl exec dnsutils -- nslookup whoami-clusterip.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   whoami-clusterip.default.svc.cluster.local
Address: 10.106.29.136

# 04 查看pod的域名解析文件, 10.96.0.10指向kube-dns的cluster ip
# kubectl exec dnsutils -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local www.tendawifi.com
options ndots:5

# 05在dnsutils pod中尝试访问whoami-clusterip服务
# a) 需要安装curl, 必要时需要修改成国内源,然后执行apt-get update。
# apt-get install curl

# b) 通过域名+端口,访问whoami-clusterip服务
# curl whoami-clusterip.default.svc.cluster.local:8080
I'm whoami-deployment-8886867c8-pc67z

附录

1. dnsutils-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: tutum/dnsutils:latest
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

你可能感兴趣的:([k8s系列六]K8S网络补充之DNS)