Kubernetes(简称K8s)是一个开源容器编排和管理平台,它可以帮助我们更方便地部署、扩展和管理容器化的应用程序。在Kubernetes中,Ingress是一种常用的Kubernetes资源,它可以将外部的HTTP/HTTPS流量路由到集群中的服务。本文将介绍如何使用Ingress部署Nginx。

## 一、部署Nginx Ingress Controller
要使用Ingress部署Nginx,我们首先需要部署Nginx Ingress Controller。Nginx Ingress Controller是一个基于Nginx的Ingress控制器,它负责监听Ingress资源的变化,并根据配置动态地更新Nginx的配置文件。

下面是部署Nginx Ingress Controller的步骤:

| 步骤 | 描述 |
| ---- | ---- |
| 1 | 创建命名空间 |
| 2 | 添加Nginx Ingress Controller的Helm仓库 |
| 3 | 安装Nginx Ingress Controller |

### 步骤1:创建命名空间
在Kubernetes集群中创建一个命名空间,用于存放Nginx Ingress Controller相关的资源。

```shell
kubectl create namespace ingress-nginx
```

### 步骤2:添加Nginx Ingress Controller的Helm仓库
使用Helm包管理工具,需要为Helm添加Nginx Ingress Controller的Helm仓库。

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

### 步骤3:安装Nginx Ingress Controller
使用Helm安装Nginx Ingress Controller,可以通过以下命令完成安装:

```shell
helm install nginx-ingress ingress-nginx/ingress-nginx -n ingress-nginx
```

安装完成后,可以使用以下命令查看Nginx Ingress Controller的Pod是否正常运行:

```shell
kubectl get pods -n ingress-nginx
```

如果看到类似以下输出,表示Nginx Ingress Controller已成功部署:

```
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-xxxxxxxxxx-xxxxx 1/1 Running 0 xxm
```

## 二、编写Ingress资源
当Nginx Ingress Controller部署完成后,我们需要编写Ingress资源来定义路由规则。下面是一个简单的Ingress资源示例:

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

在上面的示例中,我们定义了两个路由规则,一个是`/app1`的请求将被路由到`app1`服务,另一个是`/app2`的请求将被路由到`app2`服务。

## 三、部署应用服务
在定义好Ingress资源后,我们需要部署应用服务,并将服务暴露给Nginx Ingress Controller。

下面是一个部署应用服务的示例:

```yaml
apiVersion: v1
kind: Service
metadata:
name: app1
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: app1

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1
spec:
replicas: 2
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: app1:latest
ports:
- containerPort: 8080
```

在上面的示例中,我们定义了一个名为`app1`的服务和部署。通过`selector`字段,将服务和部署与Ingress资源中的`backend`关联起来。

类似地,我们需要为`app2`应用也部署相应的服务和部署。

## 四、应用部署
完成以上步骤后,我们可以使用以下命令部署应用服务:

```shell
kubectl apply -f ingress.yaml
kubectl apply -f app1.yaml
kubectl apply -f app2.yaml
```

部署完成后,可以使用以下命令查看Ingress资源和应用服务的状态:

```shell
kubectl get ingress
kubectl get services
kubectl get pods
```

## 五、验证部署结果
当部署完成后,我们可以通过浏览器访问`example.com/app1`来访问`app1`服务,访问`example.com/app2`来访问`app2`服务。

至此,我们已经通过Ingress部署了Nginx,并成功将外部流量路由到了应用服务。根据实际场景,你可以根据需求修改和添加更多的Ingress规则,更灵活地实现路由功能。