Day1 K8S集群架构与组件
本文最后更新于2 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

一、部署时代演进

1. 传统物理机部署

  • 场景:直接在物理服务器部署多个应用
  • 痛点
    1. 资源浪费:硬件资源大量闲置
    2. 环境冲突:不同应用依赖版本冲突
    3. 迁移困难:跨机器迁移需要重装配置环境,极易出错

2. 虚拟化部署(VMware、VirtualBox)

  • 场景:一台物理机虚拟多台独立虚拟机,每台虚拟机拥有完整操作系统
  • 优点:资源隔离,解决环境冲突,可精细分配 CPU、内存
  • 痛点:虚拟机携带完整 OS,体积大、启动慢;大量资源消耗在虚拟机操作系统上

3. 容器部署(Docker)

  • 场景:虚拟化操作系统内核,多个容器共享宿主机内核
  • 优点:轻量秒级启动;一次构建随处运行,解决环境依赖
  • 痛点:容器数量庞大之后,缺少调度、故障自愈、自动扩缩容、服务发现能力,K8s 用来解决容器大规模管理难题

比喻:Docker 是打包集装箱;K8s 是智能港口,调度、维护大量集装箱。

4. 为什么裸 Docker 不够,需要 K8s

裸容器问题K8s 解决方案
宿主机宕机,容器无法自动恢复故障节点 Pod 自动调度到健康节点,故障自愈
容器进程存活,但业务卡死无响应存活探针 livenessProbe、就绪探针 readinessProbe 检测业务状态,异常自动处理
部署、回滚、扩缩容全靠人工操作Deployment 实现滚动更新、一键回滚、水平扩缩容
大量容器端口维护混乱,无服务发现Service 实现服务发现、负载均衡,DNS 访问服务

二、K8s 简介

Kubernetes 简称 K8s,开源容器集群编排管理平台,实现容器自动化部署、扩缩容、故障自愈。

✅ K8s 核心能力

  1. 服务发现 & 负载均衡:DNS/IP 暴露服务,流量负载均衡
  2. 存储编排:自动挂载本地、云存储
  3. 自动部署与回滚:声明式 API,受控速率变更应用状态
  4. 自动调度装箱:依据 CPU、内存需求,把 Pod 调度到节点,最大化硬件利用率
  5. 自我修复:重启失败容器、杀死不健康实例,未就绪不对外提供服务
  6. 密钥与配置管理:管理密码、密钥,更新配置无需重建镜像
  7. 水平扩缩容:命令 / 监控指标自动伸缩应用实例
  8. 可扩展:无需修改源码即可扩展集群功能

三、K8s 集群架构

集群分为控制平面(Master 大脑) + 工作节点(Node 手脚,执行业务)

1. 控制平面组件(管理集群)

  1. kube‑apiserver 集群唯一入口,所有请求必经组件;负责身份认证、授权;集群通信枢纽;读写 etcd 存储所有集群状态。
  2. etcd 分布式键值数据库,集群唯一数据源;存储 Pod、Service、配置、密钥等全部集群数据;高可用多副本保证数据安全。

❗所有组件不能直接读写 etcd,必须通过 apiserver。

  1. kube‑scheduler 调度器 监听未调度 Pod,根据节点资源、亲和 / 反亲和策略,选出最合适节点运行 Pod,实现负载均衡。
  2. kube‑controller‑manager 控制器管理器 多个控制器后台运行,持续调谐集群状态,保证实际状态 = 期望状态。 包含节点控制器、副本控制器、端点控制器等;副本少了新建 Pod,副本多了删除 Pod,处理节点故障。
  3. cloud‑controller‑manager(可选) 对接云厂商 API,屏蔽不同云平台差异;管理云负载均衡、云存储、云节点。

2. 工作节点组件(运行业务 Pod)

  1. kubelet 每个 Node 上运行的代理;接收 apiserver 指令;管理本节点 Pod 生命周期(创建、监控、销毁容器);定期上报节点和 Pod 状态给控制平面。
  2. kube‑proxy 维护节点网络规则;实现 Service 服务发现和负载均衡;使用 iptables/ipvs 转发流量,把请求分发到后端 Pod。
  3. 容器运行时 Container Runtime 底层软件,真正负责跑容器;常见containerd(官方推荐)、cri‑o;

Docker 高版本 K8s 不再原生支持,底层实际也是 containerd。

通过 namespace 做隔离、cgroup 限制资源,拉取镜像、启停容器。

📝Pod:K8s 最小部署单元,容器运行在 Pod 内部。

3. 完整调用流程(部署 Nginx 示例)

  1. 用户请求发送到kube‑apiserver
  2. apiserver 通知 scheduler,scheduler 读取 etcd 节点信息,算法选出合适 node
  3. apiserver 通知 controller‑manager,下发任务给目标节点 kubelet
  4. kubelet 调用容器运行时 (containerd) 启动 nginx Pod
  5. kube‑proxy 维护网络规则,外部通过 Service 访问 nginx 服务

四、Kubeadm 部署 K8s(CentOS7 三节点)

环境规划

主机名IP配置系统
k8s‑master192.168.10.112 核 2G40GCentOS7.9
k8s‑node01192.168.10.122 核 2G40GCentOS7.9
k8s‑node02192.168.10.132 核 2G40GCentOS7.9

所有节点初始化(必须全部执行)

  1. 基础要求 CPU 内存≥2C2G;网络互通;主机名 / MAC/product‑uuid 不重复;关闭 swap;关闭 firewalld、SELinux
  2. 关闭防火墙与 SELinux

