如果你刚接触容器编排,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.name 、metadata.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 网络插件之一,提供:
- Pod 之间的网络通信
- 网络策略(NetworkPolicy)控制安全访问
- 支持多种网络模式(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端