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分开,方便你理解数据流向。
1.5 Minikube环境搭建
学Kubernetes,光看书不行,得动手。Minikube就是让你在本地快速搭建一个单节点Kubernetes集群的工具。我建议初学者都用它来练手。
安装步骤
- 安装Minikube:根据你的操作系统选择安装方式
- 启动集群:运行
minikube start - 验证集群:运行
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的细节,聊聊容器的生命周期和健康检查。