Kubernetes 入门到实战:概念详解 + kubeadm 安装 + 节点克隆全流程

如果你刚接触容器编排,Kubernetes(K8s)一定是绕不开的核心技术。作为业界主流的容器管理平台,它能帮我们自动部署、扩缩容、自愈应用,让集群管理变得简单高效。

但很多新手都会卡在概念看不懂、安装踩坑、集群搭不起来这几步。

这篇文章就用最通俗的语言,把 K8s 核心概念、Pod 原理、集群架构、kubeadm 安装、节点克隆、网络插件部署一次性讲清楚,全程干货、可直接照着实操,帮你快速从入门到搭建可用集群。


kubernetes启动过程

先启动systemd >docker > cri-docker > kubelet > 整体的kubernetes集群组件的pod启动 > k8s启动

pod组成

一、Pod 是什么?

Pod 是 Kubernetes 中最小的可部署单元。

它代表 一个或多个紧密关联的容器(Containers),这些容器:

  • 共享同一个 网络(IP、端口空间)
  • 共享同一个 存储卷(Volumes)
  • 同一个调度单元 一起运行在同一个 Node 上

你可以理解为:

Pod 就像一台"迷你虚拟机",里面跑着一个或多个容器,它们共享这台小机子的网络和存储环境。


二、Pod 的组成结构

一个 Pod 通常包含以下几个主要部分

|----------------------------------|-----------------------------------|------------------------------------|
| 组成部分 | 作用 | 示例 |
| 1. 一个或多个容器(Containers) | 实际运行应用的地方,例如 Nginx、MySQL、Redis 等。 | 主容器、辅助容器 |
| 2. 存储卷(Volumes) | 提供持久化或共享数据存储。 | 挂载 ConfigMap、Secret 或 PV |
| 3. 网络命名空间(Network Namespace) | Pod 内所有容器共享同一个 IP、端口空间、lo 回环接口。 | localhost 互通 |
| 4. Pod Metadata(元数据) | 记录 Pod 的名称、标签、注解、命名空间等信息。 | metadata.namemetadata.labels |
| 5. Pod Spec(规范) | 描述 Pod 中运行的容器定义、卷、端口等。 | spec.containers |
| 6. Init Containers(初始化容器) | Pod 启动前运行的准备性任务。 | 初始化配置、检查依赖 |
| 7. Sidecar 容器(边车容器) | 附加功能容器,如日志收集、代理。 | Promtail、Istio proxy |


三、Pod 内部结构图(示意)

复制代码
+-------------------------------------------------+
|                   Pod (共享网络/IP)              |
|-------------------------------------------------|
|  容器A(主容器)    |  容器B(Sidecar容器)        |
|  nginx              |  日志收集器、代理程序       |
|  共享:             |                            |
|   - 网络命名空间    |                             |
|   - 存储卷 volume   |                             |
|---------------------------------------------- ---|
|  存储卷:/data, /config                           |
+-------------------------------------------------+

每个 Pod:

  • 一个独立的 IP 地址
  • Pod 内多个容器通过 localhost 通信;
  • Pod 外通信通过 Service 访问。

四、为什么要设计成 Pod(而不是直接运行容器)?

如果直接使用 Docker,一个容器只能运行一个应用进程。

但在很多场景下,我们需要多个进程配合运行,比如:

|-------|-------|----------------|
| 场景 | 主容器 | 辅助容器(Sidecar) |
| 日志收集 | Nginx | Fluentd(日志发送) |
| 服务代理 | 应用服务 | Envoy(代理) |
| 初始化任务 | 应用服务 | Init 容器(初始化配置) |

所以 Kubernetes 设计了 Pod 来将这些容器绑在一起,形成一个完整的工作单元。


五、Pod 示例文件(YAML)

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80
    - name: sidecar-logger
      image: busybox
      command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
  volumes:
    - name: log-volume
      emptyDir: {}

📌 解释:

  • nginx-container 是主容器,提供 Web 服务;
  • sidecar-logger 是边车容器,负责实时查看日志;
  • emptyDir 是一个共享卷,两个容器都可以访问。

六、Pod 的生命周期(Lifecycle)

Pod 的常见状态:

