ExternalName是Service的第四种类型,其主要的作用是将集群外部服务的服务引入到集群内部来,能实现类似于常规服务一样的名称解析,服务发现等功能,但是它所有的对应的服务记录维护既不需要标签选择器关联任何对象,也无需定义任何端口和端点,但是必须在服务定义中使用ExternalName定义一个cname用于返回真正提供服务的名称的别名。

ExternalName类型Servcie在coreDNS中解析为一个cname,其对应的是一个外部服务的名称,该服务要能在外部DNS中被解析;此处的外部指的是公网DNS,或者在CoreDNS中通过forward转发给公司内部的DNS。

ExternalName示例

1.编写配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@k8s-master01:~/yaml/chapter07# vim externalname-redis-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: externalname-redis-svc
namespace: default
spec:
type: ExternalName # 类型为ExternalName
externalName: redis.ik8s.io # externalname-redis-svc将会被解析为redis.ik8s.io
ports:
- name: redisport
protocol: TCP
port: 6379
targetPort: 6379
nodePort: 0
selector: {} # {}表示没有选择条件,无需标签选择器

2.应用配置清单

1
2
3
4
5
6
root@k8s-master01:~/yaml/chapter07# kubectl apply -f externalname-redis-svc.yaml 
service/externalname-redis-svc created

root@k8s-master01:~/yaml/chapter07# kubectl get svc externalname-redis-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
externalname-redis-svc ExternalName <none> redis.ik8s.io 6379/TCP 12s

3.验证ExternalName解析结果

1
2
3
4
5
6
7
root@k8s-master01:~/yaml/chapter07# kubectl exec demoapp-5f7d8f9847-r7h7b -- nslookup externalname-redis-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
# 此为coreDNS中的Cname记录
externalname-redis-svc.default.svc.cluster.local canonical name = redis.ik8s.io.
Name: redis.ik8s.io
Address: 1.2.3.4 # 此为cname通过外部DNS解析的结果。