K8s 集群 IP 地址管理指南(K8s Cluster IP Address Management Guide)

K8s 集群 IP 地址管理指南

概述

你是否在小型初创公司或大型企业工作,并正在为公司评估 Kubernetes?你可能正在考虑运行十几个或更多的 Kubernetes (K8s) 集群。你期望每个集群支持几百个 K8s 节点,每个节点可能有 50 到 100 个 K8s Pod。这是否足以作为你的 IP 地址管理 (IPAM) 策略的一部分?那么K8s 服务 呢?你是否有运行在 K8s 之外的应用程序需要与 K8s 上的应用程序通信?反之亦然?

为了理解 K8s 集群的 IP 地址需求,我们首先深入了解它支持的网络模型及其背后的原因。

网络模型

  1. 所有 Pod 可以在同一集群内相互通信,无需 NAT

  2. 所有 Pod 可以与服务通信,无需 NAT

  3. 不应有 IP 重叠

上述网络模型提供了以下优势:

  1. Pod 可移动性:每个 Pod 都有自己的 IP,该 IP 不与 Pod 运行的节点绑定。这意味着 Pod 可以移动到任何节点,而无需更改其 IP 或网络身份。

  2. 网络效率:由于 POD IP 有独立的、不重叠的 IP 块,Pod 之间可以相互通信,无需复杂的 NAT。

  3. 可重用的 POD IP:Pod 是短暂的。当 Pod 被删除时,其 IP 可以重新分配给另一个 Pod。

每个 K8s 集群所需的 CIDR 块

在了解了网络模型及其优势后,我们来看看 K8s 集群中需要 IP 的所有组件:

  1. K8s 节点

  2. K8s Pod

  3. K8s 服务

  4. 外部 IP

  5. 入口 IP

运行 Pod 的 K8s 节点需要一个 IP,同样,每个运行在节点上的 Pod 也需要自己的 IP。

由于 K8s Pod 是短暂的,它们会被随机分配 IP。K8s 服务用于为 Pod 提供稳定的 IP。K8s 服务 IP 还充当无状态 Pod 的内部负载均衡器。

如果 Pod 位于外部负载均衡器(如 AWS ELB)后面,外部负载均衡器也需要 IP,如上文第 4 点所述。

如果 Pod 位于 Ingress 后面,Ingress 也需要外部 IP 块来暴露这些 HTTP/HTTPS 服务。这些 IP 通常也通过外部负载均衡器(如 AWS ELB)分配。

K8s 集群中 CIDR 块的配置方式

本节假设你熟悉 K8s 集群的组件。我们来看看 K8s 的四个重要部分的配置,了解它们如何使用各种 CIDR:

kube-apiserver \--service-cluster-ip-range=10.96.0.0/12 \        # 服务 CIDR--service-node-port-range=30000-32767 \          # NodePort 范围--allow-privileged=true \--apiserver-count=3 \                            # 用于高可用设置--bind-address=0.0.0.0 \--secure-port=6443 \--feature-gates=RemoveSelfLink=false
kube-controller-manager \--cluster-cidr=10.244.0.0/16 \                   # Pod CIDR--service-cluster-ip-range=10.96.0.0/12 \        # 必须与 apiserver 匹配--node-cidr-mask-size=24 \                       # 每个节点的子网大小--allocate-node-cidrs=true \--cluster-name=kubernetes \--controllers=*,bootstrapsigner,tokencleaner
kubelet \--pod-cidr=10.244.1.0/24 \                      # 节点特定的 Pod CIDR--node-ip=192.168.1.10 \                        # 节点的物理 IP--cluster-dns=10.96.0.10 \                      # kube-dns 服务 IP--cluster-domain=cluster.local \--network-plugin=cni \--cni-conf-dir=/etc/cni/net.d \--cni-bin-dir=/opt/cni/bin
kube-proxy \--cluster-cidr=10.244.0.0/16 \                  # Pod CIDR--proxy-mode=ipvs \                             # 或 iptables--ipvs-min-sync-period=5s \--ipvs-sync-period=30s

你会注意到 K8s 服务 CIDR 在两个地方指定:kube-apiserver 和 kube-controller-manager,作为命令行参数 _— service-cluster-ip-range_,并且两者必须相同。这是用于分配ClusterIP 类型的 K8s 服务的 IP 地址块。

— cluster-cidr 在 kube-controller-manager 和 kube-proxy 中指定。此 CIDR 块用于分配集群中所有 K8s Pod 的 IP 地址。

此外,每个节点的 POD CIDR 作为命令行参数— pod-cidr 传递给 kubelet。kubelet 使用此 IP 地址块为运行在其所在节点上的 Pod 分配 IP。此块必须来自— cluster-cidr 指定的超块。

CNI 和 IPAM

上述讨论假设 IP 地址通过直接配置 K8s 组件来管理。通常,Kubernetes 集群使用 CNI(容器网络接口)模块来实现网络模型。CNI 主要负责:

  • POD IP 分配(接管或覆盖— pod-cidr 和 _— cluster-cidr_)

  • Pod 之间的连接

  • 控制哪些 Pod 可以与哪些其他 Pod 通信的网络策略

CNI 还可以用于与企业现有的 IPAM 系统集成或创建自定义 IP 分配策略。

K8s 集群 IP 地址管理的其他注意事项

