我们都知道在物理主机或者虚拟机上一台正常的主机是可以通过后DHCP动态分配IP的但是在kubernetes中不存在DHCP来分配每个Pod的ip地址。在 Kubernetes 中每个 Pod 都需要一个唯一的 IP 地址来与其他 Pod 和服务进行通信。IP 地址管理非常重要因为动态创建 PodPod 是临时性的需要频繁地创建和销毁。每个新的 Pod 都需要从集群的地址空间中获取一个可用的 IP 地址。避免 IP 冲突如果没有适当的 IP 管理工具多个 Pod 可能会被分配相同的 IP 地址从而导致网络冲突和通信故障。高效的地址分配IPAM 系统将 IP 地址按块为单位分配给各个节点从而减少了单个 IP 请求所带来的负担并提升了系统的可扩展性。跨节点通信集群中不同节点上的容器需要可路由的 IP 地址以便能够直接进行通信而无需通过 NAT 层。IPAM 通过合理的子网分配机制帮助解决了这一问题。Calico 的 IPAM 技术通过预先将 IP 块分配给各个节点从而实现高效的 IP 分配。这一机制能够确保节点快速启动同时在整个集群范围内保持正确的 IP 地址管理。使用clab实现实验环境的搭建前提条件完成containerlab的安装 - 采用宿主机安装方式完成kind镜像的下载 - 采用容器安装完成docker的安装清单文件calico-ipam.clab.yamlContainerLab 拓扑结构name:calico-ipam# 生命使用和calico 同样的网桥避免和现有的docker网络有冲突mgmt:network:bridgetopology:nodes:calico-ipam:kind:k8s-kindimage:kindest/node:v1.28.0startup-config:calico-ipam-no-cni.yamlextras:k8s_kind:deploy:wait:0scalico-ipam-no-cni.yamlcalico 无需使用 CNI 的集群配置文件这里的配置是给kind使用的andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$catcalico-ipam-no-cni.yamlapiVersion:kind.x-k8s.io/v1alpha4kind:Clusternetworking:disableDefaultCNI:truepodSubnet:192.168.0.0/16serviceSubnet:10.96.0.0/16nodes:-role:control-plane-role:worker-role:workercalico-cni-config/custom-resources.yaml基于 IPAM 和 IP 池配置的定制型 Calico 安装资源apiVersion:operator.tigera.io/v1kind:Installationmetadata:name:defaultspec:# Configures Calico networking.calicoNetwork:# Note: The ipPools section cannot be modified post-install.ipPools:-blockSize:26cidr:192.168.0.0/16encapsulation:VXLANCrossSubnetnatOutgoing:EnablednodeSelector:all()---apiVersion:operator.tigera.io/v1kind:APIServermetadata:name:defaultspec:{}通过一下命令完成实验环境的部署chmodx deploy.sh ./deploy.shcalico CNI ConfigurationCalico 的部署方式使用了一种自定义的安装资源custom-resources.yaml▸该资源用于定义容器网络的配置。在选择 CIDR 范围时需要注意以下几个关键点默认IP地址池cidr: 192.168.0.0/16可以提供65536个IP地址足够支持大型集群的规模块大小根据需要为每个节点分配了26个块每个块包含了64个IP地址封装机制采用 VXLAN CrossSubnet 技术来实现节点间的通信。NAT 输出功能已启用允许容器实例访问外部网络CIDR 地址选择直接影响了集群的可扩展性和网络策略的有效性。/16 范围可以支持大约 1,024 个节点而/26 范围的地址则适合用于大多数实验室和生产环境。使用deploy.sh脚本能自动化完成以上实验#!/bin/bashset-e# Exit immediately if a command exits with a non-zero status# 如果以前安装过这里先清理echo Destroying existing ContainerLab topology sudocontainerlab destroy-tcalico-ipam.clab.yaml||{echoFailed to destroy existing topology;exit1;}# 按照配置部署集群环境echo Deploying ContainerLab topology sudocontainerlab deploy-tcalico-ipam.clab.yaml||{echoFailed to deploy topology;exit1;}echo Waiting for Kind cluster to be ready (30 seconds) sleep30echo Setting up kubeconfig # Create kubeconfig directory if it doesnt existmkdir-p~/.kube# Export kubeconfig to a specific file to avoid conflictssudokind get kubeconfig--namecalico-ipamcalico-ipam.kubeconfigsudochmod644calico-ipam.kubeconfig# 保证kueclt 指向 kind集群# 导出配置以便通过kubectl命令能访问kind集群# Use the specific kubeconfig file for all kubectl commandsexportKUBECONFIG$(pwd)/calico-ipam.kubeconfigecho Installing calicoctl curl-Lhttps://github.com/projectcalico/calico/releases/download/v3.30.0/calicoctl-linux-amd64-ocalicoctl||{echoFailed to download calicoctl;exit1;}chmodx calicoctlsudomvcalicoctl /usr/local/bin/||{echoFailed to move calicoctl to /usr/local/bin;exit1;}echocalicoctl version:$(calicoctl version)||{echoWarning: calicoctl may not be installed correctly;}echo Waiting for Kubernetes API to be available untilkubectl get nodes/dev/null;doechoWaiting for Kubernetes API...sleep5done# 部署calico环境echo Installing Calico 3.30.0 kubectl create-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.30.0/manifests/operator-crds.yaml||{echoFailed to install Calico CRDs;exit1;}kubectl create-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.30.0/manifests/tigera-operator.yaml||{echoFailed to install Tigera operator;exit1;}# 使用calico 自定义资源进行配置echo Applying custom Calico resources kubectl apply-fcalico-cni-config/custom-resources.yaml||{echoFailed to apply custom resources;exit1;}echo Waiting for TigeraStatus to be ready echoInitial check, expect resources to be unavailable...kubectl get tigerastatusechoWaiting for TigeraStatus to become available (may take several minutes)...whiletrue;do# More precise check using conditionsAPI_AVAILABLE$(kubectl get tigerastatus apiserver-ojsonpath{.status.conditions[?(.typeAvailable)].status}2/dev/null||echoFalse)CALICO_AVAILABLE$(kubectl get tigerastatus calico-ojsonpath{.status.conditions[?(.typeAvailable)].status}2/dev/null||echoFalse)if[[$API_AVAILABLETrue$CALICO_AVAILABLETrue]];thenechoCalico API server and core components are ready!breakfiechoStill waiting for Calico components to be ready...sleep15doneecho TigeraStatus final check kubectl get tigerastatusechoKubernetes nodes:kubectl get nodes-owideechoechoTo use this cluster with kubectl, run:echoexport KUBECONFIG$(pwd)/calico-ipam.kubeconfig%环境检查检查ContainerLab的topo结构andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ containerlab inspect-tcalico-ipam.clab.yaml14:10:38 INFO Parsingchecking topologyfilecalico-ipam.clab.yaml ╭───────────────────────────┬──────────────────────┬─────────┬───────────────────────╮ │ Name │ Kind/Image │ State │ IPv4/6 Address │ ├───────────────────────────┼──────────────────────┼─────────┼───────────────────────┤ │ calico-ipam-control-plane │ k8s-kind │ running │192.168.48.3 │ │ │ kindest/node:v1.28.0 │ │ fc00:f853:ccd:e793::3 │ ├───────────────────────────┼──────────────────────┼─────────┼───────────────────────┤ │ calico-ipam-worker │ k8s-kind │ running │192.168.48.2 │ │ │ kindest/node:v1.28.0 │ │ fc00:f853:ccd:e793::2 │ ├───────────────────────────┼──────────────────────┼─────────┼───────────────────────┤ │ calico-ipam-worker2 │ k8s-kind │ running │192.168.48.4 │ │ │ kindest/node:v1.28.0 │ │ fc00:f853:ccd:e793::4 │ ╰───────────────────────────┴──────────────────────┴─────────┴───────────────────────╯检查calico的安装状态andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ kubectl get tigerastatus NAME AVAILABLE PROGRESSING DEGRADED SINCE apiserver True False False 124m calico True False False 124m ippools True False False 158m检查节点状态andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ kubectl get nodes NAME STATUS ROLES AGE VERSION calico-ipam-control-plane Ready control-plane 166m v1.28.0 calico-ipam-worker Readynone166m v1.28.0 calico-ipam-worker2 Readynone166m v1.28.0ipam的整体状态andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ calicoctl ipam show ---------------------------------------------------------------|GROUPING|CIDR|IPS TOTAL|IPS IN USE|IPS FREE|---------------------------------------------------------------|IP Pool|192.168.0.0/16|65536|12(0%)|65524(100%)|---------------------------------------------------------------CIDR整个子网网络的范围192.168.0.0/16总 IP 数该池中可用的 IP 地址总数65,536 个正在使用的 IP 地址当前已将 IP 地址分配给了相应的容器。免费 IP 地址可供新节点分配使用的 IP 地址阻塞关联列表andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ kubectl get blockaffinities NAME CREATED AT calico-ipam-control-plane-192-168-18-64-262026-09-23T04:00:09Z calico-ipam-worker-192-168-131-128-262026-09-23T04:03:36Z calico-ipam-worker2-192-168-112-128-262026-09-23T04:06:00ZBlockAffinity 资源代表了分配给节点的 IPAM 块分配信息每个条目都显示了哪个 IP 地址范围被分配给了哪个节点命名规范是使用calico-ipam-block-cidr-with-dashes-prefix-length来表示Calico 根据需求将/26 的块每个块包含 64 个 IP 地址分配给各个节点详细区块关联性数据andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ kubectl get blockaffinities-oyaml apiVersion: v1 items: - apiVersion: projectcalico.org/v3 kind: BlockAffinity metadata: creationTimestamp:2026-09-23T04:00:09Zname: calico-ipam-control-plane-192-168-18-64-26 resourceVersion:4698uid: a4c00304-a475-4212-a05d-6f390e886ed5 spec:# 分配给某个节点的特定 IP 地址范围例如192.168.0.64/26cidr:192.168.18.64/26# 拥有该 IP 地址的 Kubernetes 节点node: calico-ipam-control-plane# confirmed 这个区块正在被积极分配并投入使用中# pending 赋值操作正在进行中state: confirmed - apiVersion: projectcalico.org/v3 kind: BlockAffinity metadata: creationTimestamp:2026-09-23T04:03:36Zname: calico-ipam-worker-192-168-131-128-26 resourceVersion:5163uid: e5227720-b462-4482-97b9-c016e1dc1d5e spec: cidr:192.168.131.128/26 node: calico-ipam-worker state: confirmed - apiVersion: projectcalico.org/v3 kind: BlockAffinity metadata: creationTimestamp:2026-09-23T04:06:00Zname: calico-ipam-worker2-192-168-112-128-26 resourceVersion:5474uid: 35c56f39-4eff-4b2e-b825-02e92bb24077 spec: cidr:192.168.112.128/26 node: calico-ipam-worker2 state: confirmed kind: List metadata: resourceVersion:Formatted Block Affinitiesandrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$ kubectl get blockaffinities-ojsonpath{range .items[*]}{.metadata.name}{\t}{.spec.node}{\t}{.spec.cidr}{\n}{end}calico-ipam-control-plane-192-168-18-64-26 calico-ipam-control-plane192.168.18.64/26 calico-ipam-worker-192-168-131-128-26 calico-ipam-worker192.168.131.128/26 calico-ipam-worker2-192-168-112-128-26 calico-ipam-worker2192.168.112.128/26总结IP 地址池较大的 CIDR 范围如 192.168.0.0/16用于定义整体地址空间IP 块从 IP 池中划分出较小的子网如/26 的块并将其分配给各个节点。块关联IP 块与节点之间的分配关系IPAM当创建 Pod 时Calico 会自动管理分配给 Pod 的 IP 地址分配使其位于指定的 IP 块内。Troubleshooting检查这些节点是否被分配了足够的IP地址块请确认calico相关的组件在正常运行kubectl get pods -n calico-system查看calico node的日志kubectl logs -n calico-system -l k8s-appcalico-node清理环境andrewandrew ~/k8-networking-calico-containerlab/containerlab/01-calico-ipam(master*?)$catdestroy.sh#!/bin/bash# Lab-specific cleanup script# This script removes only resources created by this specific labset-euopipefail# Colors for outputGREEN\033[0;32mYELLOW\033[1;33mNC\033[0m# No Color# Get the lab directory nameLAB_DIR$(basename$(pwd))# Detect topology name from .clab.yaml file# Try common names first, then any .clab.yaml fileTOPOLOGY_FILEif[-ftopology.clab.yaml];thenTOPOLOGY_FILEtopology.clab.yamlelseTOPOLOGY_FILE$(find.-maxdepth1-name*.clab.yaml-typef|head-1)fiif[-z$TOPOLOGY_FILE];thenechoError: No .clab.yaml file found in current directoryexit1fiTOPOLOGY_NAME$(grep^name:$TOPOLOGY_FILE|head-1|awk{print $2}|tr-d|tr-d)if[-z$TOPOLOGY_NAME];thenechoError: Could not detect topology name from$TOPOLOGY_FILEexit1fi# Detect Kind cluster name from deploy.shKIND_CLUSTER$(grepkind get kubeconfig --namedeploy.sh2/dev/null|head-1|grep-oname[^ ]*|cut-d-f2|tr-d|tr-d ||echo)if[-z$KIND_CLUSTER];then# Try to get from topology file (k8s-kind node name)KIND_CLUSTER$(grep-A5kind: k8s-kind$TOPOLOGY_FILE|grep-E^\s[a-zA-Z0-9-]:|head-1|awk-F:{print $1}|tr-d ||echo)fi# Detect kubeconfig filename from deploy.shKUBECONFIG_FILE$(grep\.kubeconfigdeploy.sh2/dev/null|head-1|grep-o[^ ]*\.kubeconfig|head-1||echo)if[-z$KUBECONFIG_FILE][-n$KIND_CLUSTER];thenKUBECONFIG_FILE${KIND_CLUSTER}.kubeconfigfiecho-e${YELLOW}${NC}echo-e${YELLOW}Cleaning up lab:$LAB_DIR${NC}echo-e${YELLOW}${NC}echoechoDetected resources:echo Topology name:$TOPOLOGY_NAMEecho Kind cluster:${KIND_CLUSTER:-N/A}echo Kubeconfig file:${KUBECONFIG_FILE:-N/A}echoread-pContinue with cleanup? (yes/no): -rechoif[[!$REPLY~^[Yy][Ee][Ss]$]];thenechoCleanup cancelled.exit0fi# Step 1: Destroy ContainerLab topologyecho-e${GREEN}[1/5] Destroying ContainerLab topology:$TOPOLOGY_NAME${NC}ifcommand-vcontainerlab/dev/null;thensudocontainerlab destroy-t$TOPOLOGY_FILE2/dev/null||echo Topology may not exist or already destroyedelseecho containerlab command not found, skippingfi# Step 2: Delete Kind clusterif[-n$KIND_CLUSTER];thenecho-e${GREEN}[2/5] Deleting Kind cluster:$KIND_CLUSTER${NC}ifcommand-vkind/dev/null;thenkind delete cluster--name$KIND_CLUSTER2/dev/null||echo Cluster may not exist or already deletedelseecho kind command not found, skippingfielseecho-e${GREEN}[2/5] No Kind cluster detected, skipping${NC}fi# Step 3: Remove lab-specific containersecho-e${GREEN}[3/5] Removing lab-specific containers...${NC}CONTAINERS$(dockerps-a--format{{.Names}}2/dev/null|grep-Eclab-${TOPOLOGY_NAME}-|${KIND_CLUSTER}-||true)if[-n$CONTAINERS];thenecho$CONTAINERS|whileread-rcontainer;doif[-n$container];thenecho Removing container:$containerdockerrm-f$container2/dev/null||truefidoneelseecho No lab-specific containers foundfi# Step 4: Remove lab-specific networksecho-e${GREEN}[4/5] Removing lab-specific networks...${NC}NETWORKS$(dockernetworkls--format{{.Name}}2/dev/null|grep-Eclab-${TOPOLOGY_NAME}||true)if[-n$NETWORKS];thenecho$NETWORKS|whileread-rnetwork;doif[-n$network];thenecho Removing network:$networkdockernetworkrm$network2/dev/null||truefidoneelseecho No lab-specific networks foundfi# Step 5: Clean up Kubernetes resources and kubeconfigif[-n$KUBECONFIG_FILE][-f$KUBECONFIG_FILE];thenecho-e${GREEN}[5/5] Cleaning up Kubernetes resources...${NC}exportKUBECONFIG$(pwd)/$KUBECONFIG_FILEifcommand-vkubectl/dev/nullkubectl cluster-info/dev/null21;then# Force delete stuck terminating podskubectl get pods --all-namespaces --field-selectorstatus.phase!Running,status.phase!Succeeded-ojson2/dev/null|\jq-r.items[] | select(.metadata.deletionTimestamp!null) | \(.metadata.namespace) \(.metadata.name)2/dev/null|\whileread-rnamespace name;doif[-n$namespace][-n$name];thenecho Force deleting stuck pod:$namespace/$namekubectl delete pod$name-n$namespace--force--grace-period02/dev/null||truefidone||true# Delete lab-related namespaces (excluding system namespaces)kubectl get namespaces-ojsonpath{range .items[*]}{.metadata.name}{\n}{end}2/dev/null|\grep-vE^(default|kube-system|kube-public|kube-node-lease|local-path-storage)$|\whileread-rnamespace;doif[-n$namespace];thenecho Deleting namespace:$namespacekubectl delete namespace$namespace--timeout30s2/dev/null||truefidone||truefiunsetKUBECONFIG# Remove kubeconfig fileecho Removing kubeconfig file:$KUBECONFIG_FILErm-f$KUBECONFIG_FILEelseecho-e${GREEN}[5/5] No kubeconfig file found, skipping${NC}fiechoecho-e${GREEN}${NC}echo-e${GREEN}Cleanup Complete!${NC}echo-e${GREEN}${NC}echo
企业数字化 ERP 产品动态
相关推荐
Unity移动端帧率保卫战:从硬件差异到性能优化的完整指南 作为一个常年蹲在Profiler前面掉头发的Unity开发者,我每次在编辑器里跑得飞起的Demo,一打包到手机上就变成幻灯片,这种“同码不同命”的落差感太熟悉了。很多刚转移动端的朋友都会问同一个问题:明明逻辑一模一样、资源一模一样&am… · 2026/9/24 21:27:35
kernfs_create_root 函数 kernfs_create_root
创建并初始化kernfs_root结构体返回新创建并初始化的kernfs_root结构体(如 sysfs_root) · 2026/9/24 21:27:29
ChatGPT for Word免费版能用吗?安装方法、额度消耗和6个限制一次说清 ChatGPT已经可以直接在Microsoft Word中使用,而且Free免费版也能安装。本文根据OpenAI最新官方说明,讲清安装入口、适用套餐、额度如何计算,以及当前必须注意的6个限制:它只能直接处理正在打开的文档,无法读取其他本地… · 2026/9/24 21:27:22
Vibe Coding与LangGraph:AI原生开发的双轨范式 1. 什么是“Vibe Coding”?它真在改变程序员的日常吗? “Vibe Coding”这个词最近半年在技术社区里像野火一样烧起来,不是因为某个新框架发布了v1.0,而是因为它精准戳中了大量开发者在LLM时代的真实工作状态——那种靠直觉、靠上下… · 2026/9/24 22:04:45
多微网结构设计的二进制矩阵优化与进化算法实现 最近在推进一个多微网网络结构设计的项目,时间紧、规模大,核心卡在一个看上去不太起眼的问题上:几十个微网节点之间,到底哪些该建联络线,哪些开关合上、哪些断开,才能让总成本最低、供电可靠性还过得去。这… · 2026/9/24 22:04:45
JMeter组件全解析:从线程组到监听器,理清作用域与常用搭配 这阵子手头压测任务告一段落,帮几个项目搭完JMeter压测环境,踩了不少坑,也把组件之间的逻辑重新捋了一遍。决定写个系列,第一篇先把JMeter的组件家底盘清楚。性能测试工具里JMeter可能是国内用得最广的了,免费、开源、… · 2026/9/24 22:04:45
EDI连接困局与中间库架构:制造出海企业B2B集成的务实解法 出海做制造业,订单不少,麻烦更多。尤其跟海外大客户做B2B业务,几乎绕不开电子数据交换(EDI,Electronic Data Interchange)。你可能听过这个缩写,知道它是供应链上下游之间,用标准化电… · 2026/9/24 22:04:45
AI智能工作台WorkBuddy实战:从订单抓取到流程编排的自动化指南 最近几个月,我在好几个技术社区和效率工具的群里潜水,WorkBuddy 是被提到最频繁的工具之一。大家聊的很少是“这软件怎么装”,更多是“我用它做了什么”——有人拿它自动对账跨境店铺的订单,有人拿它定闹钟式地逛平台签到… · 2026/9/24 22:04:45
WorkBuddy 实战指南:从自动签到到跨境电商订单巡检与内容采集 最近后台和社群里被问得最多的一个问题就是:大家都在用 WorkBuddy 做什么?说实话,这类问题单靠官方文档很难回答清楚,因为 WorkBuddy 本身是一款偏"个人工作流编排"的 AI 自动化工具,它的用法几乎取决于你想… · 2026/9/24 22:04:38
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44