|-----------|-------------------|
| 状态 | 含义 |
| Pending | Pod 已创建但容器还未全部启动 |
| Running | Pod 正在运行中 |
| Succeeded | Pod 任务成功结束(如 Job) |
| Failed | Pod 任务失败退出 |
| Unknown | 无法获取状态(节点通信问题) |


七、Pod 管理方式

在实际生产中,我们不会直接手动创建 Pod,而是通过更高级的控制器来管理:

|-------------------|--------------------|
| 控制器 | 功能 |
| Deployment | 管理无状态应用(自动滚动更新、回滚) |
| StatefulSet | 管理有状态应用(如数据库) |
| DaemonSet | 每个节点都运行一个 Pod |
| Job / CronJob | 运行一次性或定时任务 |

这些控制器会自动创建、监控、恢复 Pod。


小结

|--------------------------------------------------------|----|
| 名称 | 说明 |
| Pod 是 K8s 中的最小运行单位 | |
| 一个 Pod 可包含一个或多个容器 | |
| 共享网络、存储、生命周期 | |
| 由容器(containers)+ 卷(volumes)+ 元数据(metadata)+ 规范(spec)组成 | |
| 生产中通过 Deployment、StatefulSet 等控制器管理 | |

Pause特征

Pod内部第一个启动的容器

初始化网络栈

挂载需要的存储卷

挥手僵尸进程

其他容器特征

与Pause容器共享名字空间(Network,PID,IPC)

Kubernetes 入门基础知识讲解

一、Kubernetes 是什么?

Kubernetes(K8s) 是一个 容器编排系统,用于:

  • 自动部署(自动启动容器)
  • 自动扩缩容(根据负载调整容器数量)
  • 自动恢复(容器异常自动重启)
  • 服务发现与负载均衡(让容器能被访问)
  • 统一管理配置、存储与安全

👉 简单理解:

K8s 就像一个"集群操作系统",统一调度多台服务器,把容器当作"应用进程"来运行和管理。


二、Kubernetes 架构组成

K8s 由两大部分组成:

控制平面(Control Plane)

负责"管控全局"的大脑部分:

|-----------------------------|--------------------------|
| 组件 | 作用 |
| kube-apiserver | 所有命令的入口,提供 API 接口 |
| etcd | 分布式键值数据库,存储整个集群状态 |
| kube-scheduler | 调度器,决定 Pod 应该在哪个 Node 运行 |
| kube-controller-manager | 控制器,维持系统期望状态(比如副本数量) |

工作节点(Node)

负责"干活"的执行部分:

|-----------------------|-----------------------------|
| 组件 | 作用 |
| kubelet | 负责和 API Server 通信,创建/销毁 Pod |
| kube-proxy | 管理容器之间的网络转发和负载均衡 |
| Container Runtime | 容器运行时(Docker、containerd等) |


三、核心资源对象

K8s 中的每个功能都围绕这些资源展开👇

|------------------------|--------------------|---------------------------|
| 资源 | 说明 | 示例命令 |
| Pod | 最小运行单位(一个或多个容器) | kubectl get pods |
| ReplicaSet | 确保 Pod 数量始终满足要求 | kubectl get rs |
| Deployment | 管理应用版本、滚动更新 | kubectl get deploy |
| Service | 提供固定访问入口(IP + 端口) | kubectl get svc |
| Namespace | 逻辑隔离空间(类似文件夹) | kubectl get ns |
| ConfigMap / Secret | 管理应用配置与敏感信息 | kubectl get cm / secret |
| Ingress | HTTP/HTTPS 流量入口控制器 | kubectl get ingress |
| Volume / PVC | 数据持久化存储 | kubectl get pvc |


四、Pod 是什么?(最核心概念)

Pod 是 K8s 中 最小的调度单位,一个 Pod 里可以包含:

  • 一个容器(最常见)
  • 或多个容器(共享网络与存储)

Pod 的作用:

  • 把容器打包成逻辑单元
  • 提供稳定的网络标识(Pod IP)
  • 当 Pod 异常时,K8s 会自动重建它(即"自愈")

📘 示例命令:

复制代码
kubectl run nginx --image=nginx
kubectl get pods
kubectl describe pod nginx

五、Service:让 Pod 能被访问

