Kubernetes Service之LoadBalance Service

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

Kubernetes Service之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: 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命令依次应用上述两个配置文件

# 应用Metallb的命名空间
kubectl apply -f 01-metallb-namespace.yaml

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

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

Kubernetes Service之LoadBalance Service

figure 1.jpeg

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

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

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

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

Kubernetes Service之LoadBalance Service

figure 2.jpeg

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

# 设置负载均衡器的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命令应用该配置文件即可

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

效果如下所示

Kubernetes Service之LoadBalance Service

figure 3.jpeg

部署 LoadBalance Service

配置文件如下所示

# 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

Kubernetes Service之LoadBalance Service

figure 4.jpeg

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

Kubernetes Service之LoadBalance Service

figure 5.jpeg

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

Kubernetes Service之LoadBalance Service

figure 6.jpeg

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

Kubernetes Service之LoadBalance Service

figure 7.jpeg

参考文献

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

原文始发于微信公众号(青灯抽丝):Kubernetes Service之LoadBalance Service

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/41985.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!