一、Kubernetes 是什么?

Kubernetes 是一个开源的容器编排平台,它的名字源于希腊语,意为"舵手"或"驾驶员"。K8s 这个缩写是因为 K 和 s 之间有 8 个字母。

简单来说,Kubernetes 就是管理容器的容器。如果你用过 Docker,那你就知道容器可以把应用及其依赖打包在一起,实现"一次构建,到处运行"。而 Kubernetes 则是在此之上,帮你管理这些容器的:

  • 生命周期:容器死了自动重启

  • 调度:把容器放到合适的机器上运行

  • 伸缩:流量大了自动多开几个容器

  • 网络:让容器之间可以互相发现和通信

  • 存储:为容器挂载持久化存储

二、为什么需要 Kubernetes?

容器化之后的新问题

假设你有一个电商应用,由用户服务、商品服务、订单服务、支付服务等十几个微服务组成,每个服务都打包成了 Docker 镜像并运行在容器中。

当你只有几个容器时,手动管理还行。但当你有成百上千个容器时,问题就来了:

  1. 容器挂了怎么办? 人工盯着然后手动重启?

  2. 流量突增怎么办? 半夜爬起来手动扩容?

  3. 新版本发布怎么搞? 逐个容器替换,还要保证服务不中断?

  4. 服务之间怎么找到对方? IP 是动态变化的,写死在配置里肯定不行?

  5. 资源怎么分配? 哪个容器该跑在哪台机器上才能最合理利用资源?

这些问题,就是 Kubernetes 要解决的。

Kubernetes 带来的价值

问题 Kubernetes 的解决方案
容器宕机 自动重启,保证期望副本数
流量高峰 自动水平伸缩(HPA)
版本发布 滚动更新,一键回滚
服务发现 内置 DNS,Service 抽象
资源利用 智能调度,提高集群利用率

三、Kubernetes 的核心概念

3.1 架构概览

一个 K8s 集群由两部分组成:

text

┌─────────────────────────────────────┐
│         控制平面 (Control Plane)      │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│  │API Server││Scheduler││Controller│ │
│  │         ││         ││ Manager  │ │
│  └─────────┘ └─────────┘ └─────────┘ │
│  ┌─────────────────────────────────┐ │
│  │              etcd                │ │
│  └─────────────────────────────────┘ │
└─────────────────────────────────────┘
                  │
    ┌─────────────┼─────────────┐
    ▼             ▼             ▼
┌─────────┐  ┌─────────┐  ┌─────────┐
│  Node 1 │  │  Node 2 │  │  Node 3 │
│kubelet  │  │kubelet  │  │kubelet  │
│kube-proxy│  │kube-proxy│  │kube-proxy│
│Pod  Pod │  │Pod  Pod │  │Pod  Pod │
└─────────┘  └─────────┘  └─────────┘
  • 控制平面:集群的大脑,做出全局决策

  • 工作节点:运行实际容器的地方

3.2 核心资源对象

Pod(豆荚)

Pod 是 K8s 中最小的部署单元,里面可以包含一个或多个容器。这些容器共享网络命名空间和存储卷,通常用于紧密耦合的服务(比如一个应用容器加一个日志采集容器)。

yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
Deployment(部署)

Deployment 是最常用的工作负载资源,它定义了 Pod 的期望状态(比如副本数、镜像版本等),然后由控制器来确保实际状态与期望状态一致。

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80
Service(服务)

Service 为一组 Pod 提供稳定的访问入口。因为 Pod 是动态创建和销毁的,IP 会变化,Service 通过标签选择器找到目标 Pod,并提供负载均衡。

yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP  # 其他类型:NodePort, LoadBalancer
ConfigMap 和 Secret

用于将配置信息与容器镜像解耦:

  • ConfigMap:存储非机密配置(如配置文件、环境变量)

  • Secret:存储敏感信息(如密码、密钥),用 Base64 编码并支持加密

yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database.url: "mysql://db-service:3306"
  log.level: "INFO"
Ingress(入口)

Ingress 管理外部访问集群服务的规则,可以理解为"7层负载均衡器",支持基于域名、路径的路由,以及 SSL 终止等功能。

yaml

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

四、Kubernetes 的工作原理

