在Kubernetes集群中,Ingress是一种用来暴露HTTP和HTTPS服务的API对象,通过Ingress可以为集群中的服务提供外部网络访问的能力。通常情况下,可以通过Ingress Controller将外部请求路由到集群内部的服务,从而实现服务的负载均衡和访问控制。

在使用Ingress时,有时候我们希望通过Node IP来直接访问Ingress后端的服务,而不是通过Cluster IP或者LoadBalancer IP。在下面的教程中,我将向你演示如何使用Kubernetes的Ingress来实现通过Node IP访问服务的方式。

### 教程步骤:

| 步骤 | 操作 |
| --- | --- |
| 1 | 安装并启动Ingress Controller |
| 2 | 创建Ingress资源 |
| 3 | 配置Ingress规则实现通过Node IP访问服务 |

### 步骤一:安装并启动Ingress Controller

首先,我们需要确保集群中已经安装并启动了Ingress Controller。常见的Ingress Controller有Nginx Ingress Controller、Traefik等,你可以选择一种适合自己的。以下是使用Nginx Ingress Controller的示例:

```bash
# 添加Ingress Controller的仓库
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
```

### 步骤二:创建Ingress资源

接下来,我们需要创建一个Ingress资源,并指定需要暴露的服务。以下示例展示了如何创建一个Ingress资源:

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

### 步骤三:配置Ingress规则实现通过Node IP访问服务

最后,我们需要为Ingress资源添加注解,以便通过Node IP直接访问后端的服务。以下是一个示例:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header X-Real-IP $remote_addr;
spec:
rules:
- host: ""
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: sample-service
port:
number: 80
```

在上述示例中,我们通过配置`nginx.ingress.kubernetes.io/rewrite-target: /`注解和`nginx.ingress.kubernetes.io/configuration-snippet`注解来实现通过Node IP访问服务。

通过以上步骤,你已经成功地配置了通过Node IP访问Ingress后端服务的能力。希望这篇教程能够帮助你理解和实践Kubernetes中Ingress的相关知识。如果有任何疑问,请随时提出,我会尽力帮助你解决问题。