Kubernetes Service之LoadBalance Service

K8s的Service资源是一种为一组功能相同的Pod提供统一不变的流量入口的资源。这里介绍其中的LoadBalance Service

abstract.png

概要

LoadBalance Service视作为对NodePort Service的拓展。在大多数K8s云提供商的环境中,K8s集群可以通过负载均衡器使得LoadBalance Service拥有一个公网IP。以便真正地对外暴露服务。但如果K8s在不支持LoadBalance Service的环境中运行,则不会调配负载均衡器。此时该服务将会表现的像是一个NodePort Service,因为LoadBalance Service是对NodePort Service的拓展。由于这里我们是通过Kind在本地搭建的K8s集群,故可以通过Metallb使得LoadBalance Service被分配一个外网IP

部署Metallb

1. 下载配置文件

通过下述链接分别下载Metallb命名空间、清单的YAML配置文件。保存到本地后,分别命名为01-metallb-namespace.yaml、02-metallb-manifest.yaml

1
2
3
4
5
# 配置文件1: Metallb的命名空间
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml

# 配置文件2:Metallb的清单
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

2. 应用配置文件

通过kubectl apply命令依次应用上述两个配置文件

1
2
3
4
5
# 应用Metallb的命名空间
kubectl apply -f 01-metallb-namespace.yaml

# 应用Metallb的清单
kubectl apply -f 02-metallb-manifest.yaml

然后等待Metallb Pod的状态全部为 Running,如下所示

figure 1.jpeg

3. 配置负载均衡器的IP地址池

通过执行下述命令查看Docker中Kind网络的子网信息

1
2
# 查看Docker中Kind网络信息
docker network inspect -f '{{.IPAM.Config}}' kind

不能看出,在当前环境下,Docker中kind网络的子网地址为172.18.0.0/16

figure 2.jpeg

那么我们只需保证负载均衡器的IP地址池中的IP,全部在该网段下即可。故我们可以通过创建Configmap将Metallb配置为使用172.18.255.200~172.18.255.250范围的IP。配置文件03-metallb-configmap.yaml的完整内容如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置负载均衡器的IP地址池

apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.18.255.200-172.18.255.250

同理,通过kubectl apply命令应用该配置文件即可

1
2
# 应用Metallb的Configmap
kubectl apply -f 03-metallb-configmap.yaml

效果如下所示

figure 3.jpeg

部署 LoadBalance Service

配置文件如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# API组、版本
apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
# RS名称
name: my-kubia-rs-1
spec:
# 副本数量
replicas: 3
# 标签选择器
selector:
matchLabels:
app: kubia
# Pod 模板
template:
metadata:
# 标签信息
labels:
app: kubia
spec:
# 容器信息
containers:
- name: my-kubia-1
image: luksa/kubia
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

---

# API组、版本
apiVersion: v1
# 资源类型
kind: Service
metadata:
# 资源名称
name: my-loadbalance-service-1
spec:
# Service类型
type: LoadBalancer
selector:
app: kubia
ports:
- port: 997 # 服务监听端口
targetPort: 8080 # 服务将请求转发到Pod的目标端口
# 在集群各节点所打开的端口, 使得可以通过集群中任一节点IP、nodePort端口号访问该服务
nodePort: 32329

效果如下所示,该服务的EXTERNAL-IP列显示已经被分配了一个外网IP

figure 4.jpeg

现在我们进行验证,先通过服务的集群IP、端口访问。效果如下所示

figure 5.jpeg

再通过集群节点IP、服务在节点上打开的端口来访问服务。效果如下所示

figure 6.jpeg

最后再通过服务的外网IP、端口来访问服务。效果如下所示

figure 7.jpeg

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著
0%