systemctl disable firewalld --now
sed -i '/^SELINUX=/s/enforcing/disabled/g' /etc/selinux/config
setenforce 0
  1. 设置主机名,配置 /etc/hosts 域名解析,保证互相 ping 通
  2. 时间同步

yum -y install ntpdate
ntpdate time1.aliyun.com
crontab -e
# */5 * * * * /usr/sbin/ntpdate time1.aliyun.com
  1. 关闭 swap(K8s 强制) swap 会造成内存统计不准、性能抖动,kubeadm 初始化会校验

swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab
free -h
  1. 开启 ipv4 数据包转发(容器网络路由)

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sysctl --system
sysctl net.ipv4.ip_forward

安装 containerd 容器运行时(全部节点)

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install containerd.io
#生成默认配置
containerd config default > /etc/containerd/config.toml
#修改配置:pause镜像为国内镜像、开启SystemdCgroup=true
vim /etc/containerd/config.toml
# sandbox_image = 'registry.cn‑shanghai.aliyuncs.com/aliyun_lqkhn/pause:3.10'
# SystemdCgroup = true
systemctl enable containerd --now

cgroup 驱动统一使用systemd,系统和 kubelet 保持一致,避免节点 NotReady。

安装 kubeadm kubelet kubectl(全部节点)

配置国内 k8s yum 源

yum install -y kubelet kubeadm kubectl
systemctl enable kubelet --now
#此时kubelet启动失败,集群初始化完成才正常

Master 节点初始化集群

kubeadm init \
--apiserver-advertise-address=192.168.10.11 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=172.10.0.0/16 \
--service-cidr=10.64.0.0/12

初始化完成执行配置 kubectl 权限:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

参数说明

–apiserver‑advertise‑address:master 通告内网 IP

–image‑repository:国内镜像仓库,替代 k8s.gcr.io

–pod‑network‑cidr:Pod 网段,必须和 CNI 插件 yaml 匹配

–service‑cidr:Service 虚拟 IP 网段

Node 节点加入集群

复制 init 输出的 join 命令,在 node 节点 root 执行

kubeadm join 192.168.10.11:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

token 有效期 24 小时,过期可重新生成 token。

部署网络插件 Calico

没有 CNI 网络插件,节点状态NotReady,K8s 不自带容器网络。

Calico:支持 BGP 三层路由,支持 NetworkPolicy 网络策略,生产最常用。

wget https://cdn.jsdelivr.net/gh/projectcalico/calico@v3.31.4/manifests/calico.yaml
kubectl apply -f calico.yaml

等待 kube-system 下 calico 全部 Pod 状态Running,节点变为 Ready。

集群校验命令

kubectl get node                 #查看集群节点状态
kubectl get pod -n kube-system   #查看系统Pod状态
kubectl get nodes -w             #实时观察节点状态 ctrl+c退出
kubectl describe node 节点名      #查看节点详细信息

重置集群:kubeadm reset

附加配置

  1. kubectl 命令补全(master) 安装 bash‑completion,生成补全脚本写入.bash_profile,source 生效,Tab 自动补全资源与参数。
  2. node 节点使用 kubectl:把 master 的/etc/kubernetes/admin.conf拷贝到 node 节点~/.kube/config

五、高频面试题速记

  1. Docker 与 K8s 区别 Docker 是容器虚拟化技术,负责打包、运行单个容器;K8s 是容器编排平台,管理大规模容器集群,提供调度、自愈、扩缩容、服务发现、负载均衡整套能力。
  2. K8s 核心组件及作用
  • etcd:集群数据库,持久化全部集群配置状态
  • apiserver:集群唯一入口,认证授权,组件通信枢纽
  • controller‑manager:控制器,保证集群实际状态等于期望状态
  • scheduler:调度器,把 Pod 调度到合适工作节点
  • kubelet:节点代理,管理本节点 Pod 生命周期,上报状态
  • kube‑proxy:维护网络规则,实现 Service 服务发现、负载均衡
  1. K8s 三类 IP 网段
  • 节点 IP:服务器虚拟机物理网卡 IP
  • Pod 网段:Pod 内部容器 IP,Pod 之间通信
  • Service 网段:集群内部虚拟 ClusterIP,服务访问入口
  1. kubeadm 证书管理 证书路径/etc/kubernetes/pki/;默认有效期 1 年; 查看过期:kubeadm certs check‑expiration;手动续期:kubeadm certs renew all
  2. K8s 集群部署方式
  • kubeadm:官方推荐,生产环境,简单标准化
  • 二进制:手动编译部署,高度定制
  • Minikube/Kind:本地开发测试单节点集群
  • K3s/RKE2:轻量级,适合边缘、离线环境
  1. Calico vs Flannel 对比 表格CalicoFlannel网络策略支持 NetworkPolicy 做 Pod 网络隔离不支持网络策略网络模式默认 BGP 三层路由,性能高Overlay 隧道封装,有性能开销复杂度组件多,排障复杂简单轻量适用场景生产中大型集群,需要安全管控测试、小规模集群

六、重要踩坑点总结

  1. swap 必须关闭,否则 kubeadm 初始化报错
  2. containerd 配置必须开启SystemdCgroup=true,否则节点 NotReady
  3. pod‑network‑cidr 参数必须和 calico 配置文件网段保持一致
  4. 集群初始化完成前 kubelet 会启动失败,属于正常现象
  5. 节点加入集群后节点 NotReady 优先排查 CNI 网络插件 Pod 状态
  6. 所有组件不直接读写 etcd,全部走 apiserver
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