折腾侠
技术教程

Kubernetes 入门指南 - 容器编排从 0 到 1

K8s 太难?本文从零讲解 Kubernetes 核心概念和实战部署。

折腾侠
2026/03/15 发布
19约 5 分钟589 字 / 764 词00

Kubernetes 入门指南 - 容器编排从 0 到 1

K8s 太难?本文从零讲解 Kubernetes 核心概念和实战部署。

📋 前言

Kubernetes(K8s)是容器编排的事实标准。

为什么需要 K8s?

  • 容器太多,手动管理困难
  • 需要自动扩缩容
  • 需要高可用
  • 需要服务发现和负载均衡

学习曲线:

  • 概念多
  • 架构复杂
  • 但掌握后价值巨大

本文从零讲解 K8s 核心概念和实战。


🎯 核心概念

1. Pod

最小的部署单元

YAML
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80

特点:

  • 一个或多个容器
  • 共享网络和存储
  • ephemeral(短暂)

2. Deployment

无状态应用部署

YAML
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.20
        ports:
        - containerPort: 80

特点:

  • 管理 Pod 副本数
  • 支持滚动更新
  • 支持回滚

3. Service

服务发现和负载均衡

YAML
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP  # NodePort, LoadBalancer

类型:

  • ClusterIP:集群内访问
  • NodePort:节点端口暴露
  • LoadBalancer:云负载均衡
  • ExternalName:外部服务

4. ConfigMap & Secret

配置管理

YAML
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DB_HOST: "mysql.default.svc"
  LOG_LEVEL: "info"

# Secret
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64 编码

5. Volume

持久化存储

YAML
volumes:
- name: data-volume
  persistentVolumeClaim:
    claimName: data-pvc

🏗️ 架构组件

控制平面(Control Plane)

┌─────────────────────┐
│   API Server        │ ← 所有请求入口
├─────────────────────┤
│   Scheduler         │ ← Pod 调度
├─────────────────────┤
│   Controller Manager│ ← 控制器管理
├─────────────────────┤
│   etcd              │ ← 数据存储
└─────────────────────┘

工作节点(Worker Node)

┌─────────────────────┐
│   Kubelet           │ ← 节点代理
├─────────────────────┤
│   Kube-proxy        │ ← 网络代理
├─────────────────────┤
│   Container Runtime │ ← 容器运行时
├─────────────────────┤
│   Pods              │ ← 容器组
└─────────────────────┘

🚀 快速开始

1. 安装 minikube(本地学习)

Bash
# 安装 minikube
brew install minikube  # macOS

# 启动集群
minikube start

# 查看状态
minikube status

2. 安装 kubectl

Bash
# 安装 kubectl
brew install kubectl  # macOS

# 配置集群
kubectl config use-context minikube

# 测试
kubectl get nodes

3. 部署应用

Bash
# 创建 Deployment
kubectl create deployment nginx --image=nginx:1.20

# 查看 Pod
kubectl get pods

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 访问服务
minikube service nginx

💡 实战场景

场景 1:部署 Web 应用

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: myapp:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

场景 2:配置管理

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
      - name: app
        image: myapp:latest
        env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DB_HOST
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secret
              key: DB_PASSWORD

场景 3:持久化存储

YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 1
  template:
    spec:
      containers:
      - name: mysql
        image: mysql:8
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

⚡ 常用命令

查看资源

Bash
# 查看节点
kubectl get nodes

# 查看 Pod
kubectl get pods
kubectl get pods -n namespace

# 查看 Deployment
kubectl get deployments

# 查看 Service
kubectl get services

# 查看详情
kubectl describe pod <pod-name>

# 查看日志
kubectl logs <pod-name>
kubectl logs -f <pod-name>  # 跟随

创建/删除

Bash
# 从 YAML 创建
kubectl apply -f deployment.yaml

# 快速创建
kubectl create deployment nginx --image=nginx

# 删除
kubectl delete -f deployment.yaml
kubectl delete pod <pod-name>

调试

Bash
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash

# 端口转发
kubectl port-forward <pod-name> 8080:80

# 查看资源使用
kubectl top pods
kubectl top nodes

🎯 最佳实践

1. 资源限制

YAML
resources:
  requests:
    memory: "128Mi"
    cpu: "100m"
  limits:
    memory: "256Mi"
    cpu: "200m"

2. 健康检查

YAML
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

3. 标签规范

YAML
labels:
  app: myapp
  version: v1.0
  env: production

4. 多环境管理

Bash
# 使用 Namespace 隔离
kubectl create namespace dev
kubectl create namespace prod

# 部署到不同环境
kubectl apply -f app.yaml -n dev
kubectl apply -f app.yaml -n prod

⚠️ 常见问题

1. Pod 无法启动

Bash
# 查看事件
kubectl describe pod <pod-name>

# 常见原因:
# - 镜像拉取失败
# - 资源不足
# - 配置错误

2. 服务无法访问

Bash
# 检查 Service
kubectl get svc
kubectl describe svc <svc-name>

# 检查 Endpoint
kubectl get endpoints

# 测试连通性
kubectl run test --rm -it --image=busybox -- /bin/sh
wget <service-name>

3. 磁盘空间不足

Bash
# 查看节点资源
kubectl top nodes

# 清理未使用的镜像
docker image prune

# 清理未使用的 Pod
kubectl delete pod --field-selector=status=Failed

🎁 总结

核心概念:

✅ Pod - 最小部署单元
✅ Deployment - 无状态部署
✅ Service - 服务发现
✅ ConfigMap/Secret - 配置管理
✅ Volume - 持久化存储

学习路径:

1. 本地 minikube 学习
2. 理解核心概念
3. 实战部署应用
4. 学习高级特性
5. 生产环境实践

最后建议:

K8s 学习曲线陡峭,但价值巨大。

多动手实践,从简单开始,循序渐进。


你有什么 K8s 实战经验? 欢迎在评论区分享!👇

📚 参考资源

分享到:

如果这篇文章对你有帮助,欢迎请作者喝杯咖啡 ☕

加载评论中...