声明式 API

Kubernetes 最核心的设计哲学是声明式 API。你只需要告诉 K8s"我想要什么",而不需要告诉它"怎么做"。

比如:

  • 命令式:"帮我启动 3 个 Nginx 容器,如果挂了一个就再启动一个"

  • 声明式:"我想要的最终状态是有 3 个 Nginx 容器在运行"

K8s 会自己想办法达成这个状态。如果容器挂了,它会重启;如果节点宕机了,它会在其他节点上重建。

控制循环

每个控制器都遵循一个简单的逻辑循环:

text

观察当前状态 → 对比期望状态 → 执行操作 → 再次观察

这个循环永不停止,确保系统始终朝着期望状态收敛。

五、Kubernetes 的典型应用场景

1. 微服务架构

Kubernetes 天生适合微服务。每个微服务可以独立部署为一个 Deployment,通过 Service 进行服务发现,通过 Ingress 对外暴露 API 网关。

2. CI/CD 流水线

K8s 是 DevOps 的绝佳平台。Jenkins、GitLab CI、ArgoCD 等工具可以无缝集成,实现代码提交后自动构建镜像、自动部署到测试环境、自动运行测试、自动发布到生产环境。

3. 批处理与大数据

通过 Job 和 CronJob 资源,K8s 可以很好地支持批处理任务、定时任务,以及 Spark、Flink 等大数据计算框架。

4. AI/机器学习

K8s 正在成为 AI 平台的标准底座。它可以调度 GPU 资源,通过 Kubeflow 等项目提供完整的 ML 工作流支持。

5. 混合云/多云管理

K8s 的抽象层使得应用可以无缝地在公有云、私有云、边缘节点之间迁移,避免厂商锁定。

六、Kubernetes 的生态系统

K8s 之所以强大,很大程度上得益于其庞大的生态系统:

类别 典型项目
服务网格 Istio, Linkerd
监控 Prometheus, Grafana
日志 EFK (Elasticsearch, Fluentd, Kibana), Loki
存储 Rook (Ceph), Longhorn
CI/CD Jenkins X, ArgoCD, Tekton
包管理 Helm
安全 Falco, OPA/Gatekeeper
边缘计算 KubeEdge, K3s

七、学习 Kubernetes 的路径建议

如果你刚开始接触 K8s,可以参考这个学习路径:

  1. 第一阶段(入门)

    • 用 Minikube 或 Kind 在本地搭建环境

    • 学习 kubectl 常用命令

    • 部署第一个 Nginx,理解 Pod、Deployment、Service

  2. 第二阶段(掌握核心概念)

    • 深入理解 Pod 的生命周期

    • 学习 ConfigMap、Secret、Volume

    • 掌握 Deployment 的滚动更新和回滚

    • 了解不同的 Service 类型

  3. 第三阶段(进阶)

    • 学习 StatefulSet(有状态应用)

    • 掌握 Ingress 和网络策略

    • 学习 Helm 包管理

    • 了解 RBAC 权限控制

  4. 第四阶段(生产实践)

    • 搭建监控告警系统(Prometheus + Grafana)

    • 实现日志集中采集(EFK/Loki)

    • 学习 GitOps 流程(ArgoCD)

    • 了解服务网格(Istio)

八、常见误区

误区1:K8s 是万能的

K8s 很强大,但不是所有场景都需要它。如果你的应用很简单(比如就几个服务),或者团队规模很小,用 K8s 可能会增加不必要的复杂度。

误区2:用了 K8s 就不用关心底层

K8s 抽象了基础设施,但网络、存储、安全等底层问题依然存在,只是换了一种方式处理。

误区3:K8s = Docker Swarm

Docker Swarm 更简单,但功能也相对有限。K8s 功能更全面,生态更强大,但学习曲线也更陡。


总结

Kubernetes 已经成为了云原生时代的"操作系统"。就像 Windows/Linux 管理计算机硬件资源一样,K8s 管理着数据中心的服务器资源,为上层应用提供运行环境。

虽然上手有一定门槛,但一旦掌握,它将极大地提升你的应用部署和管理效率。无论你是开发、运维还是架构师,理解 Kubernetes 都将是职业生涯中一笔宝贵的财富。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