【DeepSeek实战】4、Kubernetes生产级部署:从Nginx到Redis集群的容器化实践

在这里插入图片描述

容器编排技术已成为现代应用部署的核心支撑,而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-0redis-1
    • 支持有序部署/扩缩容(先启动主节点,再启动从节点);
    • 每个Pod绑定独立的持久化存储(PV/PVC),数据不随Pod重建丢失。
  • 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实现高可用)