1.初级Kubernetes技术如何学习?
2.flannel原理之subnet
3.深入理解kubernetes(k8s)网络原理之五-flannel原理
4.二十分钟了解K8S网络模型原理
初级Kubernetes技术如何学习?
一、初级
1. 了解Kubernetes 基础架构与核心组件功能
2. 了解Docker基本概念和用法
3. 理解Docker与Kubernetes的基本关系
4. 能够安装、部署与配置 Kubernetes 集群
5. 熟练使用 kubectl 命令操作各种 Kubernetes 资源对象,了解基本概念和使用方法
6. 能够在 Kubernetes 上部署、运行、管理工作负载并了解其调度算法
7. 能够使用 Service、出库 源码Ingress 等访问工作负载
8. 深入理解Pod相关的配置及使用
9. 了解Kubernetes生态相关工具及其作用
二、中级
1. 理解Kubernetes的资源管理,资源分配、优先级、QoS等
2. 能够使用 Flannel、Calico、Macvlan 等常用 CNI 插件配置集群网络
3. 能够排查 Kubernetes 集群系统组件、网络、日志、监控告警与存储的故障
4. 能够使用 EFK 搭建容器日志系统
5. 能够使用 Prometheus、AlertManager 等搭建容器监控告警系统
6. 能够配置应用使用持久性存储并了解 Ceph、NFS、GlusterFS 等常见存储工作原理
7. 应用生命周期管理
8. 理解Kubernetes容器调度的基本流程和使用方法
9. Kubernetes集群日常维护
. 理解并使用Kubernetes的用户认证及授权体系(RBAC)
. 理解弹性伸缩(HPA)的基本原理
三、高级
1. 理解Kubernets核心组件的工作原理,并能够进行问题定位及提供解决方案
2. 掌握Kubernetes的qqcrm源码admission 控制器,audit,镜像gc,Pod驱赶行为等相关工作原理
3. 可以扩展和定制Kubernetes调度器
4. 能够用 Operator/CRD 对 Kubernetes 作定制化开发
5. 理解 Kubernetes 多可用区/多集群管理模式
6. 灵活掌握Kubernetes的扩展机制,可以按需定制,包括CNI、CSI、Ingress、自定义控制器等扩展定制
7. 可以解决日志、监控等核心组件的问题定位以及进行性能调优
四、专家
1. 能够对 Kubernetes 集群、操作系统、镜像、应用做安全加固
2. 能够排查 Linux 内核、Docker 容器运行时故障
3. 能够基于 Kubernetes、Jenkins等工具构建云原生DevOps方案
4. 理解Kubernetes生态主要工具的作用及优缺点,可以在不同场景下灵活运用相关工具并确定最 佳实施方案
5. 具备对大规模集群支持的相关经验,包括架构设计、性能调优等稳定性保障
6. 理解Kubernetes社区运作模式,能够为社区提供PR
7. 理解Kubernetes各组件源代码,并能排查、overlay源码分析相关问题
作为国内领 先的全栈云原生技术服务提供商,时速云特别推出了Kubernetes培训课程,对于刚接触Kubernetes技术、企业计划使用容器及Kubernetes集群、以及计划考取CKA证书的人群会是一个不错的选择。
flannel原理之subnet
flannel包含subnet和backend两个关键模块,其中subnet模块负责子网的管理,包括子网的申请与监控。在初始化时,subnet模块会尝试从etcd中获取一个未被使用的子网。当检测到其他子网的加入或移除,会向backend模块发送消息,后者据此调整相应的路由。
本文旨在详细解析subnet模块的工作原理与代码结构。所有讨论基于flannel v0..0版本的源代码,我个人更倾向于使用老版本,主要原因是代码相对简洁,核心功能变化不大。
subnet管理主要通过Manager接口实现,任何实现此接口的jb源码管理组件都可视为subnet manager。目前,subnet管理主要包括基于etcd和基于k8s的实现,如有需要,如使用consul,可自定义接口实现。
与subnet相关的代码位于flannel/subnet目录下,包含etcdv2和kube两个目录。etcdv2是接口实现的核心部分。
Manager接口定义了关键方法,包括获取网络配置、子网租赁以及监控子网状态。
在etcdv2实现中,subnet manager使用两个关键文件:registry.go和local_manager.go。registry.go负责etcd请求的封装,为local_manager提供交互细节。local_manager实现接口方法,如从etcd获取网络配置、子网租赁以及监控子网状态。
子网租赁过程复杂但巧妙。flannel采用策略从subnetMin到subnetMax之间随机选择个子网,suspense源码最终选中一个,将其写入etcd的prefix/subnets/prefix/subnets/ip,用点分十进制替换为连字符表示。与DHCP不同,flannel没有DHCP服务器,而是各个flanneld节点协同完成子网申请,处理冲突和重试。
子网状态监控由backend模块执行,通过监听etcd的事件,后者的操作逻辑在后续文章中会进行深入探讨。
registry.go内部封装了与etcd交互的逻辑,对外提供接口供localManager使用。从registry角度看,etcd有两部分目录:$prefix/config存储网络配置,$prefix/subnets存储子网信息。registry中的*Subnet相关函数对这两个目录进行增删改查以及事件监听。
撰写源码分析文章的体验揭示了从代码到实现思路的清晰表达。flannel的golang代码风格倾向于接口先行,先定义接口再具体实现,体现自顶向下的设计、自底向上的实现思维,这种风格显著提高了代码的可扩展性,便于添加新模块而无需修改现有backend模块。
深入理解kubernetes(k8s)网络原理之五-flannel原理
flannel在Kubernetes(k8s)网络架构中扮演着关键角色,其提供多种网络模式,其中最为广泛应用的是VXLAN模式。本文旨在深入探讨VXLAN模式下flannel的运作原理,同时对UDP模式进行简要介绍。
VXLAN模式下的flannel依赖于VXLAN协议,实现跨主机Pod间的通信。这种模式下,flannel的组件工作流程涉及多个关键步骤。首先,flannel-cni文件作为CNI规范下的二进制文件,负责生成配置文件并调用其它CNI插件(如bridge和host-local),从而实现主机到主机的网络互通。flannel-cni文件并非flannel项目源码,而是位于CNI的plugins中。
在flannel-cni工作流程中,kubelet在创建Pod时,会启动一个pause容器,并获取网络命名空间。随后,它调用配置文件指定的CNI插件(即flannel),以加载相关参数。flannel读取从/subnet.env文件获取的节点子网信息,生成符合CNI标准的配置文件。接着,flannel利用此配置文件调用bridge插件,完成Pod到主机、同主机Pod间的数据通信。
kube-flannel作为Kubernetes的daemonset运行,主要负责跨节点Pod通信的编织工作。它完成的主要任务包括为每个节点创建VXLAN设备,并更新主机路由。当节点添加或移除时,kube-flannel会相应地调整网络配置。在VXLAN模式下,每个节点上的kube-flannel会与flanneld守护进程进行通信,以同步路由信息。
在UDP模式下,每个节点运行flanneld守护进程,参与数据包转发。flanneld通过Unix域套接字与本地flanneld通信,而非通过fdb表和邻居表同步路由信息。当节点新增时,kube-flannel会在节点间建立路由条目,并调整网络配置以确保通信的连续性。
flannel在0.9.0版本前,使用不同策略处理VXLAN封包过程中可能缺少的ARP记录和fdb记录。从0.9.0版本开始,flannel不再监听netlink消息,优化了内核态与用户态的交互,从而提升性能。
通过理解flannel的运行机制,可以发现它在VXLAN模式下实现了高效的跨节点Pod通信。flannel挂载情况不影响现有Pod的通信,但新节点或新Pod的加入需flannel参与网络配置。本文最后提示读者,了解flannel原理后,可尝试自行开发CNI插件。
二十分钟了解K8S网络模型原理
掌握K8S网络模型无需神秘,只需分钟,本文将带你轻松理解。首先,让我们预习一些基础网络知识:Linux网络命名空间:虚拟化网络栈,如同登录Linux服务器时的默认Host网络栈。
网桥设备:内核中的虚拟端口,用于转发网络数据。
Veth Pair:一对虚拟网卡,常用于连接不同网络命名空间。
VXLAN:扩展局域网,将L2数据包封装到UDP报文中,用于跨主机通信。
BGP:边界网关协议,实现自治系统间的路由可达性。
理解了这些,我们转向单机容器网络模型,这是Docker的基本架构。然后,我们进入K8S网络模型的探索,包括Flannel和Calico两种常见模型:Flannel:两种实现(UDP和VXLAN),分别涉及TUN设备或VXLAN隧道,以及Host-gw的三层解决方案。
Calico:非IPIP模式利用BGP维护路由,无网桥的直接路由规则;IPIP模式通过IP隧道解决跨子网通信问题。
最后,CNI网络插件是K8S的核心组件,负责在Pod创建时设置网络环境,如网络命名空间的配置和路由规则的设定。 通过本文,你将对K8S网络模型有深入理解,进一步实践将使理论更加扎实。详细教程和源代码可以参考相关资源。现在,你已经准备好了深入研究K8S网络的旅程。