k8s Ingress是一种Kubernetes的资源对象,它充当了应用程序到集群内部服务的入口。它可以将外部请求负载均衡到集群内部的多个服务中,还可以提供SSL终端和自定义URL路径路由等功能。本文将详细介绍k8s Ingress的部署及使用,并提供相关的代码示例。

### K8s Ingress部署及使用流程

下面是实现k8s Ingress的部署及使用的步骤概述:

| 步骤 | 描述 |
| ---- | ----- |
| 第一步 | 创建Ingress Controller |
| 第二步 | 配置Ingress规则 |
| 第三步 | 部署应用服务 |
| 第四步 | 将域名解析指向集群 |
| 第五步 | 验证 Ingress 功能 |

下面我们逐步讲解每个步骤需要做什么,并提供相关的代码示例。

### 第一步:创建Ingress Controller

Ingress Controller是Ingress资源的实际运行者,负责处理所有的外部流量并将其路由到集群内的相应的服务。以下是创建Ingress Controller的步骤:

1. 创建Ingress Controller的Deployment:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: ingress-nginx-controller
template:
metadata:
labels:
app: ingress-nginx-controller
spec:
containers:
- name: ingress-nginx-controller
image: k8s.gcr.io/ingress-nginx/controller:v0.45.0
args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
- --election-id=ingress-controller-leader
- --ingress-class=nginx
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
```

上面的示例中,我们创建了一个名称为ingress-nginx-controller的Deployment,使用了来自k8s.gcr.io的ingress-nginx/controller的镜像。在模板中,我们指定了容器的一些参数,如--publish-service用于发布Service供外部访问。

2. 创建Ingress Controller的Service:

```yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
selector:
app: ingress-nginx-controller
```

上面的示例中,我们创建了一个名称为ingress-nginx-controller的Service,提供了80和443端口的访问。

3. 应用配置文件:

```shell
$ kubectl apply -f ingress-controller.yaml
```

### 第二步:配置Ingress规则

配置Ingress规则是指定义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-service
port:
number: 8080
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 8080
```

上面的示例中,我们创建了一个名称为example-ingress的Ingress对象,配置了两条路由规则。当外部请求的Host为example.com时,根据请求的URL路径,负载均衡到名为app1-service和app2-service的两个Service上,它们的端口分别为8080。

应用配置文件:

```shell
$ kubectl apply -f ingress-rule.yaml
```

### 第三步:部署应用服务

在配置完Ingress规则后,我们需要部署相应的应用服务。

以app1-service为例,我们可以创建一个Deployment和Service定义文件:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1-deployment
spec:
replicas: 3
selector:
matchLabels:
app: app1-service
template:
metadata:
labels:
app: app1-service
spec:
containers:
- name: app1
image: app1:v1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: app1-service
spec:
selector:
app: app1-service
ports:
- name: http
port: 8080
```

应用配置文件:

```shell
$ kubectl apply -f app1.yaml
```

### 第四步:将域名解析指向集群

为了使Ingress规则生效,我们需要将域名解析指向集群的IP地址。

### 第五步:验证 Ingress 功能

通过访问配置的Ingress域名,可以验证Ingress是否能够将流量正确路由到后端的应用服务。

现在你已经了解了k8s Ingress的部署及使用流程,可以根据这些步骤进行实践。希望本文的指导对你的学习有所帮助!