在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。
kubeadm 部署时会默认安装 kube-dns 组件。
kube-dns 是一个 DNS 服务器。每当有新的 Service 被创建,kube-dns 会添加该 Service 的 DNS 记录。Cluster 中的 Pod 可以通过 <SERVICE_NAME>.<NAMESPACE_NAME>
访问 Service。
比如可以用 httpd-svc.default
访问 Service httpd-svc
。
如上所示,我们在一个临时的 busybox Pod 中验证了 DNS 的有效性。另外,由于这个 Pod 与 httpd-svc
同属于 default
namespace,可以省略 default
直接用 httpd-svc
访问 Service。
用 nslookup
查看 httpd-svc
的 DNS 的信息。
DNS 服务器是 kube-dns.kube-system.svc.cluster.local
,这实际上就是 kube-dns 组件,它本身是部署在 kube-system
namespace 中的一个 Service。
httpd-svc.default.svc.cluster.local
是 httpd-svc
的完整域名。
如果要访问其他 namespace 中的 Service,就必须带上 namesapce 了。kubectl get namespace
查看已有的 namespace。
在 kube-public
中部署 Service httpd2-svc
,配置如下:
通过 namespace: kube-public
指定资源所属的 namespace。多个资源可以在一个 YAML 文件中定义,用 ---
分割。执行 kubectl apply
创建资源:
查看 kube-public
的 Service:
在 busybox Pod 中访问 httpd2-svc
:
因为属于不同的 namespace,必须使用 httpd2-svc.kube-public
才能访问到。
Kubernetes 集群内部可以通过 Cluster IP 和 DNS 访问 Service,那么集群外部如何访问呢?下一节我们将讨论这个问题。
老师您的最后一张截图的wget 命令多打了一个wget
确实是这样,当时居然没注意到。
奇怪, 我这里试了<SERVICE_NAME>.<NAMESPACE_NAME> 不行
可以 :
nslookup httpd-svc
nslookup httpd-svc.default.svc.cluster.local
nslookup httpd2-svc.kube-public.svc.cluster.local
不可以: can't resolve xxx
nslookup httpd-svc.default
nslookup httpd2-svc.kube-public
嗯我也是 版本1.9
老师,进入到容器内部后,wget命令没问题,但是在查看DNS的时候,只能看到K8S自己的DNS,而且只有IP,没有域名,我们自己创建的service的DNS查看不到,结果如下:
/ # nslookup httpd-svc
Server: 10.96.0.10
Address: 10.96.0.10:53
** server can't find httpd-svc: NXDOMAIN
*** Can't find httpd-svc: No answer
不知道是不是K8S版本问题,我的版本是1.11