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 实战经验? 欢迎在评论区分享!👇