# TKE中使用lb直连获取客户端真实IP

我们在使用TKE的过程中会遇到一个这样的场景，就是我在服务端想获取到有哪些客户端在访问我，并且获取到客户端的真实ip。但是在k8s集群中经过多次的网络的转发，一般是无法获取到客户端真实ip。

为了满足这个常见TKE这边提供了lb直连pod的方式来获取客户端真实的ip，其实tke中能够实现这个方案的主要还是基于在vpc-cni的网络模式下实现的，因为vpc-cni模式可以使pod处于和node节点，vpc同一个网络下，而lb也是在vpc的网络中，因此这边lb就可以直接将请求转发到pod上，下面我们来说一下如何在tke中使用这种模式。

这边还是分为2种类型的工作负载来进行实践操作。

## Deployment使用lb直连

一般我们创建deploy类型的pod，关联创建svc的时候是无法选择直连lb的类型的，因为这边直连需要pod选择vpc-cni网络模式才可以，我们这边先手动创建一个正常的deployement，再去手动修改svc和pod的网络模式即可

我们这里在控制台创建了一个pod

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2Fd0cfaecf7c116465750f0e835806cc48640fc259.png?generation=1606373432439388\&alt=media)

我们可以测试一下非直连的pod，通过10.168.1.5这个机器上发起访问，发现pod日志并没有对应的客户端ip信息

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F930380c68d73ba728b21b17be897ed98c2b5649c.png?generation=1606373432371850\&alt=media)

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F3712f2ebc11e5915b8b829dc8a75f83b7ce46f52.png?generation=1606373432462776\&alt=media)

下面修改对应的svc类型为直连模式，勾选这个采用负载均衡直连pod的模式

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F2ae5be16f3f9c05dc0ea8b2910e0d07c3010667b.png?generation=1606373432824630\&alt=media)

修改下对应的pod为vpc-cni网络模式，在pod中加上参数

```
annotations:
        tke.cloud.tencent.com/networks: tke-route-eni
```

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2Fec348f66cfd70be31b9ddf5231f5b61a10be3d0d.png?generation=1606373432569459\&alt=media)

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F1b6a1fc2b47a31801404ed37e8d37e2d4d0e4464.png?generation=1606373433465221\&alt=media)

现在pod的网络模式已经是vpc-cni了，并且svc也是直连了，下面我们来访问下，看日志能否看到client的ip

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2Fdda0a58ab207e00e08c2b2b8c7aa6f31cf6788d0.png?generation=1606373432795576\&alt=media)

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2Fa4a4c965369b56fe192d43880213c1d629cb1af3.png?generation=1606373433140998\&alt=media)

经过测试是可以获取到客户端的ip的。

## StatefulSet使用lb直连

StatefulSet因为支持在界面创建vpc-cni的网路模式，所以我们只需要在控制台配置就行。

我们不选择vpc-cni模式是没有lb直连选项的

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F12aa2fd54c1935875f0ef21bc86ce8a8f4544e80.png?generation=1606373432994746\&alt=media)

勾选了vpc-cni模式才会出现lb直连选项，所以我们需要在创建的时候选择vpc-cni，并选择lb直连

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2Fb689e58f8a7cec20f0cbba8fa78871afadb02ba0.png?generation=1606373433519316\&alt=media)

下面我们来测试下创建好的sts的直连nginx服务

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F6dee4e148f113adbdcb941831e3b1d1a7b9ed7ec.png?generation=1606373433046323\&alt=media)

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F38bff53d20345fcf74f85a5acd8c3cbe90ca430b.png?generation=1606373432981832\&alt=media)

![upload-image](https://1743139827-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMy-ccvHJYp-MpGyagk%2Fsync%2F4c14d499255b9ede0dbf0158785296b717066907.png?generation=1606373433381306\&alt=media)

经过测试，这这边创建好的sts类型的nginx的pod也可以获取到客户端的真实ip
