Day 01 - 集群架构原理与环境准备
📘 Day 01:集群架构原理与环境准备
🎯 今日目标
- 能画出 K8s 架构图并说出每个组件的作用
- 能用
kubeadm初始化单节点集群 - 安装 Calico CNI 并使 CoreDNS 正常运行
- 配置
kubectl自动补全和常用别名 - 能使用
kubectl查看集群组件状态
🧠 理论精讲(30 分钟)
K8s 是什么
Kubernetes 是一个容器编排平台,它解决的问题:
| 问题 | K8s 怎么解决 |
|---|---|
| 容器放哪台机器? | 调度器(Scheduler)自动决策 |
| 容器挂了怎么办? | 控制器(Controller)自动重建 |
| 服务怎么被发现? | Service + DNS 自动注册与发现 |
| 配置怎么管理? | ConfigMap/Secret 统一管理 |
| 流量怎么分发? | Service/Ingress 负载均衡 |
| 存储怎么挂载? | PV/PVC 抽象存储 |
控制平面组件(Master 节点)
1 | ┌─────────────────────────────────────────────┐ |
| 组件 | 职责 | 关键端口 |
|---|---|---|
| kube-apiserver | 集群统一入口,所有操作必经之路 | 6443 |
| etcd | 分布式 KV 存储,保存集群所有状态 | 2379-2380 |
| kube-scheduler | 监听新 Pod,选择最优节点 | — |
| kube-controller-manager | 运行各种控制器(Deployment/Node/Service…) | — |
数据平面组件(所有节点)
| 组件 | 职责 |
|---|---|
| kubelet | 节点代理,执行 Pod 创建/销毁,上报状态 |
| kube-proxy | 维护节点上的网络规则(iptables/IPVS),实现 Service |
| 容器运行时 | 真正跑容器的东西(containerd / cri-o / docker) |
一个 kubectl run nginx 请求的完整流程
1 | kubectl → api-server(认证→鉴权→准入→写入 etcd) |
🔧 动手实操(120 分钟)
前置环境准备
1 | # 1. 关闭 swap(K8s 要求) |
安装 kubeadm/kubelet/kubectl
1 | # 5. 添加 K8s YUM 源 |
练习 1.1:初始化单节点集群
1 | # 初始化集群(关键参数) |
验证集群初始化:
1 | # 配置 kubectl |
⚠️ 状态为
NotReady是正常的,还没有安装网络插件。
练习 1.2:安装 Calico CNI 插件
1 | # 下载并应用 Calico 清单 |
练习 1.3:配置 kubectl 自动补全与别名
1 | # Bash 自动补全 |
练习 1.4:查看集群组件状态
1 | # 查看所有命名空间 |
练习 1.5:探索 etcd 存储
1 | # 进入 etcd 容器(如果是静态 Pod 运行的) |
🐛 排错练习(30 分钟)
场景 1:kubelet 停止后 Pod 状态变化
1 | # 1. 先创建一个测试 Pod |
场景 2:CoreDNS Pending 排错
1 | # 模拟问题:使用错误的 pod-network-cidr 导致 Calico 不工作 |
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 30 分钟完成下述全部操作
题目:单节点集群部署
1 | 【环境】一台全新的 CentOS Stream 9 云服务器(2C4G) |
📋 命令速查
| 命令 | 功能 | 注解 |
|---|---|---|
sudo swapoff -a |
关闭 Swap | kubelet 强制要求,否则拒绝启动 |
sudo sed -i '/ swap / s/^/#/' /etc/fstab |
永久禁用 Swap | 注释 fstab 中 swap 行,重启后仍生效 |
sudo modprobe br_netfilter |
加载 br_netfilter 模块 | 允许桥接流量经过 iptables 处理 |
sudo modprobe overlay |
加载 overlay 模块 | 容器存储驱动依赖 |
sudo sysctl --system |
应用所有 sysctl 配置 | 重新加载 /etc/sysctl.d/ 下所有配置 |
sudo dnf install -y containerd.io |
安装 containerd 运行时 | K8s 1.24+ 默认容器运行时,通过 Docker CE 仓库安装 |
containerd config default | sudo tee /etc/containerd/config.toml |
生成 containerd 默认配置 | 必须修改 SystemdCgroup = true |
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml |
启用 SystemdCgroup | 与 kubelet 的 cgroup 驱动保持一致 |
sudo systemctl restart containerd && sudo systemctl enable containerd |
重启并开机自启 containerd | 配置修改后必须重启 |
sudo dnf versionlock kubelet kubeadm kubectl |
锁定 K8s 组件版本 | 防止 dnf upgrade 意外升级导致版本不一致 |
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.29.0 |
初始化 K8s 集群 | 下载镜像、生成证书、启动控制平面组件为静态 Pod |
mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config |
配置 kubectl 认证 | 将 admin 证书复制到用户目录 |
sudo chown $(id -u):$(id -g) $HOME/.kube/config |
修改 kubeconfig 权限 | 让普通用户也能使用 kubectl |
kubectl apply -f calico.yaml |
安装 Calico CNI | 提供 Pod 网络和 NetworkPolicy 支持 |
kubectl get pods -n kube-system --watch |
实时监控系统 Pod | 等待 CoreDNS 和 Calico Pod 就绪 |
kubectl get nodes |
查看节点状态 | STATUS 必须为 Ready |
kubectl get componentstatuses |
查看控制平面组件健康 | 检查 scheduler/controller-manager/etcd 状态 |
kubectl get --raw='/readyz?verbose' |
查看 apiserver 就绪探测详情 | 比 componentstatuses 更准确(1.19+) |
kubectl cluster-info |
查看集群信息 | 输出 apiserver 和 CoreDNS 地址 |
sudo crictl ps |
列出容器(containerd) | K8s 1.24+ 替代 docker ps |
sudo crictl ps | grep etcd |
查找 etcd 容器 ID | 静态 Pod 通过 crictl 管理 |
sudo crictl exec -it <etcd-id> sh |
进入 etcd 容器 | 用于执行 etcdctl 命令探索存储 |
ETCDCTL_API=3 etcdctl --cacert=... --cert=... --key=... get / --prefix --keys-only | head -30 |
列出 etcd 中的 key | 查看集群存储在 etcd 中的资源 |
echo 'source <(kubectl completion bash)' >> ~/.bashrc |
启用 kubectl 自动补全 | 按 Tab 补全命令和资源名 |
alias k=kubectl |
设置 kubectl 别名 | 减少输入量,赛题时间紧张时很有用 |
📚 参考来源
| 来源 | 链接 / 说明 |
|---|---|
| Kubernetes 官方:安装 kubeadm | https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ |
| Kubernetes 官方:创建集群 | https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ |
| containerd 官方文档 | https://github.com/containerd/containerd/blob/main/docs/getting-started.md |
| Calico 快速开始 | https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart |
| Linux 内核模块 overlay/br_netfilter | https://kubernetes.io/docs/setup/production-environment/container-runtimes/ |
| kubectl 安装与配置 | https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ |
📝 今日笔记模板
1 | 日期:____年____月____日 |