K8S 介绍及架构
K8S 介绍及架构
简介
Kubernetes(简称 K8s,因为首字母 K 和尾字母 s 之间有 8 个字母)是 Google 开源的容器集群管理系统,其设计灵感来源于 Google 内部运行了十几年的 Borg 系统。Kubernetes 在 Docker 等容器技术的基础上,为容器化的应用提供了部署运行、资源调度、服务发现和动态伸缩、高可用等一系列完整功能,极大地提高了大规模容器集群管理的便捷性。目前 Kubernetes 已经成为容器编排领域的事实标准,被全球各大企业和云厂商广泛采用。
特点
优点
缺点
一、Kubernetes 整体架构
Kubernetes 采用 Master-Node 架构,Master 负责集群管理和调度,Node 负责运行容器应用。
| 架构层 | 组件 | 职责 |
|---|---|---|
| 控制面(Master) | API Server、Scheduler、Controller Manager、etcd | 集群管理和调度 |
| 工作节点(Node) | kubelet、kube-proxy、Container Runtime | 运行容器应用 |
| 网络层 | CNI 插件(Flannel、Calico 等) | Pod 网络通信 |
| 存储层 | CSI 插件 | 持久化存储 |
二、Master 节点组件详解
API Server
API Server 是 Kubernetes 系统的入口,封装了核心对象的增删改查操作,以 RESTful API 接口方式提供给外部客户和内部组件调用。它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给 API Server 处理后再提交给 etcd。kubectl 命令行工具直接与 API Server 交互。
核心功能:
# 查看 API Server 版本
kubectl version --short
# 查看 API 资源列表
kubectl api-resources
# 查看 API 版本
kubectl api-versions
# 直接访问 API Server(通过 proxy)
kubectl proxy --port=8001
# 然后访问 http://localhost:8001/api/v1/namespacesScheduler
Scheduler 负责为新创建的 Pod 选择合适的 Node 运行。它收集和分析当前集群中所有 Node 节点的资源(内存、CPU)负载情况,然后依此分发新建的 Pod 到可用的节点。
调度过程分为两个阶段:
# 查看调度器日志
kubectl logs -n kube-system kube-scheduler-$(hostname)
# 查看 Pod 被调度到哪个节点
kubectl get pod -o wide
# 查看调度失败原因
kubectl describe pod <pod-name> | grep -A 10 EventsController Manager
Controller Manager 是各种控制器的集合,负责执行集群的各种控制循环。每个 Controller 通过 API Server 监控集群状态,并将实际状态调整为期望状态。
| 控制器 | 职责 |
|---|---|
| Replication Controller | 管理 Pod 副本数量,保证副本数与期望一致 |
| Node Controller | 监控 Node 健康状态,标记失效节点 |
| Namespace Controller | 清理无效的 Namespace 及其下的资源 |
| Service Controller | 管理服务负载均衡和代理 |
| Endpoints Controller | 关联 Service 和 Pod,维护 Endpoints |
| Service Account Controller | 为每个 Namespace 创建默认 Service Account |
| Persistent Volume Controller | 管理 PV 和 PVC 的绑定与回收 |
| Daemon Set Controller | 确保指定 Node 上运行 Daemon Pod |
| Deployment Controller | 管理 Deployment 的滚动更新 |
| Job Controller | 管理一次性任务 Pod |
| Pod Autoscaler Controller | 根据监控数据自动伸缩 Pod 副本数 |
三、Node 节点组件详解
kubelet
kubelet 是每个 Node 上的核心代理,负责管理容器的生命周期。它从 API Server 接收 Pod 的创建请求,启动和停止容器,监控容器运行状态并汇报给 API Server。
核心功能:
# 查看 kubelet 版本
kubelet --version
# 查看 kubelet 状态
systemctl status kubelet
# 查看 kubelet 配置
cat /var/lib/kubelet/config.yaml
# 查看 kubelet 日志
journalctl -u kubelet -fkube-proxy
kube-proxy 负责为 Service 创建代理服务,实现 Service 到 Pod 的请求路由和转发。它在每个 Node 上运行,维护网络规则,实现 Kubernetes 层级的虚拟转发网络。
核心功能:
kube-proxy 支持三种代理模式:
| 模式 | 说明 | 性能 |
|---|---|---|
| iptables | 使用 iptables 规则实现转发(默认) | 较好 |
| IPVS | 使用 IPVS(IP Virtual Server)实现转发 | 最好,适合大规模集群 |
| userspace | 最早的实现方式,通过用户空间代理 | 最差,已弃用 |
# 查看 kube-proxy 模式
kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode
# 查看 iptables 规则
iptables -t nat -L KUBE-SERVICES -n
# 切换到 IPVS 模式
kubectl edit configmap kube-proxy -n kube-system
# 修改 mode: "ipvs"
kubectl rollout restart daemonset kube-proxy -n kube-systemContainer Runtime
Node 上需要运行容器运行时(Container Runtime),负责拉取镜像、创建和运行容器。Kubernetes 支持多种容器运行时。
| 运行时 | 说明 |
|---|---|
| Docker | 最广泛使用的容器运行时(通过 dockershim 适配) |
| containerd | Docker 的核心运行时,K8s 1.24+ 默认推荐 |
| CRI-O | 专为 Kubernetes 设计的轻量级运行时 |
| gVisor | Google 开源的安全容器运行时 |
四、etcd - 分布式存储
etcd 是一个高可用的分布式键值对存储系统,用于保存 Kubernetes 集群的所有状态数据。etcd 的数据一致性和可靠性直接关系到整个集群的稳定性。
核心特性:
| 参数 | 推荐配置 |
|---|---|
| 部署模式 | 奇数节点集群(3、5 或 7 个节点) |
| 磁盘 | SSD,低延迟 |
| 内存 | 至少 8GB |
| CPU | 至少 2 核 |
# 查看 etcd 集群成员
etcdctl member list
# 查看 etcd 集群健康状态
etcdctl endpoint health
# 备份 etcd 数据
etcdctl snapshot save /backup/etcd-snapshot.db
# 恢复 etcd 数据
etcdctl snapshot restore /backup/etcd-snapshot.db
# 查看 etcd 中的 key
etcdctl get / --prefix --keys-only五、网络插件(CNI)
Kubernetes 使用 CNI(Container Network Interface)插件来实现 Pod 之间的网络通信。
常见网络插件对比
| 插件 | 网络模式 | 特点 |
|---|---|---|
| Flannel | VXLAN / Host-GW | 简单易用,适合入门 |
| Calico | BGP / VXLAN | 支持网络策略,性能好 |
| Weave | VXLAN | 自动发现,配置简单 |
| Cilium | eBPF | 高性能,支持 L7 策略 |
| Canal | Flannel + Calico | 兼顾网络和网络策略 |
Flannel 网络原理
Flannel 是最常用的入门级网络插件。所有 Node 节点上的 Docker 启动时需要 Flannel 分发 IP 地址,Flannel 会请求 etcd 中的配置,为各个 Node 分配不同的 IP 网段(类似于路由器 DHCP 的功能),有效避免了 IP 地址冲突。同时 Flannel 对 Docker 容器的数据包进行转发,实现整个 K8S 集群中容器网络互通。
# 安装 Flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 查看 Flannel Pod
kubectl get pods -n kube-flannel
# 查看 Flannel 网络
cat /run/flannel/subnet.env
# 查看 Node 的网段分配
etcdctl get /coreos.com/network/subnets --prefix六、安装方式对比
| 安装方式 | 难度 | 适用场景 | 说明 |
|---|---|---|---|
| minikube | 低 | 本地开发学习 | 单节点本地集群 |
| kind | 低 | CI/CD 测试 | Docker 中运行 K8s |
| kubeadm | 中 | 生产环境(推荐) | 官方维护的安装工具 |
| kops | 中 | AWS 生产环境 | AWS 专用集群管理 |
| Rancher | 中 | 企业多集群管理 | 提供图形化管理界面 |
| 二进制安装 | 高 | 深度定制需求 | 完全手动安装每个组件 |
| k3s | 低 | 边缘计算、IoT | 轻量级 K8s 发行版 |
七、使用 minikube 搭建开发环境
minikube 是一个在本地快速运行单节点 Kubernetes 集群的工具,非常适合开发和学习。
安装 minikube
# Linux 安装
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# macOS 安装
brew install minikube
# Windows 安装(使用 Chocolatey)
choco install minikube
# 或者直接下载
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exeminikube 基本操作
# 启动集群
minikube start
# 指定 Kubernetes 版本
minikube start --kubernetes-version=v1.27.0
# 指定容器运行时
minikube start --container-runtime=containerd
# 使用特定驱动(Docker、VirtualBox 等)
minikube start --driver=docker
# 查看集群状态
minikube status
# 查看 Dashboard
minikube dashboard
# 停止集群
minikube stop
# 删除集群
minikube delete
# 查看集群信息
kubectl cluster-info
# 查看 Node 信息
kubectl get nodes在 minikube 中部署应用
# 创建一个 Deployment
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
# 创建 Service
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
# 查看 Service
kubectl get services
# 在 minikube 中访问 Service
minikube service hello-node八、使用 kubeadm 安装生产集群
前置准备
# 所有节点执行:关闭 swap
swapoff -a
sed -i '/swap/d' /etc/fstab
# 设置内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
# 安装 containerd
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd安装 kubeadm、kubelet、kubectl
# 添加 Kubernetes 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 安装
yum install -y kubelet kubeadm kubectl
# 启用 kubelet
systemctl enable kubelet初始化集群
# Master 节点执行初始化
kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.27.0
# 配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.ymlNode 节点加入集群
# 在 Node 节点执行(使用初始化时输出的命令)
kubeadm join 192.168.1.100:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
# 在 Master 节点验证
kubectl get nodes常用集群管理命令
# 查看集群信息
kubectl cluster-info
# 查看所有 Node
kubectl get nodes
# 查看 Node 详情
kubectl describe node <node-name>
# 查看所有 Pod
kubectl get pods --all-namespaces
# 查看组件状态
kubectl get componentstatuses
# 查看集群事件
kubectl get events --sort-by='.lastTimestamp'九、kubectl 常用命令速查
资源查看
# 查看所有资源
kubectl get all
# 查看指定类型的资源
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get configmaps
kubectl get secrets
kubectl get namespaces
# 查看详细信息
kubectl describe pod <pod-name>
kubectl describe service <service-name>
# 以宽格式显示(包含 Node、IP 信息)
kubectl get pods -o wide
# 以 YAML 格式显示
kubectl get pod <pod-name> -o yaml
# 持续监控
kubectl get pods --watch资源操作
# 创建资源
kubectl apply -f deployment.yaml
kubectl create -f deployment.yaml
# 删除资源
kubectl delete -f deployment.yaml
kubectl delete pod <pod-name>
kubectl delete service <service-name>
# 编辑资源
kubectl edit deployment <deployment-name>
# 查看日志
kubectl logs <pod-name>
kubectl logs <pod-name> -f
kubectl logs <pod-name> -c <container-name>
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec -it <pod-name> -- /bin/sh
# 端口转发
kubectl port-forward pod/<pod-name> 8080:5000
kubectl port-forward service/<service-name> 8080:80集群运维
# 查看资源使用
kubectl top nodes
kubectl top pods
# 查看集群版本
kubectl version
# 查看 API 资源
kubectl api-resources
# 查看集群配置
kubectl config view
# 切换 context
kubectl config use-context <context-name>总结
Kubernetes 是容器编排的事实标准。核心架构:Master-Node 模式,etcd 存储状态。理解 Pod、Service、Deployment 等概念是学习 K8S 的基础。
关键知识点
- 部署类主题的核心不是“装成功”,而是“稳定运行、可排障、可回滚”。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
- Kubernetes 主题必须同时看资源对象、调度行为、网络暴露和配置分发。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
- 上线前检查镜像、命名空间、探针、资源限制、Service/Ingress 和配置来源。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
- 只会 apply YAML,不理解对象之间的依赖关系。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
- 继续补齐调度、网络策略、存储、GitOps 和平台工程能力。
适用场景
- 当你准备把《K8S 介绍及架构》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免“latest”带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
复盘问题
- 如果把《K8S 介绍及架构》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《K8S 介绍及架构》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《K8S 介绍及架构》最大的收益和代价分别是什么?
