Kubernetes(简称 k8s)是一个开源的容器编排系统,由 Google 开发并于 2014 年开源,后捐赠给云原生计算基金会(CNCF)。它用于自动化应用程序的部署、扩展和管理,特别是在容器化环境中,已成为业界容器编排的事实标准。它通过自动化、弹性和自我修复能力,简化了容器化应用的部署和管理。无论是小型创业公司还是大型企业,k8s 都能帮助团队更高效地构建、扩展和维护应用程序,是云原生时代的核心基础设施。
关键特性
一个独立的小型“集装箱”,内部运行一个应用进程(如 Nginx、MySQL)。
就好比货运集装箱,标准化封装,不依赖运输工具。
一个Python Web应用可打包为容器,包含Python解释器、Flask框架和应用代码。
Kubernetes 最小调度、可部署单元,像一个“逻辑主机”,包含:
关键特性
就好比合租公寓(多个租户共享客厅、网络,但有独立卧室)。
应用场景
一台“微型服务器”,上面运行一组需要直接通信的服务(如 Web 服务 + 日志代理)。
为什么需要 Pod?
答案:解决容器间紧密协作问题(例如:Web 容器和日志收集容器需共享日志目录)。
为一组Pod提供稳定的网络访问接口,屏蔽Pod的动态变化(如IP变更、扩容缩容)。
关键特性
关键类型
my-db
实际指向 rds.aws.com
)。就好比一个“前台接待处”,无论后端 Pod 如何变化(扩缩容、重启),访问者只需找这个固定入口。
声明式的Pod控制器,定义Pod的期望状态(如副本数、镜像版本),自动管理Pod的生命周期。
管理无状态应用(如 Web 服务)。
核心能力
kubectl scale
调整Pod副本数,或声明 Pod 副本数(如始终维持 3 个 Nginx Pod)。就好比 自动生产线(按模板复制产品,坏了自动替换)。
管理有状态应用(如 MySQL、Redis)。
特点
mysql-0
, mysql-1
)。mysql-0.mysql-svc.default.svc.cluster.local
)。在每个节点上运行一个 Pod(如日志收集 agent、网络插件)。
运行一次性任务(Job)或定时任务(CronJob)。
Job
创建一个或多个Pod执行一次性任务,任务完成后Pod终止。
CronJob
定时任务,基于Cron表达式周期性执行Job(如每天凌晨备份数据库)。
使用场景
示例场景
为 Pod 提供持久化存储(即使 Pod 重启数据不丢失),解决容器生命周期短暂导致的数据丢失问题。
就好比 网盘一样,数据独立于容器,可挂载到不同容器。
关键特性
支持类型
emptyDir
:临时目录(Pod 删除后消失)。PersistentVolume (PV)
:集群级存储资源(网络存储,如云硬盘、NFS)。PersistentVolumeClaim (PVC)
:用户对存储资源的“申请”(如申请 10Gi 空间)。HostPath
:节点本地存储。示例场景
将集群划分为虚拟子集群(如 dev
/prod
),实现资源隔离。
虚拟集群,用于隔离和划分资源,避免命名冲突,适用于多团队、多环境(开发/测试/生产)的资源隔离。
就好比公司部门(不同部门使用独立资源,避免名称冲突)。
默认命名空间:default
、kube-system
(系统组件)、kube-public
。
默认Namespace
default
:未指定Namespace的资源默认归属。kube-system
:K8s系统组件(如CoreDNS)所在的Namespace。使用场景
dev
Namespace,生产环境使用prod
Namespace。管理外部访问集群内服务的 HTTP/HTTPS 路由(如根据域名分流流量)。
需要配合 Ingress Controller(如 Nginx、Traefik)实现。
核心功能
/api/*
转发到API Service,/web/*
转发到Web Service。就好比公司前台(根据访客需求引导至不同部门)。
假设部署一个 Web 应用:
ClusterIP
服务,为这组 Pod 提供内部访问地址。myapp.com
→ 指向该 Service。在Kubernetes集群中,节点(Nodes)是物理机或虚拟机,它们作为运行容器化应用的工作单元。每个节点都包含一些关键组件,以确保容器化应用能够在该节点上正确运行,并与集群的其他部分通信。
Kubernetes集群通常由两种类型的节点组成:
也称控制平面节点(Control Plane Node)。
通常由多个节点组成以实现高可用(生产环境建议至少 3 个)。
下面罗列主要包含的组件。
Kubernetes API服务器是集群的前端接口,所有外部访问和内部组件之间的通信都要通过它进行。
它是唯一可以直接访问etcd数据库的组件,用于验证并配置API对象的数据。
角色
K8s 的统一入口,所有组件间的通信枢纽。
功能
部署方式
通常部署为负载均衡器后面的多个实例(高可用)。
分布式键值存储,用作保存Kubernetes集群所有状态数据的后台数据库。提供可靠的数据持久化存储机制。
如 Pod、Service 配置等等。
角色
分布式键值存储,存储集群的所有配置数据和状态。
功能
注意事项
需定期备份,建议部署奇数个节点(如 3、5)以保证选举稳定性。
监视新创建且未分配节点的Pod,并根据资源需求、服务质量要求等因素选择最合适的节点为其提供服务。
角色
负责将 Pod 调度到合适的 Worker 节点。
功能
包含多种控制器,这些控制器负责特定的任务,如节点控制器、副本集控制器等,它们监控集群状态,并努力将当前状态向期望状态推进。
运行所有控制器的守护进程,确保集群状态与期望一致。
角色
运行各种控制器,确保集群状态符合期望。
核心控制器
是可选组件服务,根据情况选择,非必须部署。
对接云厂商 API(如 AWS/GCP),实现节点管理、负载均衡等云服务集成。
角色
对接云服务商 API(如 AWS、GCP),管理云资源。
功能
运行容器化应用的节点,由控制平面管理。一个集群可以有数十至数千个工作节点。
工作节点是运行应用的 “执行单元”。
下面罗列主要包含的组件。
每个工作节点上的代理,确保容器在Pod中健康地运行。它定期采集所在节点及节点上容器的状态信息,并上报给API服务器。
负责接收 PodSpec 并启动容器,监控容器状态并上报。
与容器运行时(如 containerd)交互,执行存活/就绪探针。
角色
节点上的代理,负责 Pod 的生命周期管理。
功能
每个节点上的网络代理,维护网络规则以允许跨节点的服务通信。支持TCP、UDP和SCTP连接的转发。
维护节点网络规则,实现 Service 的 负载均衡 和 网络代理。
角色
实现 Service 的网络代理和负载均衡。
功能
实际运行容器的引擎(如 Docker、containerd、CRI-O)。
必须实现 CRI(容器运行时接口)。
运行容器的软件,负责镜像拉取、容器生命周期管理等。
角色
负责容器的创建和运行。
常见实现
cri-dockerd
适配器与 K8s 集成(旧版方案)。角色
实现 Pod 间的网络通信,提供集群网络。
常见插件
角色
为 Pod 提供持久化存储。
常见实现
以下组件通常作为集群插件部署,不属于核心组件但提供重要功能:
CoreDNS
kube-system
命名空间。Ingress Controller
监控与日志组件
容器网络策略(NetworkPolicy)
控制平面内部
控制平面与工作节点
工作节点内部
节点间通信关键路径
通信方向 | 协议/端口 | 用途 |
---|---|---|
Master → Worker | 6443 (API Server) | kubelet/kube-proxy 访问 API Server 获取指令 |
Worker → Master | 2379-2380 (etcd) | 仅控制平面节点间 etcd 集群通信(Worker 不直接访问 etcd) |
Worker ↔ Worker | VXLAN/Calico | Pod 跨节点通信(通过 CNI 插件) |
kubelet ↔ API Server | 10250 (HTTPS) | API Server 主动访问 kubelet 获取日志/执行命令 |
在Kubernetes生态系统中,有多种工具可以帮助用户更高效地部署和管理集群。
kubeadm
是一个用于快速部署Kubernetes集群的工具。它简化了创建一个安全的Kubernetes集群的过程。
官方推荐的集群快速部署工具,适合新手和测试环境。
核心功能
kubeadm init
)kubeadm join
)kubeadm upgrade
)特点
使用场景
示例命令
# 初始化控制平面
kubeadm init --pod-network-cidr=192.168.0.0/16
# 初始化 Master
kubeadm init --apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16
# Worker节点加入集群
kubeadm join <控制平面IP>:6443 --token <令牌> --discovery-token-ca-cert-hash <哈希值>
# 加入 Worker
kubeadm join 192.168.1.100:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
kubectl
是与Kubernetes集群进行交互的命令行工具。它允许用户直接从命令行运行命令来部署应用、检查和管理集群资源以及查看日志。
kubectl
主要用于开发人员或运维人员手动管理Kubernetes集群时使用。通过本地安装kubectl
,用户可以方便地从命令行与远程Kubernetes集群交互。
核心功能
kubectl create deploy
、kubectl delete pod
)。kubectl get nodes
、kubectl describe pod
)。kubectl logs
、kubectl exec
)。kubectl apply -f config.yaml
)。使用场景
可以通过官方文档提供的步骤轻松安装到本地机器上,并通过配置文件连接到你的Kubernetes集群。
常用命令
# 查看集群状态
kubectl get nodes -o wide
# 查看Pod列表
kubectl get pods -o wide
# 部署应用
kubectl apply -f deployment.yaml
# 进入容器调试
kubectl exec -it <pod-name> -- /bin/bash
# 查看日志
kubectl logs -f <pod-name>
# 创建Deployment
kubectl create deployment nginx --image=nginx
# 暴露Service
kubectl expose deployment nginx --port=80 --type=NodePort
插件生态
kubectl-ctx
/kubectl-ns
:快速切换上下文和命名空间kubectl-tree
:可视化资源依赖关系运行在每个节点上的代理组件,直接管理容器。
kubelet
是部署在每个节点(Node)上的主要“节点代理”,它确保容器在Pod中健康地运行。kubelet
会定期采集所在节点及节点上容器的状态信息,并上报给Kubernetes的API服务器。
核心职责
监控分配给节点的Pod
确保容器在Pod中正常运行
向API服务器报告状态更新
响应来自控制平面的命令(例如,根据调度器的决定启动新的容器)
维护容器的生命周期(启动、停止容器等)
监听 API Server 下发的 PodSpec
调用容器运行时(如 containerd)启动容器
定期上报节点状态到控制平面
使用场景
kubelet
运行在集群中的每个节点上,不需要用户直接操作,它是自动安装和配置的一部分。
关键配置
/var/lib/kubelet/config.yaml
:kubelet 配置文件--cgroup-driver=systemd
:需与容器运行时一致主要区别
服务对象:kubelet
服务于Kubernetes集群内部,负责节点级别的容器管理;而kubectl
则是为用户提供了一个界面来管理和操作Kubernetes集群。
部署位置:kubelet
部署在Kubernetes集群的每个节点上,而kubectl
通常安装在用户的本地机器上或CI/CD环境中,用于与集群进行交互。
操作层面:kubelet
关注的是节点级别、容器级别的操作,保证分配给该节点的任务正确执行;kubectl
则允许用户执行集群范围的操作,如部署应用、扩展副本集等。
Helm是Kubernetes的包管理器,它简化了查找、共享和使用Kubernetes应用的过程。通过Helm Charts,可以方便地定义、安装和升级复杂的Kubernetes应用。
Kubernetes 包管理工具(类似 yum/apt),用于简化复杂应用的部署。
核心概念
使用场景
示例命令
# 安装官方仓库的Nginx Chart
helm repo add stable https://charts.helm.sh/stable
helm install my-nginx stable/nginx
# 安装应用
helm install my-mysql bitnami/mysql
# 自定义配置部署
helm install my-mysql stable/mysql -f values.yaml
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 查看已安装应用
helm list
在Kubernetes中,网络插件对于实现容器间的通信至关重要。由于Kubernetes本身并没有强制规定具体的网络实现方式,而是提供了一套CNI(Container Network Interface)规范,允许第三方网络插件来实现具体的网络功能。
为什么需要网络插件?
答:
Kubernetes 要求集群满足以下网络模型:
- Pod 间直接通信:所有 Pod 无需 NAT 即可跨节点互通。
- Service 虚拟 IP:通过 kube-proxy 实现 Service 到 Pod 的负载均衡。
- 网络策略:支持按规则隔离 Pod 间流量(NetworkPolicy)。
网络插件(CNI 插件)负责实现这些需求,主要解决:
- 跨节点 Pod 通信(Overlay/Underlay 网络)
- IP 地址管理(IPAM)
- 网络策略 enforcement
网络插件核心功能
Pod 网络
网络策略(NetworkPolicy)
服务发现与负载均衡
主流网络插件分类
覆盖网络(Overlay Network):通过隧道技术(如 VXLAN)在现有网络上构建虚拟网络。
代表插件:Flannel、Weave Net等
三层网络(BGP-Based):基于路由协议(如 BGP)实现 Pod 网络,无需隧道,性能更高。
代表插件:Calico等
混合方案:结合覆盖网络和三层网络的优势。
代表插件:Cana等
云原生方案:与云服务商深度集成的网络插件。
代表插件:AWS VPC CNI、GKE GKE Networking
高性能方案:专为高性能场景优化的网络插件。
代表插件:Cilium等
网络插件对比
特性 | Flannel | Calico | Canal | Cilium | Weave Net |
---|---|---|---|---|---|
网络模式 | 覆盖 | 三层 | 混合 | eBPF | 覆盖 |
NetworkPolicy 支持 | ❌ | ✅ | ✅ | ✅ | ✅ |
性能 | 低 | 高 | 中 | 极高 | 中 |
部署复杂度 | 低 | 中 | 中 | 高 | 低 |
策略丰富度 | 无 | L3-L4 | L3-L4 | L3-L7 | L3-L4 |
大规模集群支持 | 一般 | 优秀 | 良好 | 优秀 | 一般 |
以下是几款流行的Kubernetes网络插件介绍:
Flannel是由CoreOS开发的一个简单易用的覆盖网络(Overlay Network)解决方案。它通过为每个节点分配一个子网,并在节点间转发封装的数据包来实现跨主机的容器通信。
工作原理
host-local
实现)。特点:轻量级、易部署,支持多种后端(VXLAN、UDP、host-gw)。
不足:缺乏网络策略支持,性能一般,仅支持基本连通性(不支持 NetworkPolicy)。
适用场景:测试环境或对网络性能要求不高的场景。
部署命令
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Calico是一个高性能且可扩展的网络方案,支持三层路由和二层交换。它不仅可以作为纯三层的SDN解决方案,也可以与其他网络技术(如VXLAN)结合使用。
工作原理
特点
组件
高级功能
适用场景:生产环境、需要精细网络策略的场景。
部署命令
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
Cilium是一种基于eBPF技术构建的网络和网络安全解决方案,旨在提供高效的网络连接和高级别的安全防护。它不仅支持传统的IP地址/端口过滤,还支持基于HTTP、gRPC等应用层协议的精细访问控制。
新兴趋势
eBPF 统一网络/安全:Cilium 已成为云原生网络的事实标准。
服务网格集成:Linkerd/Istio 开始依赖 Cilium 作为数据平面。
多集群网络:Submariner(Calico)和 Cilium Cluster Mesh 提供跨集群连通。
核心技术
优势场景
部署命令
# 使用Helm部署
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.13.0
cilium install --version 1.13.0
cilium status
Weave Net是另一个覆盖网络解决方案,它创建了一个虚拟网络,使部署在不同主机上的容器能够像在同一个局域网内一样相互通信。
特点
适用场景:需要加密和简单策略控制的中小型集群。
部署命令
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
Canal实际上是将Flannel和Calico的优势结合起来的一种网络方案。它使用Flannel进行底层网络连接,同时利用Calico强大的网络策略能力来增强安全性。
从 Kubernetes 1.6 版本开始,官方更推荐单独安装 Calico,并根据需要选择是否启用其与 Flannel 的兼容模式或直接使用 Calico 自带的网络后端。因此,现在部署 Canal
通常指的是部署 Calico 并配置它以与 Flannel 兼容的方式工作。
组成:Calico(网络策略) + Flannel(网络连通性)。
特点
适用场景:需要 NetworkPolicy 但希望简化部署的场景。
特性 | Flannel | Calico | Canal | Cilium | Weave Net |
---|---|---|---|---|---|
网络模式 | 覆盖 | 三层 | 混合 | eBPF | 覆盖 |
NetworkPolicy 支持 | ❌ | ✅ | ✅ | ✅ | ✅ |
性能 | 低 | 高 | 中 | 极高 | 中 |
部署复杂度 | 低 | 中 | 中 | 高 | 低 |
策略丰富度 | 无 | L3-L4 | L3-L4 | L3-L7 | L3-L4 |
大规模集群支持 | 一般 | 优秀 | 良好 | 优秀 | 一般 |
完毕。