**摘要:**本文系统讲解 Kubernetes 的核心理论与集群部署实操。理论部分涵盖容器化演进、Master‑Node 集群架构、Pod 核心概念、正向与反向代理、有状态与无状态服务,以及 K8s 资源与对象体系(资源分类、资源清单五大顶级字段、API 详解与常用命令对照表);实操部分基于 CentOS7 与 k8s‑1.23.6,从修复 yum 源、关闭防火墙与 Swap、安装 Docker 与集群三件套等前置准备,到 kubeadm 初始化 Master、Worker 节点加入集群、部署 Flannel 网络插件,完整演示一套可复现的 K8s 集群搭建流程。
一、K8s 理论知识
(一)容器化基础及基础设施变革
在容器化技术里面,每一个运行的容器就是一个封装集合。 部署应用程序的方式,主要经历物理机 → 虚拟机 → 容器三个时代。
①传统部署(物理机):环境不隔离

②虚拟化部署(虚拟机):占用资源过多

③容器化部署(容器)

(二)集群架构 Master‑Node

-
一台 Linux 服务器就是 1 个 Node,可以是虚拟机、物理机、云服务器。
-
k8s‑master(控制平面)管控全部 node,所有业务负载全部跑在 node 之上。 -
层级关系:一台 Node 上可以有多个 Pod;一个 Pod 里面可以有多个容器
类比:pod = 豌豆荚;容器 = 豌豆
-
交互入口:所有节点依赖
api‑server来进行交互;kubectl命令调用 api‑server,再执行对应的集群操作。
(三)Pod 核心概念
- Pod是kubernetes里的最小封装集合,最小管理单位,一个pod内部可以封装一个或多个容器。
- 同一个Pod内所有容器共享资源:共享IP、主机名、存储设备、网络命名空间。
- Pause根容器:每个Pod都会自动生成一个Pause(基础设施)容器;依托pause容器共享网络命名空间,实现Pod内部容器通信。
net 命名空间 = 一套独立完整的网络环境
(四)Node、Pod、容器三者关系
- 物理服务器 / 虚拟机 = Node(工作节点)
- 一台 Node 上可以运行很多个 Pod
- 一个 Pod 内可以放置一个或多个业务容器
(五)正向代理 & 反向代理
反向代理(Nginx)
类比:小区门卫。
外面访客(客户端)只找门卫,门卫清楚每一户地址,帮忙把请求转给住户 (Java 商城服务)。
访客永远不知道住户真实房间号。
外面客户端只访问Nginx(中转)地址,Nginx将请求转发给后端服务;后端业务真实地址对外隐藏,起到保护后端程序的作用。
正向代理(VPN、上网代理)
类比:专属跑腿。
你(客户端)不能直接上网,你委托代理服务器,代替你去访问外网资源。
代替客户端去访问外网资源;外网服务器只能看见代理IP,看不到客户端本机IP。
总结:
- 正向代理:帮客户端访问外网
- 反向代理:帮后端服务接收外部请求
(六)有状态服务 / 无状态服务

