## Kubernetes 中获取客户端真实 IP 地址的实现

在 Kubernetes 集群中,如果想要获取客户端的真实 IP 地址,需要进行特定的配置和使用一些技巧。本文将指导你如何在 Kubernetes 中实现获取客户端真实 IP 地址的功能。

### 流程概述

首先,让我们通过以下步骤概括在 Kubernetes 中获取客户端真实 IP 地址的流程:

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

现在让我们逐步详细介绍每个步骤,并提供相应的代码示例。

### 1. 配置 Ingress Controller

首先,我们需要配置 Ingress Controller 来暴露服务并管理流量。在配置 Ingress Controller 时,需要确保启用了相应的选项来传递客户端的真实 IP 地址。

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
ingressClassName: nginx
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-real-ip: "true" # 启用传递真实 IP 地址
```

### 2. 配置 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
externalTrafficPolicy: Local # 使用本地流量策略
```

### 3. 配置 Pod

在配置 Pod 时,我们需要确保它包含了获取客户端真实 IP 地址所需的必要设置。

```yaml
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
ports:
- containerPort: 80
env:
- name: REAL_IP_FROM
value: "$remote_addr" # 获取客户端真实 IP 地址
```

### 4. 获取客户端真实 IP 地址

最后,我们可以在应用程序中通过读取特定的 Header 来获取客户端真实 IP 地址。

```python
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def get_client_ip():
client_ip = request.headers.get('X-Real-IP') # 从 Header 中获取真实 IP
return f"Client's real IP address is: {client_ip}"

if __name__ == '__main__':
app.run()
```

以上就是在 Kubernetes 中获取客户端真实 IP 地址的完整流程。通过配置 Ingress Controller、Service 和 Pod,并在应用程序中读取相应的 Header,我们可以轻松地获取客户端的真实 IP 地址。希望本文对你有所帮助,欢迎继续探索 Kubernetes 的更多功能!