第4章:容器编排入门:Kubernetes核心概念与本地集群搭建
说实话,Docker用顺手之后,你很快会遇到一个新问题:容器多了怎么管?
我刚开始做微服务迁移那会儿,手上有十几个容器要部署。今天这个挂了,明天那个端口冲突了,手动docker run简直要命。后来我意识到——单机Docker只是热身,容器编排才是真正的战场。
这一章,咱们就聊聊Kubernetes。别被它吓到,说白了它就是一个「容器管家」。你告诉它想要什么状态,它负责帮你搞定。
4.1 为什么需要Kubernetes?
先想一个问题:你有一个Web服务,三个实例。其中一个挂了怎么办?
手动重启?太慢了。用docker-compose?它只能管单机。流量来了要扩容?你得自己写脚本。
Kubernetes就是来解决这些痛点的。它提供了:
- 自动恢复:容器挂了自动拉起来
- 弹性伸缩:流量大了自动加实例
- 服务发现:容器之间互相能找到对方
- 滚动更新:不停机升级版本
我在项目中遇到过最典型的场景:双十一流量暴增,Kubernetes自动把Pod从3个扩到20个,活动结束后自动缩回去。这要是手动操作,估计得熬通宵。
4.2 三大核心概念:Pod / Service / Deployment
这三个概念,你搞懂了,Kubernetes就算入门了。咱们一个一个说。
4.2.1 Pod:最小的调度单元
Pod是Kubernetes里最小的部署单元。一个Pod可以包含一个或多个容器。
你可能会问:为什么不直接部署容器?
嗯,这里有个设计哲学。Pod里的容器共享网络和存储,它们就像「合租室友」。比如你的应用容器和日志收集容器,放在同一个Pod里,它们用localhost就能通信。
我个人习惯:一个Pod只放一个主容器,除非有强耦合的辅助容器(比如Sidecar模式)。
Pod的关键特性:
- 每个Pod有独立的IP地址
- Pod内的容器共享网络命名空间
- Pod是临时性的,随时可能被销毁重建
4.2.2 Deployment:声明式管理
Deployment是管理Pod的「控制器」。你告诉它「我要3个Nginx实例」,它负责维持这个状态。
我曾经犯过一个错:直接创建Pod,结果节点挂了Pod就丢了。后来改用Deployment,它自动帮我重建,省心多了。
一个典型的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
这里的关键字段:
- replicas:期望的副本数
- selector:它管哪些Pod
- template:Pod的模板,长啥样
4.2.3 Service:稳定的访问入口
Pod的IP是动态的,今天重启明天就变了。那别的服务怎么访问它?
Service就是干这个的。它提供一个固定的IP和DNS名称,不管后端Pod怎么变,客户端只管访问Service就行。
Service有三种类型:
| 类型 | 用途 | 适用场景 |
|---|---|---|
| ClusterIP | 集群内部访问 | 服务间调用 |
| NodePort | 外部通过节点端口访问 | 开发测试环境 |
| LoadBalancer | 云厂商负载均衡器 | 生产环境 |
避坑指南:我曾经把Service的selector写错了标签,结果流量全打到了错误的Pod上。记住:Service的selector必须和Pod的labels完全匹配。
4.3 Minikube:本地集群搭建
学Kubernetes最怕什么?没环境练手。云上集群太贵,自己搭又太复杂。
Minikube就是来解决这个问题的。它能在你本地跑一个单节点的Kubernetes集群,用来学习和开发完全够用。
4.3.1 安装Minikube
我建议用二进制安装,最省事:
# Linux/Mac
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 --cpus=2 --memory=2048
启动参数说明:
- --driver:用什么驱动,推荐docker
- --cpus:给集群分配多少CPU
- --memory:给集群分配多少内存
注意:Minikube默认用VirtualBox驱动。如果你装了Docker,强烈建议用docker驱动,启动速度快很多。我第一次用VirtualBox驱动等了5分钟,换成docker驱动30秒就起来了。
4.3.2 验证集群状态
启动完成后,检查一下集群是否正常:
# 查看集群状态
minikube status
# 查看节点信息
kubectl get nodes
# 查看所有Pod
kubectl get pods -A
如果看到节点状态是Ready,恭喜你,集群搭好了。
4.4 kubectl常用命令
kubectl是你和Kubernetes对话的工具。我整理了一份常用命令清单,你照着练就行。
4.4.1 基础操作
# 查看资源
kubectl get pods # 查看Pod
kubectl get deployments # 查看Deployment
kubectl get services # 查看Service
kubectl get nodes # 查看节点
# 查看详情
kubectl describe pod <pod-name> # 查看Pod详细信息
kubectl logs <pod-name> # 查看Pod日志
kubectl logs -f <pod-name> # 实时查看日志
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash
4.4.2 部署与更新
# 创建资源
kubectl apply -f deployment.yaml
# 删除资源
kubectl delete pod <pod-name>
kubectl delete -f deployment.yaml
# 扩缩容
kubectl scale deployment nginx --replicas=5
# 滚动更新
kubectl set image deployment/nginx nginx=nginx:1.22
我的小技巧:用kubectl get pods -w可以实时监控Pod状态变化。部署新版本时,看着Pod一个个滚动更新,心里特别踏实。
4.4.3 调试与排错
# 查看事件
kubectl get events --sort-by='.lastTimestamp'
# 查看资源占用
kubectl top pods
kubectl top nodes
# 端口转发(本地访问集群内服务)
kubectl port-forward service/nginx-service 8080:80
端口转发这个命令特别实用。你在本地开发时,可以用它把集群里的服务映射到本地端口,直接浏览器访问。
4.5 实战:部署一个Nginx服务
光说不练假把式。咱们用刚才学的知识,部署一个完整的Nginx服务。
第一步:创建Deployment
kubectl create deployment nginx --image=nginx:1.21 --replicas=3
第二步:暴露Service
kubectl expose deployment nginx --port=80 --type=NodePort
第三步:获取访问地址
# Minikube环境
minikube service nginx --url
# 或者用端口转发
kubectl port-forward service/nginx 8080:80
打开浏览器访问,看到Nginx欢迎页,恭喜你——你的第一个Kubernetes应用跑起来了。
总结一下:
- Pod是最小单元,Deployment管Pod死活,Service管Pod访问
- Minikube是本地学习神器,30秒就能搭好集群
- kubectl是核心工具,get/describe/logs/exec这四个命令最常用
下一章,咱们聊聊配置管理——ConfigMap和Secret。到时候我会分享一个因为配置写死在镜像里导致的线上事故,嗯,那教训可深刻了。