### 获取用户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的应用。祝你在学习和工作中取得成功!