Pod 的 IP 是临时的,每次重建都会变化。
Service 用来提供一个固定的访问入口。

Service 有三种常用类型:

|------------------|-------------|----------------------|
| 类型 | 说明 | 示例 |
| ClusterIP | 集群内访问(默认) | 内部服务调用 |
| NodePort | 集群外访问(暴露端口) | http://nodeIP:port |
| LoadBalancer | 云端自动负载均衡 | 需云服务支持 |

📘 示例:

复制代码
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc

六、Kubernetes 网络原理入门

在 K8s 中,每个 Pod 都有独立 IP ,Pod 之间可以直接通信。

这套网络是由 CNI(Container Network Interface)插件 提供的。

常见的网络插件有:

  • Flannel
  • Calico
  • Cilium
  • Weave Net

💡 什么是 Calico?

Calico 是最常用的 K8s 网络插件之一,提供:

  1. Pod 之间的网络通信
  2. 网络策略(NetworkPolicy)控制安全访问
  3. 支持多种网络模式(IPIP、VXLAN、BGP)

💡 那什么是 VXLAN?

VXLAN(Virtual eXtensible LAN)是一种 虚拟局域网封装技术

简单来说:

VXLAN 会把二层数据包(例如 Pod 网络)封装在三层 UDP 中传输,让不同主机上的 Pod 像在一个局域网中一样通信。


💡 Calico VXLAN 模式

Calico VXLAN 就是 Calico + VXLAN 封装 的工作模式。

工作原理:

  • 每个 Node 上的 Pod 都有独立的虚拟子网(CIDR)
  • 当 Pod A(Node1)访问 Pod B(Node2)时:
    • Calico 把数据包封装成 VXLAN
    • 通过宿主机网络(Node IP)发送
    • 对端 Calico 解封装,还原为原始 Pod 包
  • 对 Pod 来说,它们像在同一个局域网中

📘 优点:

  • 不依赖物理网络配置
  • 各 Node 之间自动通信
  • 适合本地实验、虚拟机环境(如 VMware)

📘 可通过命令查看 VXLAN Tunnel:

复制代码
ip link show type vxlan

七、YAML 配置文件

K8s 所有资源都可以用 YAML 文件定义。

格式清晰、可版本管理。

例:Deployment 示例

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

部署命令:

复制代码
kubectl apply -f nginx-deploy.yaml

八、命令行常用命令总结

|--------|---------------------------------------|
| 分类 | 常用命令 |
| 查看资源 | kubectl get pods,svc,deploy |
| 详细信息 | kubectl describe pod <name> |
| 日志排错 | kubectl logs <pod> |
| 进入容器 | kubectl exec -it <pod> -- /bin/bash |
| 应用YAML | kubectl apply -f file.yaml |
| 删除资源 | kubectl delete -f file.yaml |


安装方式

kubeadm

组件通过容器化方式运行

优势:简单,自愈

缺点:掩盖一些细节

一主两从

M 1

CPU >= 2

MEM内存 >= 4

NIC 网卡>= 1

DISK 磁盘空间= 100GB

N 2

CPU >= 1

MEM >= 1GB

NIC >= 1

DISK = 100GB

二进制安装

组件变成系统进程的方式运行

优势:能够更灵活的安装处集群

缺点:难

Linux > docker > cri-docker > kubelet > AS\CM\SCH

docker run --restart=always

从节点克隆选择

一、克隆节点的最佳时机(黄金时刻)

最推荐的克隆时机:

在主节点安装完基础运行环境(系统 + Docker/containerd + kubeadm/kubelet/kubectl + 网络配置)

还没有执行 kubeadm init 之前!

也就是:

「安装好 K8s 环境依赖」 ➜ 「未初始化集群 」 ➜ 此时克隆最完美


理由分析

|------------------|------------------------------------------------|-------------|
| 阶段 | 克隆后会发生的问题 | 是否推荐 |
| 克隆前未装K8s环境 | 每个节点都要重新安装所有依赖(Docker、kubelet、kubeadm、kubectl) | ❌ 太麻烦 |
| 克隆后再init(推荐) | 每个节点环境一致、干净,机器 ID 不冲突 | ✅ 最理想 |
| 克隆后已init的主节点 | 所有克隆节点会带上相同集群配置、CA证书、etcd数据、machine-id,加入集群时冲突 | ⚠️ 容易出错,不推荐 |


