第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。到时候我会分享一个因为配置写死在镜像里导致的线上事故,嗯,那教训可深刻了。