k8s | 深入理解组件 DNS
DNS也就是域名解析系统,将域名和 IP 地址之间建立了一种映射关系,使得用户可以使用易于记忆的域名来访问互联网上的各种资源,而不必记住它们的 IP 地址。在 Kubernetes 中,有两种常见的 DNS 服务器:
- kube-dns 也是(Cluster DNS)
- CoreDNS
这两个都是 Kubernetes 集群中的默认 DNS 服务器,用于为 Pod 和 Service 提供域名解析服务。
Kube-dns
有三个组件
- KubeDNS:负责接收DNS请求,将请求转发到etcd存储的DNS记录中
- etcd: 存储DNS记录
- dnsmasg:轻量级DNS服务器,解析DNS请求并返回ip地址
工作原理:当一个 Pod 或 Service 需要解析一个域名时,它会向 k8s集群中的 DNS 服务器发送 DNS 请求。kubedns 组件会接收到这个请求,并根据请求中的域名和命名空间信息来查找相应的 Pod 或 Service,并返回对应的 IP 地址
kube-dns的缺点就是可扩展性和灵活性有限
core-dns
CoreDNS 可以支持更多的插件,并且具有更好的可扩展性和灵活性
工作原理:
- 监听:一般监听10.96.0.10:53 地址,service和pod可以请求这个地址进行域名解析
- 转发:收到DNS请求,如果以
.cluster.local
结尾, 转发给内部的service或pod - 判断:判断域名是 service 还是 pod 的,相应的转发
- 上游判断:域名不是以
.cluster.local
结尾,请求上游服务器进行解析
修改配置,默认使用 core-dns
在 kubelet 的启动参数中设置 --cluster-dns
选项
--cluster-dns=10.96.0.10
--cluster-domain=cluster.local
DNS 在 k8s 中的运用
服务发现
DNS服务可以让容器和服务通过域名进行通信,而不用关心容器 IP 地址的变化
每个 Service 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Service 名称和所在的命名空间组成。
形式为 servicename.namespace.svc.cluster.local
# 有一个名为 my-service 的 Service,它将流量路由到名为 my-pod 的 Pod。
# 可以在另一个 Pod 中使用 my-service 的 DNS 名称来访问该服务
import requests
# 使用 Service 的 DNS 名称访问服务
response = requests.get("http://my-service.namespace.svc.cluster.local")
# 处理响应
if response.status_code == 200:
print("Success!")
else:
print("Error!")
pod间通信
每个 Pod 都会被分配一个唯一的 DNS 名称。这个 DNS 名称由 Pod 名称和所在的命名空间组成。
形式为 podname.namespace.pod.cluster.local
,这个名称可以被同一节点的其他pod使用
在 pod1
中使用 pod2
的 DNS 名称来访问 pod2
import requests
# 使用 Pod 的 DNS 名称访问另一个 Pod
response = requests.get("http://pod2.namespace.pod.cluster.local")
# 处理响应
if response.status_code == 200:
print("Success!")
else:
print("Error!")
横向扩展
在 Kubernetes 中,当一个 Deployment 水平扩展时,新创建的 Pod 也会被自动注册到 DNS 中,从而使得它们可以被其他 Pod 和服务发现。
有一个名为 my-deployment
的 Deployment,它由一个名为 my-pod
的 Pod 组成。我们可以使用该 Deployment 的名称来访问 my-pod
,并且可以轻松地扩展 Deployment,以便添加更多的 Pod
import requests
# 使用 Deployment 的名称访问 Pod
response = requests.get("http://my-deployment.namespace.svc.cluster.local")
# 处理响应
if response.status_code == 200:
print("Success!")
else:
print("Error!")
集群内部域名解析
集群内部的域名可以被自动解析。Kubernetes API Server 的域名为 kubernetes.default.svc.cluster.local
,可以被 Kubernetes 集群中的任何容器和服务使用,以下代码访问
import requests
# 使用 Kubernetes API Server 的 DNS 名称访问它
response= requests.get("https://kubernetes.default.svc.cluster.local/api/v1/namespaces")
# 处理响应
if response.status_code == 200:
print("Success!")
else:
print("Error!")
集群外部域名解析
集群中的 DNS 服务可以配置为解析集群外部的域名,从而使得容器和服务可以访问外部的服务和资源。
这个功能可以通过在 Kubernetes 中配置外部 DNS 服务器来实现
import requests
# 使用 Google 的域名访问它
response = requests.get("https://www.google.com")
# 处理响应
if response.status_code == 200:
print("Success!")
else:
print("Error!")
需要在 Kubernetes 中配置外部 DNS 服务器
评论区