Kubernetes (K8S) 是目前最流行的容器编排工具之一,它可以管理容器化的应用程序,并提供了弹性伸缩、负载均衡等功能。在某些情况下,我们需要获取客户机的IP地址,但由于网络转发等原因,K8S 有时无法直接获取客户端的真实 IP 地址,这就是“k8s 拿不到客户机 IP”的问题。

在解决这个问题之前,我们首先需要了解一下整个流程,下面是一个简单的流程图和表格:

| 步骤 | 操作 |
| ---- | -------------------------------------- |
| 1 | 配置 Ingress Controller |
| 2 | 配置 Service |
| 3 | 配置 NGINX 反向代理 |
| 4 | 获取客户端真实 IP 地址 |


### 步骤一:配置 Ingress Controller

首先,我们需要在 K8S 集群中配置一个 Ingress Controller,以便处理外部流量的路由和负载均衡。可以使用 Nginx、Traefik 等不同的 Ingress Controller,这里以 Nginx 为例。

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

### 步骤二:配置 Service

接下来,我们需要配置一个 Service,暴露我们的应用程序给 Ingress Controller 使用。

```yaml
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example-app
ports:
- protocol: TCP
port: 80
targetPort: 80
```

### 步骤三:配置 NGINX 反向代理

在 Ingress Controller 的配置中,我们使用了一个名为 `nginx.ingress.kubernetes.io/enable-real-ip` 的注解,该注解将启用 Nginx 的 real_ip 模块,以便向上游服务器传递真实的客户端 IP 地址。

### 步骤四:获取客户端真实 IP 地址

现在,您可以在您的应用程序中通过以下代码片段获取真实的客户端 IP 地址:

```python
from flask import request

@app.route('/')
def get_client_ip():
client_ip = request.headers.get('X-Real-IP')
return f"Client IP Address: {client_ip}"
```

通过以上步骤,我们已经成功地解决了“k8s 拿不到客户机 IP”这个问题,并且能够在应用程序中准确获取客户端的真实 IP 地址。希望这篇文章能帮助您更好地理解和解决这个问题。