Kubernetes (K8s) 基础知识、部署与运维指南

一、Kubernetes 概述与核心价值

Kubernetes(常简称为 K8s)是一款由 Google 设计并于 2014 年开源的容器编排平台,现已成为云原生计算基金会(CNCF)的核心项目,被广泛视为云原生技术栈的基石

。其核心价值在于解决了容器化应用的自动化部署、扩展和管理问题。容器技术通过虚拟化操作系统的方式封装应用及其依赖,实现了"应用标准化",而 Kubernetes 则像一套精密的调度系统,管理着这些标准化的"集装箱"。它支持包括 Docker 在内的一系列容器工具,提供了一个跨主机集群的、能够自动部署、扩展和运行应用程序容器的平台。有人将其看作是基于容器技术的"迷你-PaaS平台",因为它简化了开发、操作和管理,填补了传统 IaaS 与理想中成熟 PaaS 之间的空白。

二、Kubernetes 架构与核心组件

一个标准的 Kubernetes 集群由控制平面(Master 节点)和工作节点(Worker Nodes)组成。

1. Master 节点(控制平面)

Master 节点是集群的"大脑",负责集群的全局决策(如调度)以及资源对象的监控和响应。在生产环境中,通常不建议在 Master 节点上部署业务容器,以避免维护操作对业务造成影响

。其核心组件包括:

  • kube-apiserver :作为整个集群的控制中枢和唯一入口,它提供了集群各类资源对象(如 Pod、Service)的 RESTful API,供用户和集群内部组件进行增删改查操作。同时,它也是集群状态信息的存储中介,会将数据持久化到 etcd 中。
  • etcd:一个高可用的分布式键值数据库,用于持久化存储整个集群的配置和状态数据。
  • kube-scheduler:负责为新创建的 Pod 分配合适的工作节点。
  • kube-controller-manager:运行着多种控制器(Controller),这些控制器通过 apiserver 监听集群状态,并驱动集群实际状态向期望状态收敛。

2. Worker 节点(工作节点)

Worker 节点是容器实际运行的地方。每个节点上都必须运行以下核心组件:

  • kubelet :节点上的核心代理进程 ,是一个直接运行在主机操作系统上的守护进程(Daemon),而非运行在 Pod 中。它的核心职责是管理本节点上 Pod 的生命周期,包括 Pod 的创建、启动、监控和重启等。它通过 CRI(容器运行时接口)与容器运行时(如 Docker)交互,执行拉取镜像、创建容器等命令,并定期向 Master 节点的 API Server 报告节点资源使用情况和健康状况。
    • 在 Master 节点上的特殊作用 :Master 节点上同样运行着 kubelet,其主要作用是监听 /etc/kubernetes/manifests/ 目录下的 YAML 文件,并创建和管理控制平面组件(如 apiserver、scheduler 等)的静态 Pod。这些静态 Pod 的生命周期与 kubelet 绑定,只能通过操作宿主机上的 manifest 文件来管理。
    • 在 Worker 节点上的作用:监听来自 Master 节点 API Server 的指令,管理由用户创建的普通 Pod。
  • kube-proxy:维护节点上的网络规则,实现 Kubernetes Service 的抽象,负责负载均衡和将流量转发到正确的 Pod。
  • 容器运行时:负责运行容器的软件,如 Docker、containerd 等。

三、Kubernetes 部署方式

生产环境中部署 Kubernetes 主要有两种方式:

  1. kubeadm 部署 :这是官方推荐的简化部署工具。它通过一系列预定义的步骤(Phases)来初始化集群,最大程度地重用 Kubernetes 自身功能,让部署过程具有"原生"感。其优势是部署简单高效 ,适合快速搭建标准集群;劣势是定制化能力有限,虽然可以通过配置文件修改部分参数(例如指定 kube-apiserver 的启动参数),但整体灵活性不如二进制部署。
  2. 二进制部署 :手动下载各个组件的二进制文件,并逐一配置和启动。优势是可以高度定制化 ,每个组件的参数和运行方式均可完全由管理员控制;劣势是部署过程复杂、步骤繁琐,对运维人员要求较高。

四、集群管理工具

在部署和运维过程中,会用到三个核心命令行工具:

  • kubeadm:用于集群的初始化、节点加入和升级等生命周期管理。
  • kubectl :是用户与 Kubernetes 集群交互的主要命令行工具。所有对集群的操作指令,如创建资源、查看状态、排查问题,都通过 kubectl 发出,它最终与 kube-apiserver 进行通信。
  • kubelet:如前所述,是运行在每个节点上的守护进程,负责 Pod 的生命周期管理。

五、资源定义:YAML 配置文件

