一、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。
- 在 Master 节点上的特殊作用 :Master 节点上同样运行着 kubelet,其主要作用是监听
- kube-proxy:维护节点上的网络规则,实现 Kubernetes Service 的抽象,负责负载均衡和将流量转发到正确的 Pod。
- 容器运行时:负责运行容器的软件,如 Docker、containerd 等。
三、Kubernetes 部署方式
生产环境中部署 Kubernetes 主要有两种方式:
- kubeadm 部署 :这是官方推荐的简化部署工具。它通过一系列预定义的步骤(Phases)来初始化集群,最大程度地重用 Kubernetes 自身功能,让部署过程具有"原生"感。其优势是部署简单高效 ,适合快速搭建标准集群;劣势是定制化能力有限,虽然可以通过配置文件修改部分参数(例如指定 kube-apiserver 的启动参数),但整体灵活性不如二进制部署。
- 二进制部署 :手动下载各个组件的二进制文件,并逐一配置和启动。优势是可以高度定制化 ,每个组件的参数和运行方式均可完全由管理员控制;劣势是部署过程复杂、步骤繁琐,对运维人员要求较高。
四、集群管理工具
在部署和运维过程中,会用到三个核心命令行工具:
- 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 生产环境。