在Kubernetes(K8S)中,获取用户IP地址是一个常见的需求,尤其是在开发网络应用时。用户IP地址可以帮助我们追踪用户的访问情况、进行访问控制等操作。在这篇科普文章中,我将引导你学习如何在K8S中获取用户IP地址。

### 获取用户IP的流程

首先,让我们了解一下获取用户IP的整个流程。下面是获取用户IP的大致步骤,我们将在后文中逐步解释每个步骤:

| 步骤 | 描述 |
|------|---------------|
| 1 | 创建 Service |
| 2 | 开启 Pod 网络注入 |
| 3 | 使用 Annotations 修改对应 Service |
| 4 | 获取用户IP地址 |

### 步骤细节及代码示例

#### 步骤 1: 创建 Service

首先,在K8S中,我们需要创建一个 Service 来暴露我们的应用。在 Service 的配置文件中,需要设置`service.spec.externalTrafficPolicy`为`Local`,这样可以将用户的真实 IP 地址传递给后端 Pod。

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

#### 步骤 2: 开启 Pod 网络注入

为了获取用户的真实 IP 地址,我们需要在 Pod 中开启网络注入。我们可以通过在 Pod 的 annotations 中添加`service.beta.kubernetes.io/external-traffic: "Only"`来开启此功能。

```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
annotations:
service.beta.kubernetes.io/external-traffic: "Only"
spec:
containers:
- name: my-container
image: nginx:latest
```

#### 步骤 3: 使用 Annotations 修改对应 Service

我们需要修改之前创建的 Service,添加`externalTrafficPolicy: Local`和`loadBalancerSourceRanges`,以便将真实的用户 IP 地址传递给后端。

```yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
annotations:
service.beta.kubernetes.io/external-traffic: "Only"
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
externalTrafficPolicy: Local
loadBalancerSourceRanges:
- 0.0.0.0/0
```

#### 步骤 4: 获取用户IP地址

最后,在你的应用中,你可以通过读取请求头中的`X-Real-IP`或`X-Forwarded-For`字段来获取用户的真实 IP 地址。

```javascript
const express = require('express');
const app = express();

app.get('/', (req, res) => {
const userIP = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress;
res.send(`Your IP address is: ${userIP}`);
});

app.listen(3000, () => {
console.log('Server is running on port 3000');
});
```

通过以上步骤,我们成功实现了在K8S中获取用户的IP地址。希望这篇科普文章能够帮助到你,让你更深入了解Kubernetes的应用。祝你在学习和工作中取得成功!