# 从四层负载均衡到七层负载均衡:一步步教你实现

## 一、四层负载均衡 vs 七层负载均衡

在 K8S 中,负载均衡通常分为四层负载均衡和七层负载均衡。四层负载均衡指的是基于IP地址和端口号的负载均衡,主要工作在传输层(TCP/UDP),而七层负载均衡是基于应用层的负载均衡,在传输层之上通过HTTP头、URL等协议来实现。本文将带你从零开始实现四层负载均衡和七层负载均衡。

## 二、实现过程

下面将以表格的形式展示整个过程的步骤,然后针对每一步进行详细的代码示例和解释。

| 步骤 | 操作 | 代码示例 |
|---------|------------|----------------------------------|
| 步骤一 | 创建 Deployment | `kubectl create deployment my-app --image=my-image` |
| 步骤二 | 创建 Service | `kubectl expose deployment my-app --port=80 --type=NodePort` |
| 步骤三 | 实现四层负载均衡 | 无需额外操作,NodePort已经实现了四层负载均衡 |
| 步骤四 | 实现七层负载均衡 | 部署 Ingress Controller 并创建 Ingress 资源 |

### 1. 创建 Deployment

Deployment 是 K8S 中用来定义应用程序副本数以及更新策略的对象。创建一个 Deployment 可以通过以下命令:

```bash
kubectl create deployment my-app --image=my-image
```

这里的 `my-app` 是 Deployment 的名称,`my-image` 是你要部署的应用的镜像。

### 2. 创建 Service

Service 是 K8S 中用来将流量引导到应用程序副本的对象。创建一个 Service 可以通过以下命令:

```bash
kubectl expose deployment my-app --port=80 --type=NodePort
```

这里的 `my-app` 对应的是之前创建的 Deployment 的名称,`--port=80` 指定了 Service 暴露的端口号,`--type=NodePort` 表示使用 NodePort 类型的 Service。

### 3. 实现四层负载均衡

在上一步中创建的 Service 中,指定了 NodePort 类型,这已经实现了四层负载均衡。NodePort Service 会在每个 Node 上分配一个端口,并将流量转发到后端 Pod。

### 4. 实现七层负载均衡

要实现七层负载均衡,需要先部署 Ingress Controller 并创建 Ingress 资源。以下以 Nginx Ingress Controller 为例:

#### 部署 Ingress Controller

部署 Nginx Ingress Controller 可以通过 Helm 来进行,首先添加 Repo:

```bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
```

然后安装 Ingress Controller:

```bash
helm install my-nginx-controller ingress-nginx/ingress-nginx
```

#### 创建 Ingress 资源

创建一个 Ingress 资源可以将外部流量引导到对应的 Service。以下是一个示例:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
```

上面的配置表示将 `my-domain.com` 的流量引导到名为 `my-app` 的 Service 的端口 80 上。你可以根据实际情况修改域名和后端 Service 的信息。

## 结语

通过以上步骤,你已经成功实现了四层负载均衡和七层负载均衡。四层负载均衡主要在传输层进行负载均衡,而七层负载均衡则可以在应用层实现更灵活的负载均衡策略。希望本文能够帮助你理解并应用这两种负载均衡方式。