容器编排技术已成为现代应用部署的核心支撑,而Kubernetes(K8s)凭借其强大的自动化、高可用与扩展性,成为容器编排的事实标准。
本文从Kubernetes核心架构出发,详解从单节点集群搭建到生产级应用部署的全流程,重点聚焦Nginx基础部署与Redis集群的容器化实践,结合完整配置代码与架构图表,为开发者提供一套可直接落地的生产级部署方案。
一、Kubernetes核心架构:理解集群的"五脏六腑"
Kubernetes的本质是一个分布式容器编排平台,通过一系列核心组件实现对容器的生命周期管理、资源调度与服务发现。要掌握应用部署,首先需理解其底层架构与核心概念。
1.1 集群角色与核心组件
Kubernetes集群由两类节点组成:Master节点(控制平面)与Worker节点(工作节点),其组件分工如图1所示:
graph TD
subgraph Master节点(控制平面)
A[API Server] --> B[etcd]
A --> C[调度器(Scheduler)]
A --> D[控制器管理器(Controller Manager)]
end
subgraph Worker节点(工作节点)
E[kubelet] --> F[容器运行时(containerd)]
E --> G[Pod(容器组)]
H[kube-proxy] --> I[Service(服务发现)]
end
A <--> E[通信]
A <--> H[通信]
图1:Kubernetes集群核心组件架构图
节点类型 | 核心组件 | 功能说明 |
---|---|---|
Master节点 | API Server | 集群"网关":接收所有操作请求(如部署应用、查询状态),提供RESTful API |
etcd | 集群"数据库":存储集群所有状态数据(如Pod配置、服务信息),强一致性存储 | |
调度器(Scheduler) | 资源"调度员":根据节点资源(CPU/内存)与Pod需求,自动选择最佳Worker节点 | |
控制器管理器 | 状态"守护者":确保集群实际状态与期望状态一致(如Pod故障时自动重启) | |
Worker节点 | kubelet | 节点"管理员":接收Master指令,管理本节点Pod的生命周期(创建/启动/停止) |
容器运行时(containerd) | 容器"引擎":负责拉取镜像、创建容器,K8s v1.20+默认替代Docker | |
kube-proxy | 网络"路由器":维护节点网络规则,实现Service的负载均衡与Pod访问转发 |
1.2 核心概念:K8s部署的"基础词汇"
理解Kubernetes的核心概念是编写部署配置的前提,以下是应用部署中最常用的术语:
-
Pod:K8s的最小部署单元,由一个或多个紧密关联的容器组成(如Redis容器+监控容器),共享网络与存储。
特点:Pod是临时的,故障后会被重建,因此需通过上层控制器(如Deployment)管理。 -
Deployment:无状态应用的核心控制器,用于管理Pod的创建、扩缩容与滚动更新。
核心功能:维持指定数量的Pod副本(replicas
),Pod故障时自动重建,支持灰度更新(如更新镜像时逐步替换旧Pod)。 -
StatefulSet:有状态应用的专用控制器(如Redis、数据库),与Deployment的关键区别在于:
- 为Pod提供稳定的网络标识(固定名称与DNS),如
redis-0
、redis-1
; - 支持有序部署/扩缩容(先启动主节点,再启动从节点);
- 每个Pod绑定独立的持久化存储(PV/PVC),数据不随Pod重建丢失。
- 为Pod提供稳定的网络标识(固定名称与DNS),如
-
Service:Pod的网络访问抽象,解决PodIP动态变化的问题,提供稳定的访问端点。
核心类型:ClusterIP
:仅集群内访问(默认);NodePort
:通过节点固定端口暴露服务(如30007
),支持外部访问;LoadBalancer
:借助云厂商负载均衡器暴露服务(适合生产环境);Headless Service
(无头服务):clusterIP: None
,直接返回PodIP,适合有状态应用的点对点通信(如Redis Cluster节点发现)。
-
PersistentVolume (PV) & PersistentVolumeClaim (PVC):
- PV:集群级别的持久化存储资源(如磁盘、云存储),由管理员预先创建;
- PVC:Pod对存储资源的请求声明,类似"存储订单",K8s自动匹配符合条件的PV。
作用:为有状态应用(如Redis)提供稳定存储,确保Pod重建后数据不丢失。
二、单节点Kubernetes集群极速搭建
在开始部署应用前,需先搭建Kubernetes集群。本节基于KubeKey工具实现单节点集群的一键安装,适合开发测试与小型生产环境。
2.1 环境准备与依赖安装
Kubernetes对宿主机环境有一定要求,需提前配置:
# 1. 关闭防火墙(生产环境可配置精细化规则)
sudo ufw disable # Ubuntu/Debian
# 或 CentOS:sudo systemctl stop firewalld && sudo systemctl disable firewalld
# 2. 禁用SELinux(避免权限拦截容器操作)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 3. 关闭Swap(K8s要求禁用虚拟内存,避免影响性能)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用
# 4. 安装依赖工具
sudo apt update && sudo apt install -y socat conntrack ebtables ipset # Ubuntu/Debian
# 或 CentOS:sudo yum install -y socat conntrack-tools ebtables ipset
# 5. 配置内核参数(开启容器网络所需模块)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
2.2 基于KubeKey的一键安装
KubeKey是一款轻量的K8s安装工具,支持快速部署单节点或多节点集群,内置容器运行时(containerd),无需单独安装Docker:
# 1. 下载KubeKey(国内用户建议指定国内镜像源)
export KKZONE=cn # 使用国内镜像加速
curl -sfL https://get-kk.kubesphere.io | sh -
# 2. 赋予执行权限
chmod +x kk
# 3. 生成集群配置文件(默认版本v1.26.4,可按需修改)
./kk create config --with-kubernetes v1.26.4
# 4. 编辑配置文件(关键参数调整)
vi config-sample.yaml
# 需修改的核心配置:
# - hosts: 填写节点IP与SSH信息(单节点部署填写本机IP)
# - roleGroups: 确保master与worker节点均包含当前节点(单节点既是控制平面也是工作节点)
# - registry: 保留默认的国内镜像仓库(加速镜像拉取)
# 5. 一键部署集群(约10-15分钟,取决于网络速度)
./kk create cluster -f config-sample.yaml
# 6. 验证集群状态(出现"STATUS Ready"即为成功)
kubectl get nodes
# 输出示例:
# NAME STATUS ROLES AGE VERSION
# k8s-node1 Ready control-plane 10m v1.26.4
2.3 从Docker到Containerd的操作适配
Kubernetes v1.20+已弃用Docker作为容器运行时,改用containerd(更轻量、直接操作容器)。两者的镜像管理命令对比如表1所示:
操作场景 | Docker命令 | Containerd命令(crictl) | 说明 |
---|---|---|---|
拉取镜像 | docker pull nginx:latest |
crictl pull docker.1ms.run/nginx:latest |
国内镜像源需替换为docker.1ms.run |
查看本地镜像 | docker images |
crictl images |
输出格式略有差异,但核心信息一致 |
查看运行中容器 | docker ps |
crictl ps |
支持-a 查看所有容器(包括已停止) |
查看容器日志 | docker logs <容器ID> |
crictl logs <容器ID> |
支持-f 实时跟踪日志 |
进入容器终端 | docker exec -it <容器ID> sh |
crictl exec -it <容器ID> sh |
交互方式完全一致 |
删除容器 | docker rm <容器ID> |
crictl rm <容器ID> |
需先停止容器(crictl stop <容器ID> ) |
提示:若习惯Docker命令,可通过alias
简化操作:alias docker=crictl
(仅建议测试环境使用)。
三、基础应用部署:Nginx服务的容器化实践
Nginx作为经典的Web服务器,适合作为Kubernetes部署的入门案例。本节通过Deployment+Service实现Nginx的高可用部署,理解无状态应用的部署范式。
3.1 部署Nginx的核心资源配置
部署Nginx需定义两个核心资源:Deployment
(管理Pod生命周期)与Service
(暴露访问端点),完整配置如下:
(1)Deployment配置(nginx-deployment.yaml
)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # Deployment名称
labels:
app: nginx # 标签(用于关联Service)
spec:
replicas: 2 # 副本数(2个Pod实现高可用)