1. Kubernetes基础:发展史、核心概念与架构组件

大家好,我是你们的讲师。今天咱们来聊聊Kubernetes——这个在云原生领域几乎无人不知的"大管家"。说实话,我刚开始接触它的时候,也觉得这东西挺复杂的。但用久了你会发现,它的设计思路其实很清晰。

1.1 Kubernetes发展史:从Borg到K8s

Kubernetes的故事,得从Google内部说起。Google早在2000年代初就开发了一套名为Borg的集群管理系统,用来管理他们海量的容器化应用。你想想看,Google的搜索、Gmail、YouTube,背后都是Borg在调度。

到了2014年,Google决定把Borg的经验拿出来,开源一个更通用的版本——这就是Kubernetes。我记得当时Kubernetes刚发布时,很多人还不太理解它到底能干什么。但很快,它就成了容器编排的事实标准。

为什么叫Kubernetes?这个词来自希腊语,意思是"舵手"或"领航员"。缩写K8s是因为K和s之间有8个字母。嗯,这命名还挺有工程师的幽默感。

关键时间节点:

  • 2003-2004年:Google内部Borg系统诞生
  • 2014年6月:Kubernetes v1.0发布,由Google、Red Hat、CoreOS等联合推出
  • 2015年7月:Kubernetes v1.0正式发布,并捐献给CNCF(云原生计算基金会)
  • 2017年:Kubernetes成为主流,几乎所有云厂商都支持
  • 2020年至今:Kubernetes已成为云原生生态的核心

1.2 核心概念:Pod、Service、Deployment

这三个概念,说白了就是Kubernetes的"三驾马车"。我刚开始学的时候,总是搞混它们的关系。后来我用一个比喻就记住了:Pod是"房子",Service是"门牌号",Deployment是"物业公司"

Pod:最小的部署单元

Pod是Kubernetes中你可以创建和管理的最小计算单元。一个Pod可以包含一个或多个容器,这些容器共享网络和存储。为什么要有Pod?因为有些应用需要"亲密"地待在一起——比如一个Web服务器和一个日志收集器,它们需要共享网络栈。

我在项目中遇到过一个问题:有个团队把两个需要独立扩展的服务放在同一个Pod里,结果导致资源争抢。记住:Pod里的容器应该是一荣俱荣、一损俱损的关系

# 一个简单的Pod定义
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80

Service:稳定的网络入口

Pod是动态的,它们会创建、销毁、迁移。那问题来了:客户端怎么找到这些Pod?这就是Service的作用。Service为一组Pod提供一个稳定的IP地址和DNS名称,不管Pod怎么变,客户端只要访问Service就行。

说白了,Service就是给Pod们发了一个"固定门牌号"。我建议你一开始就把Service和Pod分开理解——Pod负责干活,Service负责让别人找到它。

# 一个Service定义
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

Deployment:声明式的应用管理

Deployment是Kubernetes最常用的控制器之一。它告诉你:我想要多少个Pod副本,它们应该是什么状态。Deployment会自动帮你创建、更新、回滚Pod。

我曾经犯过一个错误:直接手动删除了一个Pod,结果Deployment立刻又创建了一个新的。嗯,这就是声明式管理的威力——你告诉它"我要3个Pod",它就永远保证有3个。

# 一个Deployment定义
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.21
        ports:
        - containerPort: 80

1.3 架构组件:Master与Worker

Kubernetes集群由两类节点组成:Master节点(控制平面)和Worker节点(工作节点)。你可以把Master想象成"大脑",Worker想象成"手脚"。

避坑指南:我曾经在生产环境中把Master和Worker混在一起部署,结果Master节点负载过高导致集群不稳定。建议生产环境至少部署3个Master节点做高可用。

Master节点组件

  • kube-apiserver:所有操作的入口,相当于Kubernetes的"前台"
  • etcd:分布式键值存储,保存集群所有数据——说白了就是Kubernetes的"数据库"
  • kube-scheduler:负责把Pod调度到合适的Worker节点上
  • kube-controller-manager:运行各种控制器,比如Deployment控制器、Node控制器等

Worker节点组件

  • kubelet:每个节点上的"代理",负责管理Pod和容器
  • kube-proxy:负责网络代理和负载均衡
  • 容器运行时:比如Docker、containerd,负责真正运行容器

1.4 架构关系图

下面这张图展示了Kubernetes的核心架构关系。我画这张图的时候,特意把Master和Worker分开,方便你理解数据流向。

Master节点(控制平面) kube-apiserver etcd kube-scheduler kube-controller-manager Worker节点(工作节点) kubelet kube-proxy 容器运行时(Docker/containerd) Pod 容器1 | 容器2 | ... API调用 调度指令 图例: API Server etcd Scheduler Controller Manager kubelet kube-proxy

1.5 Minikube环境搭建

学Kubernetes,光看书不行,得动手。Minikube就是让你在本地快速搭建一个单节点Kubernetes集群的工具。我建议初学者都用它来练手。

安装步骤

  1. 安装Minikube:根据你的操作系统选择安装方式
  2. 启动集群:运行 minikube start
  3. 验证集群:运行 kubectl get nodes
# Linux/Mac安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群
minikube start --driver=docker

# 验证
kubectl get nodes
# 输出示例:
# NAME       STATUS   ROLES           AGE   VERSION
# minikube   Ready    control-plane   2m    v1.28.3

注意:Minikube默认使用Docker驱动。如果你没有安装Docker,可以先安装Docker Desktop。我曾经遇到过Minikube启动失败的情况,多半是因为Docker服务没启动或者资源不足。

常用Minikube命令

命令 说明
minikube start 启动集群
minikube stop 停止集群
minikube status 查看集群状态
minikube dashboard 打开Kubernetes Dashboard
minikube delete 删除集群

小技巧:如果你觉得Minikube启动慢,可以试试 minikube start --cpus=4 --memory=4096 分配更多资源。我一般给Minikube分配4核CPU和4GB内存,跑起来比较流畅。

好了,这一章的内容就到这里。Kubernetes的基础概念其实不难,关键是动手实践。你可以在Minikube上创建Pod、Service、Deployment,看看它们是怎么工作的。下一章我们会深入Pod的细节,聊聊容器的生命周期和健康检查。


专注资料整理