Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: do not reuse released ip after subnet updated #1172

Merged

Conversation

liqd1
Copy link
Contributor

@liqd1 liqd1 commented Dec 15, 2021

What type of this PR

Examples of user facing changes:

  • Bug fixes
  1. 修复更新subnet之后仍能够从released ip池中分配出旧ip的问题

Which issue(s) this PR fixes:

Fixes #(issue-number)

@zhangzujian zhangzujian added bug Something isn't working need backport labels Dec 16, 2021
@hongzhen-ma
Copy link
Collaborator

问题现象:
Hello,打扰一下,感觉1.8.1版本的ipam模块有个bug。假设有个pod先创建了,此时随机申请了个ip,然后删除,这个ip就被放入了subnet的releasedIPList池中。这个时候去修改subne t的excluded池,把这个ip排除出去。后续当这个subnet的free池用完的时候,应该还会从release池把最开始的ip拿出来用。而这个ip其实是不应该用的。

从这个现象来说,我们应该考虑在更新 subnet.Spec.ExcludeIps 的时候,检查下加进来的字段,在releasedIPList 中是否存在,如果存在,就从 releasedIPList 中删掉这个重复的地址。这样是不是更合理一些?

另外,可以搜一下 getV4RandomAddress 这个函数的实现,在分配IP地址的时候,如果 V4FreeIPList 用尽了,就回头从V4ReleasedIPList 开始重新分配,这个实际记录的是释放之后可复用的IP。如果直接在子网更新的时候置空,我理解不是很合适。

@liqd1
Copy link
Contributor Author

liqd1 commented Dec 16, 2021

问题现象: Hello,打扰一下,感觉1.8.1版本的ipam模块有个bug。假设有个pod先创建了,此时随机申请了个ip,然后删除,这个ip就被放入了subnet的releasedIPList池中。这个时候去修改subne t的excluded池,把这个ip排除出去。后续当这个subnet的free池用完的时候,应该还会从release池把最开始的ip拿出来用。而这个ip其实是不应该用的。

从这个现象来说,我们应该考虑在更新 subnet.Spec.ExcludeIps 的时候,检查下加进来的字段,在releasedIPList 中是否存在,如果存在,就从 releasedIPList 中删掉这个重复的地址。这样是不是更合理一些?

另外,可以搜一下 getV4RandomAddress 这个函数的实现,在分配IP地址的时候,如果 V4FreeIPList 用尽了,就回头从V4ReleasedIPList 开始重新分配,这个实际记录的是释放之后可复用的IP。如果直接在子网更新的时候置空,我理解不是很合适。

在子网更新的时候,重建了FreeIPList,同时已分配的IP又重新做了一次分配。因此IP只会是要么被分配出去了,要么在free池里。而released池里的IP只会是要么和free池里IP重复,或者是被exclude的IP。所以我还是觉得应该把released池直接置空掉。

顺便提下我的一个疑问,目前来看released池似乎并没有太大作用,只不过是在释放之后做了一次缓存。那在释放的时候,把ip直接释放回free池,下次申请的时候反而比较可能复用到上一次使用的IP,这样不会更合理一点么?缺点应该就是freeIP池可能会更碎片化。

@zhangzujian
Copy link
Member

顺便提下我的一个疑问,目前来看released池似乎并没有太大作用,只不过是在释放之后做了一次缓存。那在释放的时候,把ip直接释放回free池,下次申请的时候反而比较可能复用到上一次使用的IP,这样不会更合理一点么?缺点应该就是freeIP池可能会更碎片化。

@liqd1 如果考虑到 ARP 缓存,我认为优先分配未使用过的 IP 更合理。

@hongzhen-ma hongzhen-ma merged commit 624b8aa into kubeovn:master Dec 20, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working need backport
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants