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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

【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 源 简介 设置 本教程将介…

openssl s_server源码剥离

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

51单片机 DS18B20温度储传感器

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

[操作系统] 深入理解操作系统的概念及定位

概念 任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。 其核心功能如图片所示,包括: 内核 (Kernel): 内核是操作系统的核心部分,被认为是狭义上的操作系统,直接与硬件打交道。负责进程管理、内…

Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

nginx 配置代理,根据 不同的请求头进行转发至不同的代理

解决场景:下载发票的版式文件,第三方返回的是url链接地址,但是服务是部署在内网环境,无法访问互联网进行下载。此时需要进行走反向代理出去,如果按照已有套路,就是根据不同的访问前缀,跳转不同的…

docker在不删除容器的情况下修改端口映射

注意:必须先停止docker服务!!!! 1) 停止容器 2) 停止docker服务(systemctl stop docker) 3) 修改这个容器的hostconfig.json和config.v2.json文件中的端口 先查看容器id docker inspect jenkins 进入该目录 hostcon…

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…

专题 - STM32

基础 基础知识 STM所有产品线&#xff08;列举型号&#xff09;&#xff1a; STM产品的3内核架构&#xff08;列举ARM芯片架构&#xff09;&#xff1a; STM32的3开发方式&#xff1a; STM32的5开发工具和套件&#xff1a; 若要在电脑上直接硬件级调试STM32设备&#xff0c;则…

-bash: /java: cannot execute binary file

在linux安装jdk报错 -bash: /java: cannot execute binary file 原因是jdk安装包和linux的不一致 程序员的面试宝典&#xff0c;一个免费的刷题平台

【MySQL】使用C语言链接

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;MySQL 目录 一&#xff1a;&#x1f525; MySQL connect &#x1f98b; Connector / C 使用&#x1f98b; mysql 接口介绍&#x1f98b; 完整代码样例 二&#xff1a;&#x1f525; 共勉 一&#…

平滑算法 效果比较

目录 高斯平滑 效果对比 移动平均效果比较: 高斯平滑 效果对比 右边两个参数是1.5 2 代码: smooth_demo.py import numpy as np import cv2 from scipy.ndimage import gaussian_filter1ddef gaussian_smooth_array(arr, sigma):smoothed_arr = gaussian_filter1d(arr, s…

P3数据结构、数据类型、数字编码、字符编码:保姆级图文详解

文章目录 前言1、数据结构分类1.1、逻辑结构&#xff1a;线性与非线性1.2、物理结构&#xff1a;连续与分散1.3、数据结构的实现方式1.4、数据结构的选择依据 2、基本数据类型2.1、定义与分类2.2、存储形式 3、数字编码3.1、原码、反码与补码3.2、浮点数编码3.3、整数与浮点数区…

解密AIGC三大核心算法:GAN、Transformer、Diffusion Models原理与应用

在当今数字化时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。从创意无限的文本生成&#xff0c;到栩栩如生的图像创作&#xff0c;再到动听的音乐旋律&#xff0c;AIGC的魔力无处不在。而这一切的背后&#…