在 Kubernetes 中,几乎所有的资源对象(如 Pod、Deployment、Service)都通过声明式的 YAML 配置文件来创建和管理。这种方式相比命令式操作,具有可维护性高 (便于版本控制)、灵活性好(可定义复杂结构)和操作便捷的优点。

YAML 语法有严格规定:大小写敏感使用空格缩进表示层级关系 (禁止使用 Tab 键)、同一层级元素左对齐。一个 YAML 文件可以包含多个资源定义,用 --- 分隔。

以下是一个 Deployment 和 Service 的示例,包含了生产环境常用的配置项:

复制代码
# Deployment:用于管理Pod副本集,实现无状态应用的部署和滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  labels:
    app: example-app
    environment: production
spec:
  replicas: 3 # 期望的Pod副本数
  selector: # 标签选择器,用于匹配要管理的Pod
    matchLabels:
      app: example-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1 # 更新期间允许超出的Pod数
      maxUnavailable: 0 # 更新期间允许不可用的Pod数
  template: # Pod模板
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: main-container
        image: nginx:latest
        ports:
        - containerPort: 80
        resources: # 资源请求与限制,至关重要
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe: # 存活探针,检查容器是否健康
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe: # 就绪探针,检查容器是否可接收流量
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
---
# Service:为Pod提供稳定的网络访问入口和负载均衡
apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector: # 选择器,关联后端Pod
    app: example-app
  ports:
  - port: 80 # Service对外端口
    targetPort: 80 # Pod内部端口
    nodePort: 30080 # NodePort类型时,节点上映射的端口(范围30000-32767)
  type: NodePort # 服务类型:ClusterIP(默认)、NodePort、LoadBalancer

六、集群排查与调试常用指令

掌握高效的排查命令是运维 Kubernetes 的关键。kubectl 提供了丰富的诊断功能。

命令 / 技巧 功能描述 示例
查看资源状态
kubectl get pods 查看 Pod 列表及基本状态(Running, Pending, Error)。 kubectl get pods -n <namespace>
kubectl get events --sort-by=.metadata.creationTimestamp 按时间排序查看集群事件,快速定位异常(如调度失败、OOM)。 kubectl get events -n kube-system
深入诊断
kubectl describe pod <pod-name> 查看 Pod 的详细配置、状态、事件和历史,是排错第一步 kubectl describe pod my-pod
kubectl logs <pod-name> 查看 Pod 容器的标准输出日志。 kubectl logs my-pod -c <container-name>
kubectl logs -f <pod-name> 实时流式查看日志(Follow)。 kubectl logs -f my-pod
kubectl logs --previous 查看容器上次崩溃前的日志,对诊断 CrashLoopBackOff 特别有用。 kubectl logs my-pod --previous
交互式检查
kubectl exec -it <pod-name> -- /bin/sh 进入 Pod 容器内部,检查文件、进程或环境变量。 kubectl exec -it my-pod -- /bin/bash
资源监控
kubectl top pod 查看 Pod 的实时 CPU 和内存使用情况(需预先安装 Metrics Server)。 kubectl top pod -n <namespace>
kubectl top node 查看各 Node 的实时资源使用情况。 kubectl top node
高级诊断
kubectl get events --field-selector involvedObject.name=<pod-name> 查看与特定 Pod 相关的所有事件。 kubectl get events --field-selector involvedObject.name=my-pod

通过结合以上基础知识、部署实践、资源定义方法和排查工具,可以系统地构建、管理和维护一个健壮的 Kubernetes 生产环境。

相关推荐
礼拜天没时间.2 小时前
Docker基础操作——镜像与容器管理
linux·运维·服务器·docker·容器·centos
vx-bot5556662 小时前
企业微信接口在自动化运维与智能运维中的架构实践
运维·自动化·企业微信
阿常呓语2 小时前
ls 命令详解
linux·运维·服务器·ls
桌面运维家2 小时前
vDisk一键部署怎么应用?自动化脚本使用指南
运维·自动化
倔强的石头1062 小时前
【Linux指南】基础IO系列(一)Linux 文件本质揭秘 —— 从 “磁盘文件” 到 “一切皆文件”
linux·运维·服务器
robitmind2 小时前
操作input子系统,用模拟按键输入解锁ubuntu锁屏
linux·运维·ubuntu
Code小翊2 小时前
re标准库模块一天学完
运维·服务器·网络
Warren982 小时前
Allure 常用装饰器:实战用法 + 最佳实践(接口自动化)
运维·服务器·git·python·单元测试·自动化·pytest
2501_943695332 小时前
高职大数据运维与管理专业,怎么学习Hadoop的基础操作?
大数据·运维·学习