【Kubernetes】Service 服务发现 之 DNS

121 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

一、前言

集群内部通过固定不变的 Service IP 地址就可以访问到后端 Pods。 表面上看服务一直在稳定运行中,但是后端的 Pods 却根据集群整体的情况不断动态变化以达到新的平衡,这个过程中旧的 Pods 可能不断在被清理回收,新的 Pods 正在创建中。

这些 Pods 如何知道 ServiceIP 和端口 Port 呢?

服务发现主要解决的问题是:让 Pods 及时知道 ServiceIP 和端口 Port

Service 服务发现目前有两种类型,为 环境变量DNS

推荐使用: DNS


二、DNS

Kubernetes 集群中设置 DNS 服务是以插件的方式运行的,kubernetes v1.15 版本中使用的 DNS 插件为 CoreDNS

查看:

$ kubectl get pods -n=kube-system
# 可以看到 coredns-5c98db65d4-ln562 这个 Pod 运行着 DNS 服务
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-ln562                1/1     Running   0          63m
...

在集群中部署成功 CoreDNS 组件后,它会监视Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录,集群中所有 Pod 可以通过 DNS 名称自动解析服务。

而具体的实现是通过修改每个容器的/etc/resolv.conf实现。

例如,在 default 命名空间下创建了 名为 myweb 服务,那么 CoreDNS会为 myweb.default创建 DNS记录。

在相同命名空间下的其他 pod 可以直接通过 myweb 查找到这个服务。

如果处于其他命名空间,则需要通过 myweb.default 进行查找。

例如:

tomcat Pod 中通过 DNS 解析的方式来访问名为 mywebNginx 服务,因为 myweb 服务默认使用名为 default 的命名空间,我们这里用 myweb.default 域名进行查找:

$ kubectl exec -it myapp-69ff6fc7c6-lm9mk bash
root@myapp-69ff6fc7c6-lm9mk:/usr/local/tomcat# curl myweb.default:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
​
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
​
<p><em>Thank you for using nginx.</em></p>
</body>
</html>