我想以一些 IP 地址管理的额外考虑结束本文,这些内容我们之前没有涵盖,但在你扩展 Kubernetes 使用时(无论是在本地还是在云中)至关重要。

  1. 节点本地 IPAM https://www.cni.dev/plugins/current/ipam/host-local/:Kubernetes 现在支持节点本地 IPAM,允许每个节点管理自己的 IP 池。这减少了 API 服务器负载并提高了 Pod 启动时间。这在大型集群中特别有用,因为集中式 IPAM 可能成为瓶颈。

  2. 双栈考虑 https://kubernetes.io/docs/concepts/services-networking/dual-stack/:每个 Pod 可以同时获得 IPv4 和 IPv6 地址。我们需要确保为两种协议提供足够的地址空间。

  3. Pod IP 范围耗尽:这通常被忽视,直到成为问题。我们需要考虑 Pod 的流失率和集群扩展计划。监控 IP 地址利用率很重要。最好设置 IP 池耗尽的警报。

  4. 地址回收:需要为终止的 Pod 进行适当的垃圾回收。一些 CNI 插件有不同的等待期。这对于防止 IP 冲突很重要。

  5. 多集群考虑:我们需要确保集群之间的 Pod 和服务 CIDR 不重叠。这对于集群联邦和跨集群通信很重要。我们还应考虑未来集群合并的场景。此外,我们还没有讨论跨多个集群的网格,这带来了额外的 IP 寻址考虑。

  6. 云提供商集成:不同的云提供商有不同的 IPAM 限制。一些云提供商需要特定的 CIDR 范围,可能需要与云 VPC IPAM 协调。例如,EKS 支持自定义网络,并允许为节点上的 Pod 使用不同的子网。

  7. 安全考虑:IPAM 也可用于网络分段。考虑为不同的安全区域使用不同的 IP 范围。这对于合规性要求很重要。

这并不详尽,但希望我已经涵盖了从扩展公司 Kubernetes 策略和运行基于我过去八年运行生产就绪集群的角度来看的所有 IP 地址管理方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙-点击Notification通知并打开App的具体页面

意图通知 获取router事件中传递参数并跳转 目前点击通知消息打开应用的指定页面,通过为通知添加行为意图的方式。也就是在wants的parameters中设置自定义参数,然后在UIAbility的onNewWant或者onCreate方法中 解析配置的自定义参数信息判断跳转不同页面&a…

go语言实现UTF8与GB2312内码转换

使用Go语言做个UTF-8转GB2312的代码,输入utf-8编码的文本,输出转换后的国标编码的hex内码 package mainimport ("fmt""os""strings""golang.org/x/text/encoding/simplifiedchinese""golang.org/x/text/transform&quo…

使用AKTools本地部署AKShare财经数据接口库

使用AKTools部署AKShare财经数据接口库,AKShare的介绍见:基于 Python 的财经数据接口库:AKShare-CSDN博客 AKTools 是一款用于快速搭建 AKShare HTTP API 的工具,通过 AKTools 可以利用一行命令来启动 HTTP 服务,从而…

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎,用于将字体文件(如 TrueType、OpenType、Type 1 等)转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域,支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…

winform监听全局鼠标事件

如果您希望监听全局鼠标事件,即使在其他应用程序(如浏览器或其他软件)中按下鼠标按钮也能捕捉到这些事件,您需要使用低级别的Windows API钩子。WinForms本身并不直接支持全局事件监听,但通过调用Windows API&#xff0…

如何学习网络安全?有哪些小窍门?

学好网络安全其实没有所谓的捷径,也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣,不然很容易就变成了从入门到放弃了。 其次要能静下心,踏踏实实的打好基础。如果你是零基础,建议从Web安全入手,课程难度相对…

测试工程师的linux 命令学习(持续更新中)

1.ls """1.ls""" ls -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -l等同于 ll第一列共10位,第1位表示文档类型,d表示目录,-表示普通文件,l表示链接文件。…

C++实现设计模式---享元模式 (Flyweight)

享元模式 (Flyweight) 享元模式 是一种结构型设计模式,它通过共享对象来减少内存使用和对象创建的开销。当系统中有大量相似对象时,享元模式可以避免重复创建相同对象,从而节省内存。 意图 通过共享相同对象来减少内存消耗。用于系统中存在…

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

安装指南:LLaMA Factory、AutoGPTQ 和 vllm

安装指南:LLaMA Factory、AutoGPTQ 和 vllm 在本文中,我们将详细介绍如何安装 LLaMA Factory、AutoGPTQ 和 vllm,这些工具在大型语言模型(LLMs)和视觉语言模型(VLMs)的微调和量化中非常有用。我…

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展,虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络,Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展,OVN 提供了对虚拟网络抽象的支持,使得大规模部署和管理…

C#异步和多线程,Thread,Task和async/await关键字--12

目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…

doris:导入概览

Apache Doris 提供了多种导入和集成数据的方法,您可以使用合适的导入方式从各种源将数据导入到数据库中。Apache Doris 提供的数据导入方式可以分为四类: 实时写入:应用程序通过 HTTP 或者 JDBC 实时写入数据到 Doris 表中,适用于…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 9.1 检查点(Checkpoint) 9.1.1 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我…

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者:Amy MiHyun Jang创建日期:2020/07/28最后修改时间:2024/02/12描述:TPU 上的医学图像分类。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…

Axios 封装:处理重复调用与内容覆盖问题

问题描述&背景 下拉选择框,支持搜索,搜索时携带参数调用接口并更新下拉选项下拉选择连续进行多次搜索,先请求但响应时间长的返回值会覆盖后请求但响应时间短的举例: 搜索后先清空选项,再输入内容进行搜索。清空后…

openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

51单片机 DS18B20温度储传感器

DS18B20温度传感器 64-BITROM:作为器件地址,用于总线通信的寻址,是唯一的,不可更改 SCRATCHPAD(暂存器):用于总线的数据交互 EEPROM:用于保存温度触发阈值和配置参数 暂存器 单总线…