首页
视频
资源
登录
原
Kubernetes Calic IPAM
3331
人阅读
2022/11/27 16:41
总访问:
2538045
评论:
0
收藏:
0
手机
分类:
容器编排
![](https://img.tnblog.net/arcimg/hb/cf0187c40cbd4549a3cbad26c140763f.png) >#Kubernetes Calico IPAM [TOC] ## IPAM 简介 tn2>CNI的职责包括给 Container 分配网络设备,并且分配IP,IPAM(IP Address Management)就是指IP分配相关的功能和规范。<br/> CNI本身只是一个规范,不同的实现在 IPAM 方面的功能集也不尽相同。下面将首先尝试说明下不同 CNI在这块的实现。<br/> calico开发的IPAM组件叫 calico-ipam, 它使用 calico 的 IP pool resource来管理 IP.。它的主要优势就是可以将 pool 分割成小的 block, 并且可以动态对分配给不同的 node。node 上的 ip 利用率会更高,并且可扩展性也很好。calico 目前也支持给不同的namespace分配不同的 ip pool. 从大的方面来看,其实最终 各个CNI 实现要解决的问题都是类似的,一般区别只是 dataplane 以及具体的 CRD的设计不太一样。所以这些功能很可能(已经有了或者以后会有)出现在其他的 CNI 上面。 ## 设置Calico IPAM tn2>首先需要设置CNI IPAM的配置为`calico-ipam`。 ```bash cd /etc/cni/net.d/ ls cat 10-calico.conflist ``` ![](https://img.tnblog.net/arcimg/hb/f5c92da4f8134f9a83d2652dded7f8d8.png) tn2>关于calico ipam支持的方式有下列几种: <br/> 1.根据拓扑分配地址 2.为pod使用特定地址 3.从一个IP池迁移到另一个 4.使用IP范围与旧式防火墙互操作 5.查看IP地址利用率 6.更改IP地址块大小 ## 根据拓扑分配地址 tn2>简单来讲:我们可以给我们的集群节点服务器打上标签,然后更具这些标签打上不同的ip段。 怎么打? 就在我们ippool里面的selector选标签决定了ip池的范围。 ![](https://img.tnblog.net/arcimg/hb/1b1e405a76ae4cd186dd372caa94b32b.png) ```bash calicoctl get ippool -o wide ``` ![](https://img.tnblog.net/arcimg/hb/6b1d72191fb841319c2ba7046596287e.png) >### 简单实践 tn2>首先我们禁用掉原有的`default-ipv4-ippool`。 ```bash calicoctl get ippool -o yaml > default-ipv4-ippool.yaml vim default-ipv4-ippool.yaml # 添加disabled: true calicoctl apply -f default-ipv4-ippool.yaml ``` tn2>禁用掉后我们现在ip池中没有一个可用的ip池,所以新的pod将分配不了IP。 接下来为我们的node打上标签。 ```bash # 为k8s-1打上rack=0的标签 kubectl label nodes k8s-1 rack=0 # 为k8s-2打上rack=0的标签 kubectl label nodes k8s-2 rack=1 ``` ![](https://img.tnblog.net/arcimg/hb/2d368d622d934e21b177f1db548e2c89.png) tn2>接下来根据不同的节点标签使用不同的IP池子。 ```bash calicoctl create -f -<<EOF apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: rack-0-ippool spec: cidr: 192.168.0.0/24 ipipMode: Always natOutgoing: true nodeSelector: rack == "0" EOF ``` ```bash calicoctl create -f -<<EOF apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: rack-1-ippool spec: cidr: 192.168.1.0/24 ipipMode: Always natOutgoing: true nodeSelector: rack == "1" EOF ``` ```bash calicoctl get ippool -o wide ``` ![](https://img.tnblog.net/arcimg/hb/f931c6a22a3a4608be22860fb2343d07.png) tn2>我们可以看到名为`rack-0-ippool`的IP池子为拥有`rack == "0"`标签的节点使用`192.168.0.0/24`段,`rack-1-ippool`的IP池子为拥有`rack == "1"`标签的节点使用`192.168.1.0/24`段。 我们改一下`cni.yaml`,然后跑一下。 ```bash vim cni.yaml ``` ![](https://img.tnblog.net/arcimg/hb/4f6d83beaad44caaa39148f3ec78427b.png) ```bash kubectl apply -f cni.yaml kubectl get pod ``` ![](https://img.tnblog.net/arcimg/hb/d74e360b0e9e45c598e8374642c839be.png) tn2>我们的两个pod跑起来了,可以发现在k8s-1节点上的IP为`192.168.0.129`,k8s-2节点上的IP为`192.168.1.193`,它们分配的IP是不同的IP池子。 ok,这就是基于拓扑分配IP地址。 ## 为pod使用特定地址 tn2>当我们的Pod需要用到特定的IP地址时,Calico一般采用注释这个IP的方式来做的,下面我们将进行简单的实践。 >### 简单实践 tn2>首先我们删除刚刚创建的ippools。 ```bash calicoctl delete ippool rack-0-ippool rack-1-ippool ``` tn2>创建一个新的IP池,值得注意的是这里的nodeSelector是选择不允许所有的节点`"!all()"`。 ```bash vim net.yaml ``` ```yaml apiversion: projectcalico.org/v3 kind: IPPool metadata: name: staticippool spec: cidr: 172.16.0.0/26 blockSize: 29 ipipMode: Always natOutgoing: true nodeSelector: "!all()" ``` tn2>然后应用一下。 ```bash calicoctl apply -f net.yaml calicoctl get ippool -o wide ``` ![](https://img.tnblog.net/arcimg/hb/7735b42474074d30b1d9df87306f7448.png) tn2>然后我们在我们的Pod上打上`cni.projectcalico.org/ipAddrs`标签并设置为我们`staticippool`IP 池中网段下的IP。 ```bash vim calico_static.yaml ``` ```yaml apiVersion: v1 kind: Pod metadata: name: calico-static-pod labels: app: myapp annotations: cni.projectcalico.org/ipAddrs: "[\"172.16.0.2\"]" spec: containers: - name: static-container image: burlyluo/nettoolbox ``` ```bash kubectl apply -f calico_static.yaml kubectl get pod -o wide ``` ![](https://img.tnblog.net/arcimg/hb/99ba0ac5292d455a8c7bda6d40794a51.png) tn2>这就是为pod使用特定地址。 那要是使用Deployment怎么办? 在`cni.projectcalico.org/ipAddrs`中定义了多少个ip,就可以replicas多少个pod。 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: static-ip spec: selector: matchLabels: app: nginx replicas: 1 # tells deployment to run 1 pods matching the template template: metadata: labels: app: nginx annotations: "cni.projectcalico.org/ipAddrs": "[\"172.16.0.5\"]" spec: containers: - name: nginx image: burlyluo/nettoolbox ``` ## 从一个IP池迁移到另一个 tn2>简单来讲创建一个新的IP Pool,把老的的IP Pool禁用掉,再把Pod一个一个的删除。 这里我就不做多的演示了,自己可以参考文档:https://projectcalico.docs.tigera.io/networking/migrate-pools ## 使用IP范围与旧式防火墙互操作 tn2>简单来讲:与指定Pod特定的IP差不多,都是通过注释的方式进行。 只是这里指定的是IP Pools。 ```bash # ipv4 cni.projectcalico.org/ipv4pools: '["pool-1", "pool-2"]' # ipv6 cni.projectcalico.org/ipv6pools: '["pool-1", "pool-2"]' ``` ## 查看IP地址利用率(地址分配) tn2>打印有关借用IP地址的详细信息。 ```bash calicoctl ipam show --show-borrowed ``` ![](https://img.tnblog.net/arcimg/hb/bd178ab9521e42278272e2fa9bf118ed.png) tn2>打印当前IPAM配置。 ```bash calicoctl ipam show --show-configuration ``` ![](https://img.tnblog.net/arcimg/hb/bbb12830c6ab4e4b9d4c7d0f70692bed.png) tn2>检测ipam的详细信息,以及存在的问题。 ```bash calicoctl ipam check ``` ![](https://img.tnblog.net/arcimg/hb/351a7dab66ca468f9992956eaff875cf.png) tn2>如果你的IP地址有问题了,比如IP Pool替换更新了,你需要将Pod重新Release一下,怎么做? 首先需要Lock一下,告诉其他人先不要分配IP地址。 ```bash calicoctl datastore migrate lock ``` tn2>然后把IPAM的检测以json的方式导出到`report.json`文件中。 ```bash calicoctl ipam check -o report.json cat report.json ``` ![](https://img.tnblog.net/arcimg/hb/405f727d088944b48c9938165a87ecc3.png) tn2>然后我们释放未设置的ip地址。大概会检测20分钟。 ```bash calicoctl ipam release --from-report=report.json ``` tn2>然后我们解锁。 ```bash calicoctl datastore migrate unlock ``` tn2>最后验证一下。 ```bash calicoctl ipam check ```
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
166篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术