【Kubernetes】Service 负载均衡

572 阅读1分钟

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

一、LoadBalancer Service 简介

LoadBalancer Service 是在 Node Service 的基础上继续扩展的,类似于 Node ServiceCluster Service 的基础上进行扩展。

ExternalName Service 适用于外部服务使用域名的方式,它的缺点是不能指定端口。

通过任意一个 NodeIP:NodePort 就可以访问集群服务,假如集群有多个 Node 节点,比如 10 个、20 个,如何分配对于这些节点的访问请求呢?

这个时候最好是有一个负载均衡器,外部的客户端请求只需要访问负载均衡器的 IP 地址,然后由外部负载均衡器分配转发流量到后端 NodeNodePort 上,具体如下图所示:

LoadBalancer 组件一般是独立于 Kubernetes 集群之外的,大部分的时候是一个硬件的负载均衡器,也可以用软件方式实现,比如:HAProxy 或是 Nginx。对于每个服务都需要配置一个与之对应的 LoadBalancer 实例,这样会增加工作量和出错的概率。

二、使用 nginx 软件手动实现负载均衡

  1. 创建 tomact-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 2
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat
          ports:
            - containerPort: 8080
  1. 执行创建
$ kubectl create -f tomcat-deployment.yaml
deployment.apps/tomcat created
  1. 新建 tomcat-svc.yaml文件
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
spec:
  type: NodePort
  ports:
  - port: 80 # 设置 ClusterIP 对应的端口为 80
    targetPort: 8080 # Pod 开放的端口为 8080
    nodePort: 30001 # 设置在 Node 上开放的端口为 30001
  selector:
    app: tomcat
  1. 执行创建
$ kubectl create -f tomcat-svc.yaml
service/tomcat-svc created
# 创建 NodePort 类型的服务成功
$ kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
tomcat-svc   NodePort    10.98.46.27   <none>        80:30001/TCP   22m
  1. 试着访问一下
$ curl 10.192.0.2:30001
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.5.47</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>
...
  1. 安装并配置 nginx作为负载均衡器进行模拟
# 查看环境中 `nginx` 版本信息
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)

编辑 nginx配置文件 sudo vim /etc/nginx/nginx.conf

http {
...
    # 添加 k8s 集群所有可用的 nodeIP:nodePort
    upstream k8snode {
        server 10.192.0.2:30001;
        server 10.192.0.3:30001;
        server 10.192.0.4:30001;
    }
​
    # 设置虚拟主机
    server {
        # 监听 81 端口
        listen 81;
        location / {
            # 反向代理指令,将所有的请求都发送给 k8snode 机器组中的机器
            proxy_pass http://k8snode;
        }
    }
​
}

保存配置文件,检查配置文件是否有误

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

使配置文件生效

sudo nginx -s reload

可以通过 http://localhost:81 进行访问

\