2026年 Kubernetes 入门实战指南:从本地集群到第一个应用部署

5 阅读4分钟

前言:为什么还要学 Kubernetes?

"都 2026 了,Kubernetes 不是标配吗?还需要专门学?"

是的,正因为它已经是标配,所以必须掌握

现在招聘后端/运维/全栈岗位,Kubernetes 几乎成了必考项。但很多初学者被复杂概念劝退——Pod、Deployment、Service、Ingress...名字又多又抽象。

这篇文章的目的,就是让 Kubernetes 不再神秘。我会带你从零搭建本地集群、部署第一个应用、理解核心概念,建立完整的云原生思维。


一、Kubernetes 是什么?先搞懂几个核心概念

1.1 从 Docker Compose 说起

如果你用过 Docker Compose,理解 K8s 会容易很多:

Docker Compose          →  Kubernetes
─────────────────────────────────────
container              →  Pod
docker-compose.yml     →  Deployment/StatefulSet
ports 映射             →  Service
nginx 反向代理         →  Ingress
volumes                →  PersistentVolume
networks               →  NetworkPolicy

Pod 是 K8s 的最小调度单位。一个 Pod 可以包含一个或多个容器(通常是 Docker 容器),这些容器共享网络和存储。

1.2 K8s 架构概览

┌─────────────────────────────────────────────────────────┐
│                      K8s 集群                            │
│                                                         │
│  ┌─────────────┐              ┌─────────────┐          │
│  │ Master Node │              │ Worker Node │          │
│  │ ─────────── │              │ ─────────── │          │
│  │ API Server  │◄────────────►│ kubelet     │          │
│  │ etcd        │              │ kube-proxy  │          │
│  │ Scheduler   │              │ Container   │          │
│  │ Controller  │              │ Runtime     │          │
│  └─────────────┘              └──────┬──────┘          │
│                                     │                  │
│                              ┌──────▼──────┐          │
│                              │    Pods     │          │
│                              │  ┌───────┐  │          │
│                              │  │ nginx │  │          │
│                              │  └───────┘  │          │
│                              └────────────┘          │
└─────────────────────────────────────────────────────────┘

Master Node(控制面)

  • API Server:集群入口,所有操作都通过它
  • etcd:键值存储,保存集群状态
  • Scheduler:决定 Pod 调度到哪个节点
  • Controller Manager:维护期望状态

Worker Node(工作节点)

  • kubelet:与 API Server 通信,管理容器
  • kube-proxy:网络代理,处理服务发现
  • Container Runtime:实际运行容器(containerd)

二、快速搭建本地 Kubernetes 集群

2.1 选择合适的工具

工具适用场景系统要求资源占用
minikube单节点学习2核4G
kind (Kubernetes in Docker)开发测试2核4G
k3s低资源环境1核1G极低
Docker Desktop K8sMac/Windows4核8G

推荐学习使用 kind,轻量且接近真实集群。

2.2 安装 kind

macOS

# 使用 Homebrew 安装
brew install kind

# 或手动安装
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-darwin-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind

Windows(使用 PowerShell)

# 安装 kind
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.20.0/kind-windows-amd64.exe
Move-Item .\kind-windows-amd64.exe c:\kind.exe

# 添加到 PATH
$env:PATH += ";c:\"

2.3 创建集群

# 创建单节点集群
kind create cluster --name my-cluster

# 创建多节点集群(推荐)
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker
EOF

kind create cluster --name my-cluster --config kind-config.yaml

2.4 验证集群

# 查看集群信息
kubectl cluster-info

# 查看节点
kubectl get nodes

# 输出示例
NAME                        STATUS   ROLES           AGE   VERSION
my-cluster-control-plane    Ready    control-plane   5m    v1.29.0
my-cluster-worker           Ready    <none>           4m    v1.29.0
my-cluster-worker2          Ready    <none>           4m    v1.29.0

三、部署第一个应用

3.1 创建 Deployment

Deployment 是 K8s 最常用的 workload,用于声明式管理 Pod 副本。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # 3 个副本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
          requests:
            memory: "64Mi"
            cpu: "250m"

3.2 部署应用

# 应用 Deployment
kubectl apply -f deployment.yaml

# 查看部署状态
kubectl get deployments

# 查看 Pod
kubectl get pods

# 查看 Pod 详情
kubectl describe pod nginx-deployment-7fb96c846b-xxxxx

# 查看 Pod 日志
kubectl logs nginx-deployment-7fb96c846b-xxxxx

3.3 暴露服务(创建 Service)

Service 为一组 Pod 提供稳定的访问入口。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP  # ClusterIP / NodePort / LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80       # Service 端口
    targetPort: 80  # 容器端口
kubectl apply -f service.yaml

# 查看 Service
kubectl get services

3.4 访问应用

由于是本地集群,需要通过端口转发访问:

# 端口转发
kubectl port-forward svc/nginx-service 8080:80

# 然后访问 http://localhost:8080

四、核心概念详解

4.1 Deployment 的工作原理

