前面两章介绍了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 <none> 53/UDP,53/TCP,9153/TCP 53d k8s-app=kube-dns
集群中的每一个 Service(包括 DNS 服务本身)都将被分配一个 DNS name。格式为:<service_name>.<namespace>.svc.<cluster_domain>。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 <none> 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 <none> 443/TCP 53d
whoami-clusterip ClusterIP 10.106.29.136 <none> 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