二、推荐操作流程(实战顺序)

下面是最稳妥、通用的流程👇


步骤 1:在主节点安装系统并更新环境

复制代码
# 设置主机名
hostnamectl set-hostname k8s-01

# 更新系统
yum update -y

# 设置时区和时间同步
timedatectl set-timezone Asia/Shanghai
yum install -y chrony
systemctl enable --now chronyd

步骤 2:配置网络与 hosts

复制代码
cat >> /etc/hosts <<EOF
192.168.163.90 k8s-01
192.168.163.91 k8s-02
192.168.163.92 k8s-03
EOF

步骤 3:安装容器运行时(推荐 containerd 或 Docker)

以 containerd 为例:

复制代码
yum install -y containerd
systemctl enable --now containerd

或者 Docker:

复制代码
yum install -y docker
systemctl enable --now docker

步骤 4:关闭防火墙和 swap

复制代码
systemctl disable --now firewalld
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

步骤 5:安装 kubeadm、kubelet、kubectl

复制代码
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF

yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

【此时停止!不要执行 kubeadm init】

💡 到这一步为止:

  • 系统、网络、Docker/containerd、K8s 环境都装好了;
  • 但还没有初始化集群;
  • 所以还 没有生成任何集群证书、machine-id、etcd 数据

👉 现在正是 克隆 Node 节点的黄金时刻!


接下来执行前,请逐项确认以下环境检查表:

|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------|
| 检查项 | 命令或验证方式 | 要求 |
| 关闭防火墙 | systemctl disable --now firewalld | inactive (dead) |
| 关闭swap | swapoff -a && sed -ri '/swap/s/^/#/' /etc/fstab | free -h 中 swap=0 |
| 启用 br_netfilter 模块 | `modprobe br_netfilter && lsmod | grep br_netfilter` |
| sysctl 参数设置 | /etc/sysctl.d/k8s.conf 文件中需有: \nnet.bridge.bridge-nf-call-iptables=1\nnet.ipv4.ip_forward=1\nnet.bridge.bridge-nf-call-ip6tables=1\n 执行 sysctl --system | 三项为1 |
| Docker 与 cri-dockerd 运行中 | systemctl status docker cri-docker | 均为 active |
| 主机名正确 | hostnamectl set-hostname k8s-01 | 名称明确 |
| 时间同步 | timedatectl status | 时间准确、NTP启用 |
| 网络配置正确 | cat /etc/sysconfig/network-scripts/ifcfg-ens33 | IP、网关正确、DNS可用 |

三、克隆节点操作步骤(VMware中)

1️⃣ 关闭主节点虚拟机

2️⃣ 在 VMware 中右键 → 克隆(Clone)

3️⃣ 选择:

  • 克隆整个虚拟机
  • 创建完整副本(不要链接克隆)
    4️⃣ 克隆两份,命名为:
    • k8s-02

    • k8s-03
      5️⃣ 启动后分别修改:

      hostnamectl set-hostname k8s-02
      vim /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改IP

6️⃣ 执行清理机器ID命令:

复制代码
rm -f /etc/machine-id /var/lib/dbus/machine-id
systemd-machine-id-setup

四、克隆完成后再初始化主节点

回到主节点执行:

复制代码
kubeadm init \
--apiserver-advertise-address=192.168.163.90 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.26.0 \
--service-cidr=10.10.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all \
--cri-socket unix:///var/run/cri-dockerd.sock

初始化成功后复制 join 命令:

复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

五、在两个 Node 节点上执行 join 命令

复制代码
kubeadm join 192.168.163.90:6443 --token ty8jm5.ljtxjumoths15o0v \
--discovery-token-ca-cert-hash sha256:bdfff1178fccd3e4504494c1181720604d4579668ee4a64c84ca8a3d224185ff \
--cri-socket unix:///var/run/cri-dockerd.sock
复制代码
[root@k8s-03 ~]# kubeadm join 192.168.163.90:6443 --token ty8jm5.ljtxjumoths15o0v \
> --discovery-token-ca-cert-hash sha256:bdfff1178fccd3e4504494c1181720604d4579668ee4a64c84ca8a3d224185ff \
> --cri-socket unix:///var/run/cri-dockerd.sock
[preflight] Running pre-flight checks
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

