kubernetes(k8s)基础理论与集群部署

**摘要:**本文系统讲解 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 核心概念

  1. Pod是kubernetes里的最小封装集合,最小管理单位,一个pod内部可以封装一个或多个容器。
  2. 同一个Pod内所有容器共享资源:共享IP、主机名、存储设备、网络命名空间。
  3. 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

参数注解:

  1. --apiserver-advertise-address:master对外广播IP,必须填这台虚拟机真实网卡 IP,后面node节点通过该IP找到主服务器、加入集群
  2. --image-repository:阿里云镜像仓库,解决国内镜像拉取失败
  3. --kubernetes-version:指定集群版本,master/node版本必须完全一致
  4. --service-cidr=10.96.0.0/12:
  5. --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:理论部分的图片源自于网络博主,少许本人加工编辑!!!

相关推荐
Cicada1284 小时前
定时任务方案选择指南:crontab、K8s CronJob、Airflow、XXL-JOB
云原生·容器·kubernetes
猫吃了源码5 小时前
Ubuntu24系统安装部署最新版K8s(Kubernetes)1.36保姆级详细教程
云原生·容器·kubernetes
深念Y5 小时前
Makefile vs go run:Go 项目构建方式对比
java·开发语言·golang·k8s·编译·流水线·cicd
秋风点枝6 小时前
第二篇:安装 Argo CD + 第一次部署应用
kubernetes·github·argocd
AKCJDJ18 小时前
k8s的管理及控制器管理
云原生·容器·kubernetes
SCandL15218 小时前
k8s service
linux·容器·kubernetes
众人皆醒我独醉20 小时前
InferenceGraph:把多个推理服务编排成 DAG
面试·kubernetes·gpu
众人皆醒我独醉20 小时前
LLMService:KServe 面向 LLM 的下一步
面试·kubernetes·gpu
niyesd1 天前
Kubernetes Pod 管理
云原生·容器·kubernetes