一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
一、前言
集群内部通过固定不变的
Service IP
地址就可以访问到后端Pods
。 表面上看服务一直在稳定运行中,但是后端的Pods
却根据集群整体的情况不断动态变化以达到新的平衡,这个过程中旧的Pods
可能不断在被清理回收,新的Pods
正在创建中。
这些 Pods
如何知道 Service
的 IP
和端口 Port
呢?
服务发现主要解决的问题是:让 Pods
及时知道 Service
的 IP
和端口 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
解析的方式来访问名为myweb
的Nginx
服务,因为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>