在使用Kubernetes(K8S)中,有时我们需要获取客户端真实的IP地址,而不是被代理服务器改写后的IP地址,这对于一些网络安全策略的实施非常重要。在使用Docker容器时,由于容器的网络隔离性,获取客户端真实IP地址也会有一定的难度。下面我将为你介绍如何在K8S中实现获取客户端真实IP的方法。

### 实现流程
首先,让我们来了解一下整个获取客户端真实IP的流程。具体步骤如下:

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

### 操作步骤及代码示例
1. 配置Ingress Controller

首先,需要确保已经安装了Ingress Controller,比如可以使用Nginx 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
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
```

2. 配置Service

配置Service时,需要设置`externalTrafficPolicy`为`Local`,这样可以将请求直接路由到Pod所在的节点,从而保留客户端真实IP地址。

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

3. 获取客户端真实IP

在应用中获取客户端真实IP的方法会根据使用的语言和框架而有所不同。以下是一个示例,使用Golang的示例代码:

```go
package main

import (
"fmt"
"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
ip := r.Header.Get("X-Real-IP") // 获取真实IP地址
fmt.Fprintf(w, "Client IP: %s", ip)
}

func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":80", nil)
}
```

4. 配置Nginx

最后,在Nginx中配置将真实IP地址传递给后端应用。可以在Nginx配置文件中添加如下配置:

```
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://example-service;
}
```

通过以上步骤的操作,就可以实现在K8S中,通过Docker容器获取客户端的真实IP地址。记得根据具体的应用及环境进行适当的调整,以确保功能的正确实现。希望这篇文章对你有所帮助!