如果你刚接触容器编排,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 回环接口。 |
互通 |
|
4. Pod Metadata(元数据) |
记录 Pod 的名称、标签、注解、命名空间等信息。 |
、 |
|
5. Pod Spec(规范) |
描述 Pod 中运行的容器定义、卷、端口等。 |
|
|
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 |
最小运行单位(一个或多个容器) |
|
|
ReplicaSet |
确保 Pod 数量始终满足要求 |
|
|
Deployment |
管理应用版本、滚动更新 |
|
|
Service |
提供固定访问入口(IP + 端口) |
|
|
Namespace |
逻辑隔离空间(类似文件夹) |
|
|
ConfigMap / Secret |
管理应用配置与敏感信息 |
|
|
Ingress |
HTTP/HTTPS 流量入口控制器 |
|
|
Volume / 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 |
集群外访问(暴露端口) |
|
|
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
八、命令行常用命令总结
|
分类 |
常用命令 |
|
查看资源 |
|
|
详细信息 |
|
|
日志排错 |
|
|
进入容器 |
|
|
应用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 节点的黄金时刻!
接下来执行前,请逐项确认以下环境检查表:
|
检查项 |
命令或验证方式 |
要求 |
|
关闭防火墙 |
|
|
|
关闭swap |
|
中 swap=0 |
|
启用 br_netfilter 模块 |
`modprobe br_netfilter && lsmod |
grep br_netfilter` |
|
sysctl 参数设置 |
文件中需有:
|
三项为1 |
|
Docker 与 cri-dockerd 运行中 |
|
均为 active |
|
主机名正确 |
|
名称明确 |
|
时间同步 |
|
时间准确、NTP启用 |
|
网络配置正确 |
|
IP、网关正确、DNS可用 |
三、克隆节点操作步骤(VMware中)
1️⃣ 关闭主节点虚拟机
2️⃣ 在 VMware 中右键 → 克隆(Clone)
3️⃣ 选择:
- 克隆整个虚拟机
- 创建完整副本(不要链接克隆)
4️⃣ 克隆两份,命名为:
-
k8s-02k8s-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端

1807

被折叠的 条评论
为什么被折叠?



