K8S 集群 Ingress 科普文章

在 K8S 集群中,Ingress 是一个用于管理入口流量的 API 对象。它可以提供对集群中服务的外部访问,并支持负载均衡、路由等功能。本文将向你介绍如何在 K8S 集群中使用 Ingress。

一、Ingress 的工作原理

Ingress 通过将一个统一的入口点暴露给外部流量,将请求转发到集群中的不同服务。它通常与一个 Ingress Controller 配套使用,Ingress Controller 负责实际的流量路由和负载均衡。

具体的流程可以用以下表格展示:

| 步骤 | 描述 |
| ---- | ---- |
| 步骤1 | 部署 Ingress Controller |
| 步骤2 | 配置 Ingress 资源 |
| 步骤3 | 外部流量通过 Ingress 访问服务 |

下面,我们逐步介绍每个步骤需要做的事情和相应的代码示例。

二、部署 Ingress Controller

首先,你需要选择一个合适的 Ingress Controller 部署到你的 K8S 集群中。常见的 Ingress Controller 有 Nginx Ingress Controller、Traefik、HAProxy 等。这里以 Nginx Ingress Controller 为例。

使用以下命令来部署 Nginx Ingress Controller:

```shell
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml
```

这条命令将会在你的集群中创建一个名为 ingress-nginx 的命名空间,并部署 Nginx Ingress Controller 相关的资源。

三、配置 Ingress 资源

在部署了 Ingress Controller 之后,你需要配置相应的 Ingress 资源,以定义流量的路由规则。

首先,你需要创建一个 Ingress 的定义文件(比如 ingress.yaml),示例如下:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: example.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-service
port:
number: 80
```

在这个示例中,我们定义了一个名为 my-ingress 的 Ingress 对象,设置了访问 host 为 example.com,路径为 /foo 的请求将会被转发到 foo-service 服务的 80 端口上。

然后,使用以下命令来创建 Ingress 资源:

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

四、外部流量通过 Ingress 访问服务

当 Ingress 资源配置好之后,外部流量就可以通过 Ingress 访问到相应的服务了。

你可以通过以下命令查看 Ingress 的状态:

```shell
$ kubectl get ingress
```

如果 Ingress 部署成功并且和 Ingress Controller 的组件正常运行,你将看到类似如下的输出:

```
NAME CLASS HOSTS ADDRESS PORTS AGE
my-ingress example.com 192.168.1.2 80 10m
```

现在,你可以通过浏览器访问 http://example.com/foo,就能够访问到 foo-service 服务的内容了。

五、总结

Ingress 提供了一种简单的方式来管理集群中的入口流量,并实现流量的负载均衡和路由等功能。通过部署 Ingress Controller 和配置相应的 Ingress 资源,我们可以轻松地将外部流量转发到集群中的不同服务。

本文介绍了 Ingress 的工作原理和实际操作步骤,希望能够帮助你理解和使用 K8S 集群中的 Ingress 功能。

参考链接:
- [Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)
- [Nginx Ingress Controller](https://kubernetes.github.io/ingress-nginx/)