
一、部署时代演进
1. 传统物理机部署
- 场景:直接在物理服务器部署多个应用
- 痛点
- 资源浪费:硬件资源大量闲置
- 环境冲突:不同应用依赖版本冲突
- 迁移困难:跨机器迁移需要重装配置环境,极易出错
2. 虚拟化部署(VMware、VirtualBox)
- 场景:一台物理机虚拟多台独立虚拟机,每台虚拟机拥有完整操作系统
- 优点:资源隔离,解决环境冲突,可精细分配 CPU、内存
- 痛点:虚拟机携带完整 OS,体积大、启动慢;大量资源消耗在虚拟机操作系统上
3. 容器部署(Docker)
- 场景:虚拟化操作系统内核,多个容器共享宿主机内核
- 优点:轻量秒级启动;一次构建随处运行,解决环境依赖
- 痛点:容器数量庞大之后,缺少调度、故障自愈、自动扩缩容、服务发现能力,K8s 用来解决容器大规模管理难题
比喻:Docker 是打包集装箱;K8s 是智能港口,调度、维护大量集装箱。
4. 为什么裸 Docker 不够,需要 K8s
| 裸容器问题 | K8s 解决方案 |
|---|---|
| 宿主机宕机,容器无法自动恢复 | 故障节点 Pod 自动调度到健康节点,故障自愈 |
| 容器进程存活,但业务卡死无响应 | 存活探针 livenessProbe、就绪探针 readinessProbe 检测业务状态,异常自动处理 |
| 部署、回滚、扩缩容全靠人工操作 | Deployment 实现滚动更新、一键回滚、水平扩缩容 |
| 大量容器端口维护混乱,无服务发现 | Service 实现服务发现、负载均衡,DNS 访问服务 |
二、K8s 简介
Kubernetes 简称 K8s,开源容器集群编排管理平台,实现容器自动化部署、扩缩容、故障自愈。
✅ K8s 核心能力
- 服务发现 & 负载均衡:DNS/IP 暴露服务,流量负载均衡
- 存储编排:自动挂载本地、云存储
- 自动部署与回滚:声明式 API,受控速率变更应用状态
- 自动调度装箱:依据 CPU、内存需求,把 Pod 调度到节点,最大化硬件利用率
- 自我修复:重启失败容器、杀死不健康实例,未就绪不对外提供服务
- 密钥与配置管理:管理密码、密钥,更新配置无需重建镜像
- 水平扩缩容:命令 / 监控指标自动伸缩应用实例
- 可扩展:无需修改源码即可扩展集群功能
三、K8s 集群架构
集群分为控制平面(Master 大脑) + 工作节点(Node 手脚,执行业务)
1. 控制平面组件(管理集群)
- kube‑apiserver 集群唯一入口,所有请求必经组件;负责身份认证、授权;集群通信枢纽;读写 etcd 存储所有集群状态。
- etcd 分布式键值数据库,集群唯一数据源;存储 Pod、Service、配置、密钥等全部集群数据;高可用多副本保证数据安全。
❗所有组件不能直接读写 etcd,必须通过 apiserver。
- kube‑scheduler 调度器 监听未调度 Pod,根据节点资源、亲和 / 反亲和策略,选出最合适节点运行 Pod,实现负载均衡。
- kube‑controller‑manager 控制器管理器 多个控制器后台运行,持续调谐集群状态,保证实际状态 = 期望状态。 包含节点控制器、副本控制器、端点控制器等;副本少了新建 Pod,副本多了删除 Pod,处理节点故障。
- cloud‑controller‑manager(可选) 对接云厂商 API,屏蔽不同云平台差异;管理云负载均衡、云存储、云节点。
2. 工作节点组件(运行业务 Pod)
- kubelet 每个 Node 上运行的代理;接收 apiserver 指令;管理本节点 Pod 生命周期(创建、监控、销毁容器);定期上报节点和 Pod 状态给控制平面。
- kube‑proxy 维护节点网络规则;实现 Service 服务发现和负载均衡;使用 iptables/ipvs 转发流量,把请求分发到后端 Pod。
- 容器运行时 Container Runtime 底层软件,真正负责跑容器;常见
containerd(官方推荐)、cri‑o;
Docker 高版本 K8s 不再原生支持,底层实际也是 containerd。
通过 namespace 做隔离、cgroup 限制资源,拉取镜像、启停容器。
📝Pod:K8s 最小部署单元,容器运行在 Pod 内部。
3. 完整调用流程(部署 Nginx 示例)
- 用户请求发送到
kube‑apiserver - apiserver 通知 scheduler,scheduler 读取 etcd 节点信息,算法选出合适 node
- apiserver 通知 controller‑manager,下发任务给目标节点 kubelet
- kubelet 调用容器运行时 (containerd) 启动 nginx Pod
- kube‑proxy 维护网络规则,外部通过 Service 访问 nginx 服务
四、Kubeadm 部署 K8s(CentOS7 三节点)
环境规划
| 主机名 | IP | 配置 | 系统 |
|---|---|---|---|
| k8s‑master | 192.168.10.11 | 2 核 2G40G | CentOS7.9 |
| k8s‑node01 | 192.168.10.12 | 2 核 2G40G | CentOS7.9 |
| k8s‑node02 | 192.168.10.13 | 2 核 2G40G | CentOS7.9 |
所有节点初始化(必须全部执行)
- 基础要求 CPU 内存≥2C2G;网络互通;主机名 / MAC/product‑uuid 不重复;关闭 swap;关闭 firewalld、SELinux
- 关闭防火墙与 SELinux
systemctl disable firewalld --now
sed -i '/^SELINUX=/s/enforcing/disabled/g' /etc/selinux/config
setenforce 0
- 设置主机名,配置 /etc/hosts 域名解析,保证互相 ping 通
- 时间同步
yum -y install ntpdate
ntpdate time1.aliyun.com
crontab -e
# */5 * * * * /usr/sbin/ntpdate time1.aliyun.com
- 关闭 swap(K8s 强制) swap 会造成内存统计不准、性能抖动,kubeadm 初始化会校验
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab
free -h
- 开启 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
附加配置
- kubectl 命令补全(master) 安装 bash‑completion,生成补全脚本写入
.bash_profile,source 生效,Tab 自动补全资源与参数。 - node 节点使用 kubectl:把 master 的
/etc/kubernetes/admin.conf拷贝到 node 节点~/.kube/config
五、高频面试题速记
- Docker 与 K8s 区别 Docker 是容器虚拟化技术,负责打包、运行单个容器;K8s 是容器编排平台,管理大规模容器集群,提供调度、自愈、扩缩容、服务发现、负载均衡整套能力。
- K8s 核心组件及作用
- etcd:集群数据库,持久化全部集群配置状态
- apiserver:集群唯一入口,认证授权,组件通信枢纽
- controller‑manager:控制器,保证集群实际状态等于期望状态
- scheduler:调度器,把 Pod 调度到合适工作节点
- kubelet:节点代理,管理本节点 Pod 生命周期,上报状态
- kube‑proxy:维护网络规则,实现 Service 服务发现、负载均衡
- K8s 三类 IP 网段
- 节点 IP:服务器虚拟机物理网卡 IP
- Pod 网段:Pod 内部容器 IP,Pod 之间通信
- Service 网段:集群内部虚拟 ClusterIP,服务访问入口
- kubeadm 证书管理 证书路径
/etc/kubernetes/pki/;默认有效期 1 年; 查看过期:kubeadm certs check‑expiration;手动续期:kubeadm certs renew all - K8s 集群部署方式
- kubeadm:官方推荐,生产环境,简单标准化
- 二进制:手动编译部署,高度定制
- Minikube/Kind:本地开发测试单节点集群
- K3s/RKE2:轻量级,适合边缘、离线环境
- Calico vs Flannel 对比 表格CalicoFlannel网络策略支持 NetworkPolicy 做 Pod 网络隔离不支持网络策略网络模式默认 BGP 三层路由,性能高Overlay 隧道封装,有性能开销复杂度组件多,排障复杂简单轻量适用场景生产中大型集群,需要安全管控测试、小规模集群
六、重要踩坑点总结
- swap 必须关闭,否则 kubeadm 初始化报错
- containerd 配置必须开启
SystemdCgroup=true,否则节点 NotReady - pod‑network‑cidr 参数必须和 calico 配置文件网段保持一致
- 集群初始化完成前 kubelet 会启动失败,属于正常现象
- 节点加入集群后节点 NotReady 优先排查 CNI 网络插件 Pod 状态
- 所有组件不直接读写 etcd,全部走 apiserver