#此节点已加入集群:
#证书签名请求已发送到apiserver并收到响应。
#Kubelet被告知新的安全连接细节。
#在控制平面上运行"kubectl get node"以查看此节点加入集群。

验证:

复制代码
kubectl get nodes

结果:

复制代码
[root@k8s-01 ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
k8s-01   NotReady   control-plane   19m     v1.26.0
k8s-02   NotReady   <none>          6m31s   v1.26.0
k8s-03   NotReady   <none>          105s    v1.26.0

🎉 集群组建成功!

查看核心组件运行情况

复制代码
kubectl get pods -n kube-system

总结口诀

💡「init 之前克隆,join 之后验证」

|-------------------|--------|--------------------|
| 时机 | 是否适合克隆 | 说明 |
| 安装完 K8s 环境、未 init | ✅ 强烈推荐 | 环境一致、无冲突 |
| 已执行 kubeadm init | ❌ 不推荐 | 会导致 Node 无法正常 join |
| 完全空白系统 | ✅ 可行 | 但安装步骤重复、慢 |

安装网络插件

导入calico模块,通过docker load -i命令, 将从本地文件导入镜像

截取当前所有pod信息

复制代码
[root@k8s-01 calico]# kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-cf895cc9c-xqmsb   1/1     Running   0          24m
kube-system   calico-node-9b6pm                         1/1     Running   0          24m
kube-system   calico-node-khwtr                         1/1     Running   0          24m
kube-system   calico-node-pwdxn                         1/1     Running   0          24m
kube-system   calico-typha-7c44676c7f-bb5sk             1/1     Running   0          24m
kube-system   coredns-5bbd96d687-5bk4g                  1/1     Running   0          72m
kube-system   coredns-5bbd96d687-sm77k                  1/1     Running   0          72m
kube-system   etcd-k8s-01                               1/1     Running   0          72m
kube-system   kube-apiserver-k8s-01                     1/1     Running   0          72m
kube-system   kube-controller-manager-k8s-01            1/1     Running   0          72m
kube-system   kube-proxy-896cn                          1/1     Running   0          54m
kube-system   kube-proxy-8gvkw                          1/1     Running   0          72m
kube-system   kube-proxy-b2kz6                          1/1     Running   0          59m
kube-system   kube-scheduler-k8s-01                     1/1     Running   0          72m

/etc/kubernetes/pki  目录下存放证书   此证书默认只能使用一年
当前kubernetes组件之间的联通都是通过HTTPS协议实现,所以需要这么多证书
架构逐渐从B/S(浏览器/服务器)转向C/S(客户端/服务器)
[root@k8s-01 pki]# ls
apiserver.crt              apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub


[root@k8s-01 kubernetes]# ls
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf
admin文件是管理员文件,是集群部署的钥匙

[root@k8s-01 kubernetes]# cd /etc/kubernetes/manifests
[root@k8s-01 manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml
这些文件启动,构成集群的Master端
相关推荐
悠悠121381 小时前
生产环境救急指南:Linux服务器忘记密码的N种解法,覆盖主流系统和云厂商
linux·运维·服务器
倔强的石头1061 小时前
kingbase备份与恢复实战(六)—— 备份自动化与保留策略:Windows任务计划+日志追溯
运维·windows·自动化
bjzhang751 小时前
Linux曝出“核弹级”漏洞CVE-2026-31431:攻击者可瞬间提权
linux·漏洞·提权·cve-2026-31431
_李小白2 小时前
【android opencv学习笔记】Day 12: HSV 色彩空间
android·opencv·学习
枳实-叶2 小时前
【Linux驱动开发】第三天:上下文核心概念全解 —— 进程/中断上下文+切换开销+TLB刷新原理
linux·驱动开发
feng_you_ying_li2 小时前
linux之FILE和文件系统(磁盘的介绍)
linux·运维·服务器
followless2 小时前
linux server中搭建questasim 10.6c & ise14.7
linux·fpga开发
南斯拉夫的铁托2 小时前
YOLO学习笔记
笔记·学习·yolo
Bechamz2 小时前
大数据开发学习Day27
java·大数据·学习