Kubernetes(K8s)全面解析:核心概念、架构与实践

目录

[一、K8s 是什么?](#一、K8s 是什么?)

[二、K8s 的核心优势](#二、K8s 的核心优势)

[三、K8s 的核心概念](#三、K8s 的核心概念)

[1. Pod](#1. Pod)

[2. 控制器(Controller)](#2. 控制器(Controller))

[3. Service](#3. Service)

[4. 命名空间(Namespace)](#4. 命名空间(Namespace))

[5. 配置与存储](#5. 配置与存储)

[6. 标签与选择器(Label/Selector)](#6. 标签与选择器(Label/Selector))

[四、K8s 的架构设计](#四、K8s 的架构设计)

[1. 控制平面(Master 节点)](#1. 控制平面(Master 节点))

[2. 节点(Node 节点)](#2. 节点(Node 节点))

[五、K8s 的基本使用流程](#五、K8s 的基本使用流程)

[1. 环境部署](#1. 环境部署)

[2. 核心命令](#2. 核心命令)

(1)集群信息查看

[(2)资源操作(以 Deployment 为例)](#(2)资源操作(以 Deployment 为例))

[(3)Service 操作](#(3)Service 操作)

(4)配置与存储操作

[3. 资源清单(YAML 文件)](#3. 资源清单(YAML 文件))

[(1)Deployment 清单(nginx-deployment.yaml)](#(1)Deployment 清单(nginx-deployment.yaml))

[(2)Service 清单(nginx-service.yaml)](#(2)Service 清单(nginx-service.yaml))

[六、K8s 的核心功能实践](#六、K8s 的核心功能实践)

[1. 应用部署与扩缩容](#1. 应用部署与扩缩容)

[2. 滚动更新与回滚](#2. 滚动更新与回滚)

[3. 服务暴露与访问](#3. 服务暴露与访问)

[4. 数据持久化](#4. 数据持久化)

[七、K8s 的生态工具](#七、K8s 的生态工具)

八、总结


Kubernetes(简称 K8s)是 Google 开源的容器编排平台 ,旨在自动化容器的部署、扩展、运维和管理,是云原生生态的核心技术。它将零散的容器组织成高可用、可伸缩的应用集群,解决了大规模容器管理的复杂性问题。以下从核心概念、架构设计、核心功能、使用流程等维度,全面拆解 K8s。

一、K8s 是什么?

K8s 的名字源于希腊语 "舵手" 或 "飞行员",寓意为容器集群的 "导航系统"。其核心目标是:让容器化应用在集群中高效、可靠地运行,提供自动化的容器编排能力(如调度、伸缩、自愈、负载均衡)。

简单来说:如果 Docker 是 "集装箱"(封装应用),K8s 就是 "港口调度系统"(管理集装箱的装卸、运输、堆叠)。

二、K8s 的核心优势

  • 自动化运维:自动完成容器的部署、重启、扩缩容,减少人工干预。
  • 高可用性:节点或容器故障时自动调度到其他节点,保证服务不中断。
  • 弹性伸缩:根据 CPU 使用率、QPS 等指标自动增减容器数量。
  • 负载均衡:内置服务发现和负载均衡,实现容器间的通信与流量分发。
  • 滚动更新与回滚:无停机更新应用版本,更新失败时可快速回滚。
  • 跨环境兼容:支持公有云(AWS、Azure)、私有云、混合云,实现 "一次部署,到处运行"。

三、K8s 的核心概念

1. Pod

  • 定义:K8s 的最小部署单元,是一个或多个容器的组合(共享网络、存储)。
  • 特性
    • 容器共享 Pod 的 IP 和端口空间(Pod 内容器可通过localhost通信)。
    • 生命周期短暂(被调度到节点后,若节点故障或 Pod 被删除,不会重建,需通过控制器管理)。
    • 包含 "基础设施容器"(Pause 容器),用于维持 Pod 的网络命名空间。
  • 示例:一个 Web 应用 Pod 可能包含 "应用容器 + 日志收集容器"。

2. 控制器(Controller)

用于管理 Pod 的生命周期,确保 Pod 按期望状态运行。常见控制器:

  • Deployment:最常用的控制器,管理无状态应用,支持滚动更新、扩缩容、回滚。
  • StatefulSet:管理有状态应用(如数据库),保证 Pod 的名称、网络标识、存储的唯一性。
  • DaemonSet:在集群每个节点上运行一个 Pod 副本(如日志收集、监控 Agent)。
  • Job/CronJob:运行一次性任务(Job)或定时任务(CronJob)。

3. Service

  • 定义:为 Pod 提供稳定的网络访问入口,解决 Pod 动态 IP 变化的问题。
  • 类型
    • ClusterIP:默认类型,仅集群内部可访问(通过虚拟 IP)。
    • NodePort:在每个节点开放一个静态端口,外部可通过 "节点 IP + 端口" 访问。
    • LoadBalancer:结合云服务商的负载均衡器,对外暴露服务(公有云常用)。
    • Ingress:非 Service 类型,通过 Ingress Controller 实现 HTTP/HTTPS 路由(如域名转发)。

4. 命名空间(Namespace)

  • 定义:用于隔离集群资源(如 Pod、Service、Deployment),实现多租户管理。
  • 默认命名空间
    • default:未指定命名空间的资源默认放在这里。
    • kube-system:K8s 系统组件所在的命名空间。
    • kube-public:公共资源命名空间(所有用户可读)。

5. 配置与存储

  • ConfigMap:存储非敏感配置数据(如环境变量、配置文件),可挂载到 Pod 中。
  • Secret:存储敏感数据(如密码、Token、证书),数据会被 Base64 编码(需加密增强安全性)。
  • Volume:Pod 的持久化存储,支持多种存储类型(如本地存储、NFS、云存储)。
  • PersistentVolume(PV)/PersistentVolumeClaim(PVC):PV 是集群的存储资源,PVC 是 Pod 对存储的申请(类似 "存储租赁")。

6. 标签与选择器(Label/Selector)

  • 标签 :键值对形式的元数据(如app=nginxenv=prod),用于标识资源。
  • 选择器 :通过标签筛选资源(如 Deployment 通过selector匹配 Pod 标签),实现资源关联。

四、K8s 的架构设计

K8s 采用主从架构(Master-Node),分为控制平面(Control Plane)和节点(Node)两部分。

1. 控制平面(Master 节点)

负责集群的全局决策(调度、管理),包含以下核心组件:

  • kube-apiserver:集群的统一入口,所有操作通过 API Server 执行(RESTful API),提供认证、授权、准入控制。
  • etcd:集群的数据库,存储所有集群状态数据(配置、元数据),需保证高可用。
  • kube-scheduler:负责 Pod 的调度(将 Pod 分配到合适的 Node 节点),基于资源需求、节点亲和性等策略。
  • kube-controller-manager:包含多种控制器(节点控制器、副本控制器、Service 控制器等),维护集群状态。
  • cloud-controller-manager:与云服务商集成的控制器(可选),管理云资源(如负载均衡器、云存储)。

2. 节点(Node 节点)

负责运行容器化应用,包含以下核心组件:

  • kubelet:Node 节点的代理,与 API Server 通信,管理 Pod 的生命周期(启动、停止容器),确保 Pod 按期望运行。
  • kube-proxy:维护 Node 节点的网络规则,实现 Service 的负载均衡(转发流量到 Pod)。
  • 容器运行时(Container Runtime):运行容器的软件,如 containerd、CRI-O(早期用 Docker,需通过 cri-dockerd 适配)。
  • 容器网络接口(CNI):实现 Pod 间的网络通信(如 Flannel、Calico、Cilium)。

五、K8s 的基本使用流程

1. 环境部署

K8s 的部署方式有多种,适合不同场景:

  • Minikube :单机版 K8s,适合开发测试(minikube start一键启动)。
  • kubeadm:官方工具,用于部署生产级集群(需多台服务器)。
  • 云服务商托管 K8s:如 AWS EKS、Azure AKS、阿里云 ACK(无需手动维护控制平面)。

2. 核心命令

K8s 的命令行工具是kubectl,常用命令如下:

(1)集群信息查看

bash

运行

复制代码
# 查看集群节点
kubectl get nodes

# 查看集群信息
kubectl cluster-info

# 查看命名空间
kubectl get namespaces
(2)资源操作(以 Deployment 为例)

bash

运行

复制代码
# 创建Deployment(从YAML文件)
kubectl apply -f nginx-deployment.yaml

# 查看Deployment
kubectl get deployments

# 查看Pod
kubectl get pods

# 查看Pod详情
kubectl describe pod <pod-name>

# 查看Pod日志
kubectl logs <pod-name>

# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash

# 扩缩容Deployment
kubectl scale deployment nginx-deployment --replicas=5

# 删除Deployment
kubectl delete deployment nginx-deployment
(3)Service 操作

bash

运行

复制代码
# 创建Service
kubectl apply -f nginx-service.yaml

# 查看Service
kubectl get services

# 查看Service详情
kubectl describe service nginx-service
(4)配置与存储操作

bash

运行

复制代码
# 创建ConfigMap
kubectl create configmap app-config --from-literal=env=prod --from-file=app.conf

# 创建Secret
kubectl create secret generic db-secret --from-literal=username=root --from-literal=password=123456

# 查看ConfigMap/Secret
kubectl get configmaps
kubectl get secrets

3. 资源清单(YAML 文件)

K8s 通过 YAML 文件定义资源(声明式 API),以下是一个完整的 Deployment+Service 示例:

(1)Deployment 清单(nginx-deployment.yaml)

yaml

复制代码
apiVersion: apps/v1  # API版本(不同资源版本不同)
kind: Deployment     # 资源类型
metadata:
  name: nginx-deployment  # 资源名称
  namespace: default      # 命名空间
spec:
  replicas: 3  # 副本数
  selector:
    matchLabels:
      app: nginx  # 匹配Pod标签
  template:
    metadata:
      labels:
        app: nginx  # Pod标签
    spec:
      containers:
      - name: nginx  # 容器名称
        image: nginx:1.25  # 容器镜像
        ports:
        - containerPort: 80  # 容器端口
        resources:  # 资源限制
          limits:
            cpu: "1"
            memory: "1Gi"
          requests:
            cpu: "0.5"
            memory: "512Mi"
        env:  # 环境变量(从ConfigMap/Secret注入)
        - name: ENV
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: env
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
(2)Service 清单(nginx-service.yaml)

yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort  # Service类型
  selector:
    app: nginx  # 匹配Pod标签
  ports:
  - port: 80        # Service端口
    targetPort: 80  # Pod端口
    nodePort: 30080 # 节点端口(范围30000-32767)

六、K8s 的核心功能实践

1. 应用部署与扩缩容

  • 部署应用kubectl apply -f nginx-deployment.yaml

  • 手动扩缩容kubectl scale deployment nginx-deployment --replicas=5

  • 自动扩缩容 :通过 HPA(Horizontal Pod Autoscaler)基于 CPU 使用率自动扩缩容:

    bash

    运行

    复制代码
    kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50

2. 滚动更新与回滚

  • 更新镜像版本

    bash

    运行

    复制代码
    kubectl set image deployment/nginx-deployment nginx=nginx:1.26
  • 查看更新状态kubectl rollout status deployment/nginx-deployment

  • 回滚到上一版本kubectl rollout undo deployment/nginx-deployment

3. 服务暴露与访问

  • NodePort 访问 :通过节点IP:30080访问服务。

  • Ingress 访问 :配置 Ingress 实现域名访问(需先部署 Ingress Controller,如 Nginx Ingress):

    yaml

    复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
    spec:
      rules:
      - host: nginx.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 80

4. 数据持久化

通过 PV/PVC 实现 Pod 数据持久化:

yaml

复制代码
# PV清单
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/nginx-pv  # 本地存储路径

# PVC清单
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

# Deployment挂载PVC
spec:
  containers:
  - name: nginx
    volumeMounts:
    - name: nginx-storage
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nginx-storage
    persistentVolumeClaim:
      claimName: nginx-pvc

七、K8s 的生态工具

  • 监控与日志:Prometheus(监控)+ Grafana(可视化)、ELK Stack(日志收集分析)、Loki(轻量级日志系统)。
  • 服务网格:Istio(流量管理、安全、可观测性)、Linkerd(轻量级服务网格)。
  • CI/CD 集成:Jenkins、GitLab CI、ArgoCD(GitOps 工具)。
  • 容器镜像仓库:Harbor(私有仓库)、Docker Hub(公有仓库)。
  • 集群管理工具:KubeSphere(可视化管理平台)、Rancher(多集群管理)。

八、总结

Kubernetes 是容器编排领域的事实标准,通过抽象化的资源定义和自动化的管理能力,解决了大规模容器集群的运维复杂性。掌握 K8s 的核心概念(Pod、Deployment、Service)、架构设计和实践操作,是云原生开发和运维的必备技能。后续可深入学习 K8s 的高级特性(如调度策略、安全机制、集群联邦),以及云原生生态的其他技术(如 Service Mesh、Serverless)。

相关推荐
boboo_2000_01 小时前
基于SpringBoot+Langchain4j的AI机票预订系统
spring cloud·微服务·云原生·langchain
Radan小哥2 小时前
Docker学习笔记—day011
笔记·学习·docker
Zhijun.li@Studio3 小时前
【Docker实战】在容器内配置 SSH 服务:安装、Vim配置与连接验证(保姆级教程)
docker·ssh·vim
了一梨3 小时前
使用Docker配置适配泰山派的交叉编译环境
linux·docker
拾忆,想起4 小时前
Dubbo配置方式大全:七种配置任你选,轻松玩转微服务!
服务器·网络·网络协议·微服务·云原生·架构·dubbo
ん贤4 小时前
高可靠微服务消息设计:Outbox模式、延迟队列与Watermill集成实践
redis·微服务·云原生·架构·消息队列·go·分布式系统
White-Legend5 小时前
支持docker一键部署了
运维·docker·容器
The star"'5 小时前
docker(6-10)
docker·容器·eureka