【Kubernetes】负载均衡 之 ExternalName Service

2,673 阅读2分钟

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

一、由云服务商提供负载均衡器

通常而言 Kubernetes 集群都是部署在云上的,比如:谷歌云、阿里云等等,这些云服务商一般都可以自动提供负载均衡器。

  1. 创建 tomcat-svc-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat-loadbalancer
spec:
  type: LoadBalancer # 注意:这里 type 设置为 LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: tomcat
  1. 执行创建
$ kubectl create -f tomcat-svc-loadbalancer.yaml
service/tomcat-loadbalancer created
# PORT(S) 这里,80 为集群内部服务的端口,30544 为 nodePort 端口(由集群随机选择)
$ kubectl get svc
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP        86d
tomcat-loadbalancer   LoadBalancer   10.109.126.5   <pending>     80:30544/TCP   8s

创建服务以后,云服务商需要一段时间才能创建负载均衡器并将其 IP 地址写入服务对象。如果成功创建阿里云的负载均衡器,比如获取服务信息的时候显示 EXTERNAL-IP101.37.XX.XX,可以在通过本地浏览器直接访问 http://101.37.XX.XX

使用 LoadBalancer Service 的优点和缺点都来源于云服务商的负载均衡器,优点是使用负载均衡器以后可以只对外暴露公有云的 IP 地址即可;

缺点是这样会有一定的成本,适合公司或是组织使用。



二、ExternalName Service 简介

ExternalName Service 是一种特殊类型的 Service,主要用于访问位于集群外部的服务。它没有选择器 Selector,也没有定义任何端口 Port 或是 Endpoints。 它的作用是返回集群外服务的域名。

通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段对应的内容。使用这种类型的服务不会创建任何类型的代理。

(1)举个栗子

  1. 创建 externalname-svc.yaml文件
apiVersion: v1
kind: Service
metadata:
  name: en-svc
  namespace: default
spec:
  type: ExternalName # type 类型需要选择 ExternalName
  externalName: www.shiyanlou.com # externalName 中填写外部服务对应的域名
  1. 执行创建
$ kubectl create -f externalname-svc.yaml
service/en-svc created
# 查看服务,可以看到 en-svc 服务没有集群 IP,只有一个 EXTERNAL-IP,为:www.shiyanlou.com
$ kubectl get svc
NAME         TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)   AGE
en-svc       ExternalName   <none>       www.shiyanlou.com   <none>    6s
  1. 通过 ping 查看对应的 ip
$ ping www.shiyanlou.com
PING www.shiyanlou.com (121.40.227.60) 56(84) bytes of data.
64 bytes from 121.40.227.60: icmp_seq=1 ttl=100 time=3.82 ms
64 bytes from 121.40.227.60: icmp_seq=2 ttl=100 time=3.77 ms
64 bytes from 121.40.227.60: icmp_seq=3 ttl=100 time=3.78 ms
  1. 进入容器内部通过 DNS查找 en-svc服务对应的 ip

这里单独运行一个使用 utils 镜像创建的 pod 执行命令(镜像中已经安装了 dnsutils

$ kubectl run --generator=run-pod/v1 --rm utils -it --image registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/utils:latest bash
If you don't see a command prompt, try pressing enter.
root@utils:/# nslookup en-svc
Server:        10.96.0.10
Address:    10.96.0.10#53

en-svc.default.svc.cluster.local    canonical name = www.shiyanlou.com.
Name:    www.shiyanlou.com
Address: 121.40.227.60

root@utils:/#