目 录CONTENT

文章目录

k8s | 深入理解组件 DNS

如风
2023-07-14 / 0 评论 / 0 点赞 / 26 阅读 / 1,169 字

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 可以支持更多的插件,并且具有更好的可扩展性和灵活性

工作原理:

  1. 监听:一般监听10.96.0.10:53 地址,service和pod可以请求这个地址进行域名解析
  2. 转发:收到DNS请求,如果以 .cluster.local 结尾, 转发给内部的service或pod
  3. 判断:判断域名是 service 还是 pod 的,相应的转发
  4. 上游判断:域名不是以 .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 服务器

参考链接

0

评论区