1、概述
在《Kubernetes Headless服务》这篇博文中对Kubenertes Service资源类型进行了概述并详细介绍了Headless服务,通过这篇博文我们可以知道Service一般分为3种类型:ClusterIP、NodePort、LoadBalancer,唯独对 ExternalName 置若罔闻,本文将详细介绍Kubernetes ExternalName类型的服务。
ExternalName Service是Kubernetes中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把服务请求透明地重定向到指定的DNS名称,无论该名称指向的是外部服务还是集群内的其他服务,例如第三方 API 服务、外部数据库,或跨命名空间的内部服务。在配置上,只需将 Service 的 type
设置为 ExternalName
并指定 externalName
字段即可。ExternalName
Service 简化了对不同 DNS名称资源的访问配置,使得服务依赖的地址变化对集群内的应用透明,但不提供负载均衡和服务发现功能。
2、工作机制
- 当访问
ExternalName
Service 时,Kubernetes 的 DNS 解析返回一个 CNAME 记录。 - 这个 CNAME 记录将请求重定向到指定的 DNS 名称,从而实现服务的透明重定向。
知识普及:DNS CName(CanonicalName)记录,简称CNAME记录。也叫别名级联,如同给人起的外号一样,小名一样,如你的名字:叫张小明,你家人叫你小明,也是指的是你。
CNAME也被称为规范名字。CNAME记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.pt6.cn”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个cname别名(CNAME):WWW和MAIL。 这两个别名的全称就是“ www.pt6.cn”和“mail.pt6.cn” 。实际上他们都指向“host.pt6.cn”。 同样的方法可以用于当您拥有多个域名需要指向同一服务器IP,此时您就可以将一个域名做A记录DNS解析指向服务器IP然后将其他的域名做cname记录别名到之前做A记录的域名上,那么当您的服务器IP地址变更时您就可以不必麻烦的一个一个域名更改指向了,只需要更改做A记录DNS解析的那个域名,而其他做cname别名DNS解析的那些域名的指向也将自动更改到新的IP地址上了。
3、配置
- 通过
spec.type
字段设置为ExternalName
,并在spec.externalName
字段中指定目标 DNS 名称。
apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: type: ExternalName externalName: my.external.service.com
在这个示例中,my-service
是一个 ExternalName
Service,它将请求重定向到 my.external.service.com
。
4、示例
编辑external_name.yaml文件如下:
apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: v1 kind: Service metadata: name: search namespace: dev spec: type: ExternalName externalName: www.baidu.com
使用如下命令创建资源:
[root@master service]# kubectl apply -f external_name.yaml namespace/dev created service/search created
查看资源如下:
[root@master service]# kubectl get service -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE search ExternalName <none> www.baidu.com <none> 11s
此时,在集群内部的pod中就可以通过 search.dev.svc.cluster.local 访问www.baidu.com了,下面验证一下,首先登录一个pod查看 /etc/resolve.conf:
[root@master service]# kubectl exec -it pod/pc-deployment-6gdc5bf56c-9bg6w -n dev /bin/bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@pc-deployment-5ffc5bf56c-9bg6w:/# root@pc-deployment-5ffc5bf56c-9bg6w:/# cat /etc/resolv.conf nameserver 10.96.0.10 search dev.svc.cluster.local svc.cluster.local cluster.local options ndots:5
然后使用dig命令验证:
[root@master service]# dig @10.96.0.10 search.dev.svc.cluster.local ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.96.0.10 search.dev.svc.cluster.local ; (1 server found) ;; global options: +cmd ;; Got answer: ;; WARNING: .local is reserved for Multicast DNS ;; You are currently testing what happens when an mDNS query is leaked to DNS ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62861 ;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;search.dev.svc.cluster.local. IN A ;; ANSWER SECTION: search.dev.svc.cluster.local. 30 IN CNAME www.baidu.com. www.baidu.com. 30 IN CNAME www.a.shifen.com. www.a.shifen.com. 30 IN A 110.242.68.3 www.a.shifen.com. 30 IN A 110.242.68.4 ;; Query time: 5 msec ;; SERVER: 10.96.0.10#53(10.96.0.10) ;; WHEN: Wed Apr 06 23:48:14 CST 2022 ;; MSG SIZE rcvd: 219
5、使用场景
-
外部资源访问: 将集群内服务请求重定向到外部资源,例如第三方 API 服务、外部数据库等。
-
内部资源访问: 在多集群或多命名空间环境中,将服务请求重定向到不同命名空间或不同集群内的服务。
-
服务迁移与重构: 在服务迁移过程中,临时将请求重定向到新的服务地址,确保服务的连续性和透明性。
6、总结
ExternalName
Service 是 Kubernetes 中一种灵活的服务类型,通过 DNS CNAME 机制将请求重定向到指定的 DNS 名称。它适用于需要透明地访问外部或内部 DNS 资源的场景,简化了服务访问配置,使得服务依赖的地址变化对应用透明。