tnblog
首页
视频
资源
登录

Kubernetes Calic IPAM

5694人阅读 2022/11/27 16:41 总访问:3656922 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes Calico IPAM

IPAM 简介


CNI的职责包括给 Container 分配网络设备,并且分配IP,IPAM(IP Address Management)就是指IP分配相关的功能和规范。

CNI本身只是一个规范,不同的实现在 IPAM 方面的功能集也不尽相同。下面将首先尝试说明下不同 CNI在这块的实现。

calico开发的IPAM组件叫 calico-ipam, 它使用 calico 的 IP pool resource来管理 IP.。它的主要优势就是可以将 pool 分割成小的 block, 并且可以动态对分配给不同的 node。node 上的 ip 利用率会更高,并且可扩展性也很好。calico 目前也支持给不同的namespace分配不同的 ip pool. 从大的方面来看,其实最终 各个CNI 实现要解决的问题都是类似的,一般区别只是 dataplane 以及具体的 CRD的设计不太一样。所以这些功能很可能(已经有了或者以后会有)出现在其他的 CNI 上面。

设置Calico IPAM


首先需要设置CNI IPAM的配置为calico-ipam

  1. cd /etc/cni/net.d/
  2. ls
  3. cat 10-calico.conflist


关于calico ipam支持的方式有下列几种:


1.根据拓扑分配地址
2.为pod使用特定地址
3.从一个IP池迁移到另一个
4.使用IP范围与旧式防火墙互操作
5.查看IP地址利用率
6.更改IP地址块大小

根据拓扑分配地址


简单来讲:我们可以给我们的集群节点服务器打上标签,然后更具这些标签打上不同的ip段。
怎么打?
就在我们ippool里面的selector选标签决定了ip池的范围。

  1. calicoctl get ippool -o wide

简单实践


首先我们禁用掉原有的default-ipv4-ippool

  1. calicoctl get ippool -o yaml > default-ipv4-ippool.yaml
  2. vim default-ipv4-ippool.yaml
  3. # 添加disabled: true
  4. calicoctl apply -f default-ipv4-ippool.yaml


禁用掉后我们现在ip池中没有一个可用的ip池,所以新的pod将分配不了IP。
接下来为我们的node打上标签。

  1. # 为k8s-1打上rack=0的标签
  2. kubectl label nodes k8s-1 rack=0
  3. # 为k8s-2打上rack=0的标签
  4. kubectl label nodes k8s-2 rack=1


接下来根据不同的节点标签使用不同的IP池子。

  1. calicoctl create -f -<<EOF
  2. apiVersion: projectcalico.org/v3
  3. kind: IPPool
  4. metadata:
  5. name: rack-0-ippool
  6. spec:
  7. cidr: 192.168.0.0/24
  8. ipipMode: Always
  9. natOutgoing: true
  10. nodeSelector: rack == "0"
  11. EOF
  1. calicoctl create -f -<<EOF
  2. apiVersion: projectcalico.org/v3
  3. kind: IPPool
  4. metadata:
  5. name: rack-1-ippool
  6. spec:
  7. cidr: 192.168.1.0/24
  8. ipipMode: Always
  9. natOutgoing: true
  10. nodeSelector: rack == "1"
  11. EOF
  1. calicoctl get ippool -o wide


我们可以看到名为rack-0-ippool的IP池子为拥有rack == "0"标签的节点使用192.168.0.0/24段,rack-1-ippool的IP池子为拥有rack == "1"标签的节点使用192.168.1.0/24段。
我们改一下cni.yaml,然后跑一下。

  1. vim cni.yaml

  1. kubectl apply -f cni.yaml
  2. kubectl get pod


我们的两个pod跑起来了,可以发现在k8s-1节点上的IP为192.168.0.129,k8s-2节点上的IP为192.168.1.193,它们分配的IP是不同的IP池子。
ok,这就是基于拓扑分配IP地址。

为pod使用特定地址


当我们的Pod需要用到特定的IP地址时,Calico一般采用注释这个IP的方式来做的,下面我们将进行简单的实践。

简单实践


首先我们删除刚刚创建的ippools。

  1. calicoctl delete ippool rack-0-ippool rack-1-ippool


创建一个新的IP池,值得注意的是这里的nodeSelector是选择不允许所有的节点"!all()"

  1. vim net.yaml
  1. apiversion: projectcalico.org/v3
  2. kind: IPPool
  3. metadata:
  4. name: staticippool
  5. spec:
  6. cidr: 172.16.0.0/26
  7. blockSize: 29
  8. ipipMode: Always
  9. natOutgoing: true
  10. nodeSelector: "!all()"


然后应用一下。

  1. calicoctl apply -f net.yaml
  2. calicoctl get ippool -o wide


然后我们在我们的Pod上打上cni.projectcalico.org/ipAddrs标签并设置为我们staticippoolIP 池中网段下的IP。

  1. vim calico_static.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: calico-static-pod
  5. labels:
  6. app: myapp
  7. annotations:
  8. cni.projectcalico.org/ipAddrs: "[\"172.16.0.2\"]"
  9. spec:
  10. containers:
  11. - name: static-container
  12. image: burlyluo/nettoolbox
  1. kubectl apply -f calico_static.yaml
  2. kubectl get pod -o wide


这就是为pod使用特定地址。
那要是使用Deployment怎么办?
cni.projectcalico.org/ipAddrs中定义了多少个ip,就可以replicas多少个pod。

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: static-ip
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 1 # tells deployment to run 1 pods matching the template
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. annotations:
  15. "cni.projectcalico.org/ipAddrs": "[\"172.16.0.5\"]"
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: burlyluo/nettoolbox

从一个IP池迁移到另一个


简单来讲创建一个新的IP Pool,把老的的IP Pool禁用掉,再把Pod一个一个的删除。
这里我就不做多的演示了,自己可以参考文档:https://projectcalico.docs.tigera.io/networking/migrate-pools

使用IP范围与旧式防火墙互操作


简单来讲:与指定Pod特定的IP差不多,都是通过注释的方式进行。
只是这里指定的是IP Pools。

  1. # ipv4
  2. cni.projectcalico.org/ipv4pools: '["pool-1", "pool-2"]'
  3. # ipv6
  4. cni.projectcalico.org/ipv6pools: '["pool-1", "pool-2"]'

查看IP地址利用率(地址分配)


打印有关借用IP地址的详细信息。

  1. calicoctl ipam show --show-borrowed


打印当前IPAM配置。

  1. calicoctl ipam show --show-configuration


检测ipam的详细信息,以及存在的问题。

  1. calicoctl ipam check


如果你的IP地址有问题了,比如IP Pool替换更新了,你需要将Pod重新Release一下,怎么做?
首先需要Lock一下,告诉其他人先不要分配IP地址。

  1. calicoctl datastore migrate lock


然后把IPAM的检测以json的方式导出到report.json文件中。

  1. calicoctl ipam check -o report.json
  2. cat report.json


然后我们释放未设置的ip地址。大概会检测20分钟。

  1. calicoctl ipam release --from-report=report.json


然后我们解锁。

  1. calicoctl datastore migrate unlock


最后验证一下。

  1. calicoctl ipam check

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术