- 无状态服务:重启服务时,不需要额外执行数据迁移、数据恢复操作。例如Nginx、Demo测试Pod。
- 有状态服务:重启服务时,需要迁移、恢复持久化数据。例如MySQL数据库。
(七)K8s 资源与对象
在k8s中,一切皆资源!!!
1、定义
pod、service、node等全部抽象为资源 ;对象就是资源持久化后的实例。
2、资源分类
①命名空间级资源(Namespace‑scoped)
资源只在某一个命名空间内生效、隔离。 必须指定 ‑n 命名空间名,才可以访问到它。
**常见资源:**Pod、Deployment、Service、ConfigMap、Secret、Ingress、StatefulSet、Job
示例命令:
kubectl get pods -n kube-system
kubectl get deploy -n default
②集群型资源(Cluster‑scoped 集群范围)
没有命名空间的概念,作用于整个K8s集群,所有节点、所有namespace都生效 **不能加 -n**参数。
**常见资源:**Node节点、PersistentVolume(PV)、ClusterRole、ClusterRoleBinding
示例命令:
kubectl get nodes
kubectl get pv
③元数据型资源(Metadata‑scoped,集群元数据)
最顶层,用来管控集群本身、命名空间对象。 Namespace本身就是元数据资源! 还有 CRD、APIService
大白话:就是小区规划文档,用来定义"小区"本身。
示例命令:
kubectl get namespaces
3、总结
| 类型 | 生效范围 | 能不能‑n指定命名空间 | 典型例子 |
|---|---|---|---|
| 命名空间级 | 仅当前namespace | ✅可以 | Pod、Deployment、Service |
| 集群型 | 整个集群所有namespace | ❌不可以 | Node、PV、ClusterRole |
| 元数据型 | 集群顶层,管理namespace对象 | ❌不可以 | Namespace、CRD |
4、资源清单
资源清单(Manifest)就是 YAML 配置文件,用来告诉K8s想要创建什么资源、长什么样子。
K8s是声明式管理:你写清单说明'想要什么样子',集群自动把实际状态调成想要的样子。
①五大顶级字段(必背)
apiVersion: apps/v1 #1.API版本
kind: Deployment #2.资源类型
metadata: #3.元数据
name: demo
namespace: default
labels:
app: demo
spec: #4.期望状态(自己写)
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: nginx
status: {} #5.实际状态(集群自动生成,不用写)
②apiVersion:API版本
告诉apiserver用哪一套规则解析这份文件
-
核心资源(Pod、Service、Namespace):
v1 -
工作负载(Deployment、StatefulSet):
apps/v1 -
查询命令:
kubectl api-resources
版本成熟度:alpha(测试) → beta(公测) → stable稳定版
③kind:资源类型(要创建什么)
- Pod、Deployment、Service、ConfigMap、Secret、Ingress、Node、PV
④metadata 元数据:资源的身份证信息
metadata:
name: demo‑deploy #名字,同命名空间内唯一
namespace: default #命名空间,集群资源不用写
labels: #标签,筛选资源用(键值对)
app: demo
annotations: #注解,附加描述信息,不用于筛选
author: "zhangsan"
标签(label):用来匹配;注解(annotation):纯备注
⑤spec 期望状态(最重要!)
手动写,自己定义希望资源变成什么配置 不同kind,spec里面内容完全不一样
- Pod:spec里面写容器镜像、端口、资源限制
- Deployment:spec里面写副本数replicas、Pod模板template
- Service:spec里面写端口、标签选择器selector
⑥status 实际状态
👉用户永远不要手动写这个字段! 由K8s集群自动填充、实时更新,记录当前资源真实运行状态(Pod Running/Error等)
5、实操命令
1.根据清单创建资源
kubectl apply -f demo.yaml
2.查看已经生成完整清单(包含status)
kubectl get deploy demo -o yaml
3.删除资源
kubectl delete -f demo.yaml
6、资源清单下发给集群的手段
①命令式
kubectl create deployment demo --image=nginx 直接执行动作,不保存配置文件
②声明式(资源清单yaml)
文件永久保存,可放到git版本管理,生产环境主流方式
7、最简Pod完整示例
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
8、对象两大核心属性
- spec(规约 / 期望状态):创建资源时手动填写,描述你希望资源最终变成什么样子,是必选字段。
- status(实际状态):由 Kubernetes 控制器自动维护;k8s不断调整资源,让实际状态无限趋近期望状态。
(八)K8s API 详解
1、API‑Server
集群唯一入口网关;kubectl、yaml部署、web控制台本质都是发送HTTP请求调用Api‑Server的REST‑API接口。
注意:etcd只存储集群数据,读写etcd必须经过Api‑Server,禁止直接访问etcd。
2、API 成熟度三阶段
①Alpha(v1alpha1):实验版本;随时修改删除,禁止生产使用
②Beta(v1beta1):公测版本;功能基本定型,不建议长期生产使用
③Stable(v1):稳定正式版;长期兼容,生产环境首选
生命周期路线:Alpha → Beta → Stable
3、API访问控制两道关卡(顺序固定)
①认证 Authentication(你是谁):校验访问者身份,证书、Token、账号密码;失败返回401拒绝访问。
②授权 Authorization(你可以干什么):校验账号权限;控制增删改查操作。
完整请求链路:
kubectl客户端 → Api‑Server → 认证 → 授权 → etcd读写集群数据
4、废弃API
老旧接口逐步淘汰:先标记告警,后续新版本彻底移除。
5、查询集群API资源命令
kubectl api-resources
(九)K8s资源名称与简写对照表
| 全称 | 简写别名 | 含义 | 查询示例 |
|---|---|---|---|
| pods | po | 最小运行单元,封装容器 | kubectl get po |
| deployments | deploy | 无状态控制器,管理Pod副本数量 | kubectl get deploy |
| services | svc | 服务负载均衡入口(NodePort/ClusterIP) | kubectl get svc |
| namespace | ns | 命名空间,项目环境隔离 | kubectl get ns |
| nodes | no | 集群服务器节点 | kubectl get no |
二、K8s 集群部署实操(CentOS7 + k8s‑1.23.6)
集群规划: master:192.168.193.140 node1:192.168.193.141 node2:192.168.193.142
(一)前置环境准备(master、node所有节点全部执行)
1、修复失效CentOS‑7 yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
2、关闭防火墙、SELinux、禁用Swap分区
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、主机域名解析(hosts)
cat >> /etc/hosts << EOF
192.168.193.140 k8s-master
192.168.193.141 k8s-node1
192.168.193.142 k8s-node2
EOF
4、开启内核网桥转发参数(k8s网络必备)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter
sysctl --system
5、安装Docker‑CE 20.10.24(适配k8s1.23)
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
systemctl daemon-reload
systemctl enable --now docker
docker -v
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
6、配置 Kubernetes 阿里云yum源
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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
7、安装集群三件套:kubelet、kubeadm、kubectl
①kubelet(节点代理)
运行在所有 master、node 节点上的核心服务。
负责跟 k8s 集群通信,管理本机上面的 Pod 容器,容器启停都由它管控,必须开机自启。
②kubeadm(集群部署工具)
集群初始化命令工具:kubeadm init初始化主节点,kubeadm join让 worker‑node 加入集群。只装它就能快速搭建 k8s,不用手动配置一堆证书。
③kubectl(集群命令行客户端)
k8s 的管理命令工具,集群的增删查改都靠它,例如 kubectl get pods。
一般只建议主节点安装,worker 节点可以不装!
yum clean all
yum makecache
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
8、时间同步chrony及重启
yum install chrony -y
systemctl enable --now chronyd
chronyc -a makestep
chronyc sources
date
reboot
(二)初始化并创建集群
步骤1:Master节点初始化集群(仅master执行)
kubeadm init \
--apiserver-advertise-address=192.168.193.140 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
参数注解:
--apiserver-advertise-address:master对外广播IP,必须填这台虚拟机真实网卡 IP,后面node节点通过该IP找到主服务器、加入集群--image-repository:阿里云镜像仓库,解决国内镜像拉取失败--kubernetes-version:指定集群版本,master/node版本必须完全一致--service-cidr=10.96.0.0/12:--pod-network-cidr:Pod网段,必须和flannel插件网段保持一致(10.244.0.0/16)
kubeadm init 开始初始化 K8s 控制节点,会自动下载、启动集群四大核心组件:kube‑apiserver(集群入口)、etcd(集群数据库)、kube‑controller‑manager、kube‑scheduler

