Kubernetes 完整学习手册(1 主多从 + 纯 YAML 部署 + 访问原理)

适配系统 :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 集群架构(最简单记忆)

两类节点:

  1. Master 节点(大脑 / 控制面)

    • 负责管理整个集群
    • 核心组件:
      • apiserver:唯一入口,所有命令走这里
      • etcd:数据库,存集群所有数据
      • scheduler:决定 Pod 跑在哪个节点
      • controller-manager:监控、自愈
  2. 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:可视化页面

核心规则

  1. K8s 1.24+ 弃用 Docker,用containerd
  2. 集群必须关闭 Swap、SELinux、防火墙
  3. 初始化参数导出配置文件修改,不记复杂命令
  4. 部署必须用YAML(生产标准)
  5. 外部访问必须用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 个位置(新手直接搜关键词):

  1. 修改 cgroup 驱动 (K8s 强制要求)搜索:SystemdCgroupfalsetrue

  2. 修改 pause 镜像为国内 (解决拉取失败)搜索:sandbox_image替换为:registry.aliyuncs.com/google_containers/pause:3.9

  3. 添加国内镜像加速 (加速下载容器镜像)搜索:[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
  1. localAPIEndpoint.advertiseAddress:改为 192.168.10.10(MasterIP)
  2. imageRepository:改为 registry.aliyuncs.com/google_containers(国内镜像)
  3. kubernetesVersion:改为 v1.30.0(版本号)
  4. podSubnet:添加 192.168.0.0/16(Calico 网络网段)
  5. 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)

核心结论

  1. IP = 集群任意节点的真实物理 IP
  2. 端口固定为 30080(所有节点一致)
  3. 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              # 查看所有资源
相关推荐
weixin_513449962 小时前
walk_these_ways项目学习记录第七篇(通过行为多样性 (MoB) 实现地形泛化)--核心环境下
人工智能·python·学习
管鲍考试学习系统3 小时前
在线考试系统是什么?功能、部署、应用场景全详解(管鲍考试学习系统 V8.0 深度版)
学习·架构·在线考试·考试系统·培训考试·考试练习
CheerWWW3 小时前
深入理解计算机系统——位运算、树状数组
笔记·学习·算法·计算机系统
GHL2842710904 小时前
Qwen-Agent 内置RAG学习
学习·ai
Mabnus4 小时前
免疫治疗靶点FCRL5
学习
目标是分享一切4 小时前
P4语言学习过程【环境安装+p4官方tutorials】
学习
Stella Blog5 小时前
狂神Java基础学习笔记Day01
java·笔记·学习
hqyjzsb5 小时前
深度洞察人性需求!拆解传统心理咨询升级AI智慧辅导师数智工作流
人工智能·深度学习·学习·数据挖掘·aigc·学习方法·业界资讯