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              # 查看所有资源
相关推荐
lichenyang4531 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4531 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4531 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美7 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程