步骤2:授权kubectl管理员权限(仅master)
mkdir -p $HOME/.kube
// 在当前 root 用户家目录,新建隐藏文件夹 .kube,用来存放 kubectl 连接集群的授权配置文件。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
// 把 k8s‑master 生成好的管理员证书文件,复制到上面新建的文夹。/etc/kubernetes/admin.conf 就是集群管理员权限凭证。
sudo chown $(id -u):$(id -g) $HOME/.kube/config
// 修改文件所有者,让当前用户有权读取这个配置文件。如果跳过这条,后面执行kubectl会报权限拒绝。
kubectl get nodes
// 验证命令,查看当前集群节点列表。
步骤3:Worker节点加入集群(node1、node2)
master节点上获取加入凭证
# master主机上运行:
查看当前集群所有可用的、且能让新主机node加入集群的令牌 (token)
[root@k8s-master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
hllut4.xn0fmq9jbgb6npp1 22h 2026-08-20T09:00:17Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
获取ca证书hash指纹
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
14324ae440b423f0d0a526798cc8a420b091b524b82374c2c8123bc4919a8f39
Token=临时通行证;sha256‑hash=master防伪指纹;二者缺一不可
node节点执行join命令加入集群
# node1主机上运行:
[root@k8s-node1 ~]# kubeadm join 192.168.193.140:6443 --token hllut4.xn0fmq9jbgb6npp1 --discovery-token-ca-cert-hash sha256:14324ae440b423f0d0a526798cc8a420b091b524b82374c2c8123bc4919a8f39
# master主机上运行查看加入节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 101m v1.23.6
k8s-node1 NotReady <none> 2m31s v1.23.6
步骤4:部署CNI网络插件 Flannel(master执行)
节点状态为NotReady就是缺少网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#查看flannel运行状态
kubectl get pods -n kube-flannel
#查看全部节点,状态Ready即集群就绪
kubectl get nodes
可选拓展:给node节点开通kubectl管理员权限
1、master传输证书文件
scp admin.conf root@k8s-node1:/etc/kubernetes
scp admin.conf root@k8s-node2:/etc/kubernetes
2、node节点配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
#验证
kubectl get nodes
PA:理论部分的图片源自于网络博主,少许本人加工编辑!!!