Deployment
    │
    ├── 创建 ReplicaSet
    │       │
    │       └── 创建 Pod(3个副本)
    │               │
    │               └── 创建容器
    │
    └── 滚动更新
            │
            ├── 新 ReplicaSet(逐步增加副本)
            └── 旧 ReplicaSet(逐步减少副本)

滚动更新策略

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多超出期望副本数
      maxUnavailable: 0  # 最多不可用副本数

4.2 Service 类型对比

类型适用场景访问方式
ClusterIP集群内部通信内部 IP(10.96.0.x)
NodePort开发测试:
LoadBalancer云环境云厂商 LB
ExternalName外部服务映射DNS 名称

4.3 ConfigMap 与 Secret

ConfigMap:存储非敏感配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: "db.example.com"
  LOG_LEVEL: "info"

Secret:存储敏感信息(Base64 编码)

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  # echo -n "password123" | base64
  DB_PASSWORD: cGFzc3dvcmQxMjM=

在 Pod 中使用

spec:
  containers:
  - name: app
    envFrom:
    - configMapRef:
        name: app-config
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: app-secret
          key: DB_PASSWORD

4.4 Ingress(入口路由)

Ingress 相当于 K8s 集群的"入口网关",用于 HTTP/HTTPS 路由。

# 安装 Ingress Controller(以 nginx 为例)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.0/deploy/static/provider/cloud/deploy.yaml

# 定义 Ingress 规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

五、实战:部署一个完整应用

5.1 场景说明

部署一个 Web API 应用,包含:

  • 前端:React 应用
  • 后端:Python FastAPI
  • 数据库:PostgreSQL(使用 StatefulSet)

5.2 目录结构

my-app/
├── frontend/
│   ├── deployment.yaml
│   └── service.yaml
├── backend/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── configmap.yaml
│   └── secret.yaml
├── database/
│   ├── statefulset.yaml
│   └── service.yaml
└── ingress.yaml

5.3 数据库 StatefulSet

# database/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:15-alpine
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: myapp
        - name: POSTGRES_USER
          value: admin
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi

5.4 后端 Deployment

# backend/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: myregistry/backend:v1.0.0
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          value: "postgresql://admin:$(DB_PASSWORD)@postgres:5432/myapp"
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 10
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10

5.5 统一部署

# 创建 namespace
kubectl create namespace myapp

# 部署所有资源
kubectl apply -n myapp -f ./database
kubectl apply -n myapp -f ./backend
kubectl apply -n myapp -f ./frontend

# 查看所有资源
kubectl get all -n myapp

# 查看 Pod 日志
kubectl logs -n myapp -l app=backend -f

六、日常运维命令速查

6.1 资源管理

# 获取资源
kubectl get pods -n <namespace>
kubectl get deployments -n <namespace>
kubectl get services -n <namespace>
kubectl get ingress -n <namespace>

# 查看详细
kubectl describe pod <pod-name> -n <namespace>
kubectl describe deployment <deployment-name> -n <namespace>

# 删除资源
kubectl delete -f <yaml-file>
kubectl delete pod <pod-name> -n <namespace>

# 扩缩容
kubectl scale deployment <deployment-name> --replicas=5 -n <namespace>

6.2 调试与排障

# 进入容器(调试用)
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

# 查看日志
kubectl logs <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous  # 上一个容器实例

# 端口转发(本地调试)
kubectl port-forward <pod-name> 8080:80 -n <namespace>

# 资源使用
kubectl top pod -n <namespace>
kubectl top node

6.3 滚动更新与回滚

# 查看部署历史
kubectl rollout history deployment/<name> -n <namespace>

# 回滚到上一个版本
kubectl rollout undo deployment/<name> -n <namespace>

# 回滚到指定版本
kubectl rollout undo deployment/<name> --to-revision=2 -n <namespace>

七、学习路径建议

阶段一:入门(1-2周)

  • 理解 K8s 核心概念(Pod/Deployment/Service/Ingress)
  • 搭建本地集群(kind/minikube)
  • 部署第一个应用
  • 学习 kubectl 常用命令

阶段二:进阶(3-4周)

  • ConfigMap / Secret 配置管理
  • 健康检查(Probe)
  • 滚动更新与回滚
  • 持久化存储(PV/PVC)
  • 资源限制与配额

阶段三:生产级(5-8周)

  • Ingress 配置与 TLS
  • 网络策略
  • RBAC 权限管理
  • HPA 自动扩缩容
  • 日志与监控体系

阶段四:认证

  • 准备 CKA 认证
  • 完成官方实验
  • 模拟考试

总结

本文覆盖了 Kubernetes 入门所需的核心知识点:

  1. 概念理解:Pod、Deployment、Service、Ingress 的作用与关系
  2. 环境搭建:使用 kind 快速创建本地集群
  3. 实战部署:从单应用到多组件完整部署
  4. 运维命令:日常调试与排障常用命令
  5. 学习路径:系统化提升的建议

Kubernetes 的学习曲线确实存在,但只要动手实践,很快就能建立直观理解。建议找一个周末,从头到尾跟着本文操作一遍,比看十篇文章都有用。


关于作者

长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。

个人博客:yunduancloud.icu —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。