适配系统 :RockyLinux 9/AlmaLinux 9/CentOS 7/8(RHEL 系)集群架构 :1 主 (Master) + 2 从 (Worker) 标准生产架构固定 IP 规划
| 节点角色 | 主机名 | IP 地址 |
|---|---|---|
| Master(控制面) | k8s-master | 192.168.10.10 |
| Worker1(工作节点) | k8s-worker1 | 192.168.10.11 |
| Worker2(工作节点) | k8s-worker2 | 192.168.10.12 |
K8s 集群架构(最简单记忆)
两类节点:
-
Master 节点(大脑 / 控制面)
- 负责管理整个集群
- 核心组件:
apiserver:唯一入口,所有命令走这里etcd:数据库,存集群所有数据scheduler:决定 Pod 跑在哪个节点controller-manager:监控、自愈
-
Worker 节点(工人 / 数据面)
- 真正运行业务容器
- 核心组件:
kubelet:节点代理,和 Master 通信kube-proxy:网络、负载均衡containerd:容器运行时(跑容器)Calico:CNI 网络插件(Pod 互通)
核心概念(必记 5 个)
- Pod:K8s 最小运行单位,一个 Pod 里 1~多个容器
- Deployment:管理 Pod,保证副本数量、升级、回滚
- Service:给 Pod 固定 IP + 负载均衡
- Ingress:外网域名访问入口
- Namespace:资源隔离(开发 / 测试 / 生产)
组件作用再巩固
kubeadm:集群搭建工具(安装集群用)kubelet:每个节点必须跑的代理(管理 Pod)kubectl:客户端命令(你操作集群用)containerd:容器运行时(代替 Docker)Calico:Pod 网络(互通 + 防火墙)Metrics Server:监控 CPU / 内存(kubectl top)MetalLB:裸机负载均衡(Service LoadBalancer)Ingress-Nginx:外网域名访问Dashboard:可视化页面
核心规则
- K8s 1.24+ 弃用 Docker,用
containerd - 集群必须关闭 Swap、SELinux、防火墙
- 初始化参数导出配置文件修改,不记复杂命令
- 部署必须用
YAML(生产标准) - 外部访问必须用
Service,首选NodePort
第一部分:所有节点执行(Master+Worker1+Worker2)
步骤 1:基础环境初始化
# 1. 设置主机名(按节点角色执行)
hostnamectl set-hostname k8s-master # Master执行
hostnamectl set-hostname k8s-worker1 # Worker1执行
hostnamectl set-hostname k8s-worker2 # Worker2执行
# 2. 配置hosts解析(所有节点执行,让节点互相识别)
cat >> /etc/hosts << EOF
192.168.10.10 k8s-master
192.168.10.11 k8s-worker1
192.168.10.12 k8s-worker2
EOF
# 3. 临时关闭Swap(K8s强制要求,禁止使用交换分区)
swapoff -a
# 4. 永久关闭Swap(重启服务器不生效)
sed -i '/swap/s/^/#/' /etc/fstab
# 5. 临时关闭SELinux(安全组件,影响容器权限)
setenforce 0
# 6. 永久关闭SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 7. 关闭防火墙(初学全关,生产后期配置规则)
systemctl stop firewalld
systemctl disable firewalld
# 8. 安装时间同步工具(集群节点时间必须一致)
dnf install -y chrony
systemctl enable --now chronyd
步骤 2:内核参数配置(容器网络必需)
# 1. 加载K8s必需内核模块
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF
# 2. 立即加载模块(不重启生效)
modprobe overlay
modprobe br_netfilter
# 3. 配置网络内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1 # 开启IP转发(跨节点通信)
net.bridge.bridge-nf-call-iptables = 1 # 桥接流量走iptables规则
net.bridge.bridge-nf-call-ip6tables = 1 # IPv6兼容
EOF
# 4. 生效内核参数
sysctl --system
步骤 3:安装 containerd(导出配置文件修改)
3.1 安装依赖 + 阿里云 Docker 源
dnf install -y dnf-plugins-core
# 添加国内Docker源(containerd包含在Docker源中)
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装containerd
dnf install -y containerd.io
3.2 【关键】导出默认配置文件(不记参数,直接改文件)
# 导出默认配置到 /etc/containerd/config.toml
containerd config default > /etc/containerd/config.toml
3.3 手动修改配置文件(打开文件,改这 3 处)
执行命令打开文件:
vi /etc/containerd/config.toml
必须修改的 3 个位置(新手直接搜关键词):
-
修改 cgroup 驱动 (K8s 强制要求)搜索:
SystemdCgroup把false→true -
修改 pause 镜像为国内 (解决拉取失败)搜索:
sandbox_image替换为:registry.aliyuncs.com/google_containers/pause:3.9 -
添加国内镜像加速 (加速下载容器镜像)搜索:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]在下方添加:[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://docker.mirrors.ustc.edu.cn"]
3.4 启动并验证 containerd
systemctl daemon-reload
systemctl enable --now containerd # 开机自启+立即启动
ctr version # 验证安装成功(出现版本号即可)
步骤 4:安装 K8s 核心组件(kubeadm/kubelet/kubectl)
4.1 添加阿里云 K8s 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2 安装固定版本 + 锁定版本(防止自动升级)
# 安装1.30.0稳定版
dnf install -y kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0
# 锁定版本
dnf versionlock add kubelet kubeadm kubeadm kubectl
# kubelet开机自启(集群运行核心组件)
systemctl enable kubelet
第二部分:仅 Master 节点执行
步骤 1:【核心】导出 kubeadm 初始化配置文件(改文件初始化)
# 导出默认初始化配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
手动修改配置文件(打开后改这 5 处)
vi kubeadm-config.yaml
localAPIEndpoint.advertiseAddress:改为192.168.10.10(MasterIP)imageRepository:改为registry.aliyuncs.com/google_containers(国内镜像)kubernetesVersion:改为v1.30.0(版本号)podSubnet:添加192.168.0.0/16(Calico 网络网段)serviceSubnet:保持10.96.0.0/12
步骤 2:通过配置文件初始化集群(极简命令)
kubeadm init --config kubeadm-config.yaml
初始化成功后执行(配置 kubectl 权限)
# 创建kubectl配置目录
mkdir -p $HOME/.kube
# 复制集群管理员配置
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 赋予当前用户权限
chown $(id -u):$(id -g) $HOME/.kube/config
保存 Worker 加入集群命令(复制备用)
# 忘记命令可执行此语句重新生成
kubeadm token create --print-join-command
步骤 3:安装 Calico 网络插件(生产标准)
# 部署Calico(自动适配我们配置的pod网段)
kubectl apply -f https://docs.projectcalico.com/v3.28/manifests/calico.yaml
# 查看Calico状态(全部Running后按Ctrl+C退出)
kubectl get pods -n calico-system -w
# 查看节点状态(等待变为Ready)
kubectl get nodes
第三部分:仅 Worker 节点执行(2 台从节点都执行)
# 粘贴Master节点生成的加入命令(示例)
kubeadm join 192.168.10.10:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx
Master 节点验证集群(1 主 2 从 Ready)
kubectl get nodes
第四部分:生产必备插件(一键部署 + 注解)
插件 1:Metrics Server(监控 CPU / 内存)
# 下载配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改国内镜像
sed -i 's#registry.k8s.io/metrics-server/metrics-server#registry.aliyuncs.com/google_containers/metrics-server#g' components.yaml
# 部署
kubectl apply -f components.yaml
# 验证
kubectl top nodes # 查看节点资源
kubectl top pods # 查看Pod资源
插件 2:Ingress-Nginx(域名访问)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
插件 3:Dashboard(可视化面板)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
第五部分:K8s 标准部署(YAML 文件,生产唯一方式)
创建 nginx.yaml(完整模板 + 逐行注解)
# 1. Deployment:管理Pod(自愈、多副本、升级)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx # 部署名称
spec:
replicas: 2 # 2个Pod副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine # 轻量Nginx镜像
ports:
- containerPort: 80 # 容器内部端口
---
# 2. Service:提供固定访问入口(必须有!否则外部无法访问)
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort # 外部访问模式(学习首选)
selector:
app: nginx # 关联上面的Pod
ports:
- port: 80 # Service端口
targetPort: 80 # 容器端口
nodePort: 30080# 固定外部端口(30000-32767)
部署命令
kubectl apply -f nginx.yaml
查看资源
kubectl get pods # 查看Pod
kubectl get svc # 查看服务
第六部分:访问方式终极总结
1. 不创建 Service → 绝对无法外部访问
- Pod IP 是内部虚拟 IP,外部电脑 ping 不通
- Pod 重启 IP 会变,无法稳定访问
2. 推荐访问方式(NodePort)
访问地址(任意节点 IP+30080,全部通用)
http://192.168.10.10:30080 (MasterIP)
http://192.168.10.11:30080 (Worker1IP)
http://192.168.10.12:30080 (Worker2IP)
核心结论
- IP = 集群任意节点的真实物理 IP
- 端口固定为 30080(所有节点一致)
- Nginx 跑在任意 Worker,所有节点都能访问
3. 生产级访问:Ingress 域名访问
nginx.test.com → 指向任意节点IP
第七部分:常用命令速查(带注解)
kubectl apply -f xxx.yaml # 部署/更新资源
kubectl get pods # 查看Pod
kubectl get svc # 查看服务
kubectl get nodes # 查看集群节点
kubectl describe pod xxx # 排查Pod错误
kubectl logs -f xxx # 实时查看日志
kubectl delete -f xxx.yaml # 删除资源
kubectl get all # 查看所有资源