2176 字
11 分钟
Kubernetes 入门完全指南 2026:核心概念 + kubectl 实战 + Helm 应用部署
从 Docker 单机部署到 Kubernetes 集群编排,是后端开发者迈向云原生的必经之路。K8s 的概念层次多、术语密集,很多人在官方文档中迷失。

本文以”做什么 → 为什么 → 怎么做”的顺序串联核心概念,配合实际可运行的 YAML 配置,帮你建立完整的 K8s 知识框架。
一、核心概念速览
Kubernetes 集群├── Control Plane(控制平面)│ ├── API Server ← kubectl 的入口,所有操作都经过它│ ├── etcd ← 集群状态数据库(键值存储)│ ├── Scheduler ← 决定 Pod 调度到哪个节点│ └── Controller Manager ← 确保实际状态 = 期望状态│└── Worker Nodes(工作节点) ├── kubelet ← 节点上的代理,执行 Pod 运行指令 ├── kube-proxy ← 负责节点级网络转发规则 └── Container Runtime ← 实际运行容器(containerd / CRI-O)核心资源对象速查
| 资源 | 作用 | 类比 |
|---|---|---|
| Pod | 最小调度单元,包含 1 个或多个容器 | Docker 容器(组) |
| Deployment | 声明 Pod 的期望状态,管理滚动更新 | Docker Compose service |
| Service | 为 Pod 提供稳定的访问入口(VIP + DNS) | Nginx upstream |
| Ingress | HTTP/HTTPS 路由规则,对外暴露服务 | Nginx 反向代理 |
| ConfigMap | 非敏感配置数据(环境变量/配置文件) | .env 文件 |
| Secret | 敏感数据(密码/证书/API Key) | 加密的 .env |
| Namespace | 资源隔离的虚拟集群 | 项目/团队隔离 |
| PersistentVolume | 持久化存储(不随 Pod 消亡而丢失) | Docker volume |
二、本地开发环境搭建
2.1 三种本地 K8s 对比
| k3s | minikube | kind | |
|---|---|---|---|
| 资源需求 | 512MB RAM,1 核 | 4GB RAM,2 核 | 2GB RAM(Docker) |
| 启动时间 | ~30s | ~2min | ~60s |
| 多节点支持 | ✅ | ✅(需要额外配置) | ✅(天然) |
| 适合场景 | 低配服务器/生产接近 | 完整学习 | CI/CD 测试 |
| 国内推荐 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
2.2 安装 k3s(最推荐)
# 在 Linux 上一键安装 k3s(单节点模式)curl -sfL https://get.k3s.io | sh -
# 或使用国内镜像(推荐)curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn sh -
# 验证安装k3s kubectl get nodes# NAME STATUS ROLES AGE VERSION# my-server Ready control-plane,master 30s v1.30.x+k3s1
# 配置 kubectl 使用 k3smkdir -p ~/.kubesudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/configsudo chown $USER ~/.kube/config
# 现在可以直接用 kubectlkubectl get nodes2.3 安装 kubectl
# macOSbrew install kubectl
# Linux(Debian/Ubuntu)curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"chmod +x kubectl && mv kubectl /usr/local/bin/
kubectl version --client# Client Version: v1.30.x三、Pod:最小调度单元
apiVersion: v1kind: Podmetadata: name: my-nginx labels: app: nginx version: "1.27"spec: containers: - name: nginx image: nginx:1.27-alpine ports: - containerPort: 80 resources: requests: # 调度时保证分配的资源 memory: "64Mi" cpu: "100m" # 100m = 0.1 核 limits: # 容器能使用的上限 memory: "128Mi" cpu: "200m" livenessProbe: # 存活探针:失败则重启容器 httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: # 就绪探针:失败则从 Service 移除 httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5kubectl apply -f pod.yaml # 创建 Podkubectl get pod my-nginx # 查看状态kubectl describe pod my-nginx # 详细信息(含事件)kubectl logs my-nginx # 查看日志kubectl logs my-nginx -f # 实时日志kubectl exec -it my-nginx -- sh # 进入容器kubectl delete pod my-nginx # 删除 Pod⚠️ 直接创建 Pod 不具备自愈能力——Pod 崩溃后不会自动重建。实际使用应通过 Deployment 管理 Pod。
四、Deployment:声明式管理 Pod
apiVersion: apps/v1kind: Deploymentmetadata: name: myapp namespace: defaultspec: replicas: 3 # 运行 3 个 Pod 副本 selector: matchLabels: app: myapp # 匹配带有此标签的 Pod strategy: type: RollingUpdate # 滚动更新(默认) rollingUpdate: maxUnavailable: 1 # 更新期间最多 1 个 Pod 不可用 maxSurge: 1 # 更新期间最多额外创建 1 个 Pod template: # Pod 模板 metadata: labels: app: myapp spec: containers: - name: myapp image: myrepo/myapp:v1.2.0 ports: - containerPort: 8000 env: - name: ENV value: "production" - name: DB_PASSWORD valueFrom: secretKeyRef: name: myapp-secret # 从 Secret 读取 key: db-password resources: requests: { memory: "128Mi", cpu: "100m" } limits: { memory: "256Mi", cpu: "500m" }kubectl apply -f deployment.yaml
# 查看 Deployment 状态kubectl get deployment myapp# NAME READY UP-TO-DATE AVAILABLE AGE# myapp 3/3 3 3 10s
# 滚动更新(修改镜像版本)kubectl set image deployment/myapp myapp=myrepo/myapp:v1.3.0
# 查看更新进度kubectl rollout status deployment/myapp
# 回滚到上一版本kubectl rollout undo deployment/myapp
# 回滚到指定版本kubectl rollout history deployment/myapp # 查看历史kubectl rollout undo deployment/myapp --to-revision=2
# 手动扩缩容kubectl scale deployment myapp --replicas=5五、Service:稳定的服务访问入口
Pod 的 IP 会随着重建而改变,Service 提供稳定的 VIP 和 DNS 名称:
apiVersion: v1kind: Servicemetadata: name: myapp-svcspec: selector: app: myapp # 匹配带有此标签的 Pod(自动负载均衡) ports: - protocol: TCP port: 80 # Service 对外暴露的端口 targetPort: 8000 # 转发到 Pod 的端口 type: ClusterIP # 只在集群内部可访问(默认) # type: NodePort # 通过节点 IP + 随机端口对外暴露(开发测试用) # type: LoadBalancer # 云厂商提供外部负载均衡器(生产用)kubectl apply -f service.yaml
# 集群内访问服务(通过 DNS)# http://myapp-svc.default.svc.cluster.local:80
# 临时端口转发到本地(开发调试)kubectl port-forward svc/myapp-svc 8080:80# 现在可以 curl http://localhost:8080
# 查看 Service 详情kubectl get svc myapp-svckubectl describe svc myapp-svc六、Ingress:HTTP 路由
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: myapp-ingress annotations: # 使用 cert-manager 自动申请 Let's Encrypt 证书 cert-manager.io/cluster-issuer: "letsencrypt-prod" # Nginx Ingress Controller 特有注解 nginx.ingress.kubernetes.io/proxy-body-size: "10m" nginx.ingress.kubernetes.io/limit-rps: "30"spec: ingressClassName: nginx # 使用 nginx ingress controller tls: - hosts: - api.example.com secretName: myapp-tls # cert-manager 自动填充证书 rules: - host: api.example.com http: paths: - path: /api/ pathType: Prefix backend: service: name: myapp-svc port: number: 80 - path: /admin/ pathType: Prefix backend: service: name: admin-svc port: number: 8080七、ConfigMap 与 Secret
apiVersion: v1kind: ConfigMapmetadata: name: myapp-configdata: APP_ENV: "production" LOG_LEVEL: "info" # 多行配置文件 nginx.conf: | server { listen 80; location / { proxy_pass http://backend; } }---# secret.yamlapiVersion: v1kind: Secretmetadata: name: myapp-secrettype: Opaquedata: # 值必须是 base64 编码 db-password: cGFzc3dvcmQxMjM= # base64("password123") api-key: bXlhcGlrZXk= # base64("myapikey")# 创建 Secret(不推荐把 Secret YAML 提交到 git!)kubectl create secret generic myapp-secret \ --from-literal=db-password="password123" \ --from-literal=api-key="myapikey"
# 从文件创建kubectl create secret generic tls-secret \ --from-file=tls.crt=./cert.pem \ --from-file=tls.key=./key.pem
# 在 Pod 中使用 ConfigMap# 方式一:注入为环境变量envFrom: - configMapRef: name: myapp-config
# 方式二:挂载为文件volumes: - name: config-vol configMap: name: myapp-configcontainers: - volumeMounts: - name: config-vol mountPath: /etc/myapp/config八、HPA:水平自动扩缩容
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: myapp-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp minReplicas: 2 # 最小副本数(保证基础可用性) maxReplicas: 10 # 最大副本数(防止无限扩容) metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 # CPU 平均利用率超过 60% 时扩容 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70 # 内存超过 70% 时扩容kubectl apply -f hpa.yamlkubectl get hpa myapp-hpa # 查看 HPA 状态# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS# myapp-hpa Deployment/myapp 30%/60% 2 10 2⚠️ HPA 工作需要集群安装 Metrics Server。k3s 默认包含,其他环境用
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml安装。
九、Helm:K8s 的包管理器
Helm 是 K8s 的应用包管理器,类似 apt/brew——用”Chart”封装复杂应用的所有 K8s 资源:
# 安装 Helmcurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashhelm version
# 添加常用仓库helm repo add stable https://charts.helm.sh/stablehelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo add cert-manager https://charts.jetstack.iohelm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update
# 搜索 Charthelm search repo nginx
# 安装 Nginx Ingress Controllerhelm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.replicaCount=2 \ --set controller.service.type=LoadBalancer
# 安装 cert-manager(自动 HTTPS 证书)helm install cert-manager cert-manager/cert-manager \ --namespace cert-manager \ --create-namespace \ --set crds.enabled=true
# 安装 PostgreSQLhelm install my-postgres bitnami/postgresql \ --set auth.postgresPassword=mysecretpassword \ --set primary.persistence.size=10Gi
# 查看已安装的 Charthelm list -A # -A 显示所有 namespace
# 更新helm upgrade ingress-nginx ingress-nginx/ingress-nginx
# 卸载helm uninstall ingress-nginx -n ingress-nginx十、kubectl 速查表
# ── 查看资源 ──────────────────────────────────────────────────kubectl get all # 查看 default ns 所有资源kubectl get all -n kube-system # 查看 kube-system nskubectl get pods -A # 所有 ns 的 Podkubectl get pods -w # 实时监听 Pod 状态变化kubectl get pod myapp-xxx -o yaml # 以 YAML 格式输出完整定义kubectl get events --sort-by='.lastTimestamp' # 查看事件(按时间排序)
# ── 调试 ──────────────────────────────────────────────────────kubectl describe pod myapp-xxx # 详细信息(含 Events)kubectl logs myapp-xxx -c container-name # 多容器 Pod 指定容器日志kubectl logs -l app=myapp --tail=100 # 按标签查看所有 Pod 日志kubectl exec -it myapp-xxx -- bash # 进入容器终端kubectl top pod # 查看 Pod CPU/内存用量kubectl top node # 查看节点资源用量
# ── 命名空间 ──────────────────────────────────────────────────kubectl create namespace stagingkubectl config set-context --current --namespace=staging # 切换默认 nskubectl get ns # 查看所有 namespace
# ── 快速创建(不推荐生产使用)────────────────────────────────kubectl create deployment nginx --image=nginx:alpine --replicas=3kubectl expose deployment nginx --port=80 --type=NodePort
# ── 清理 ──────────────────────────────────────────────────────kubectl delete -f deployment.yaml # 按文件删除kubectl delete pod -l app=myapp # 按标签删除kubectl delete all --all -n staging # 删除 ns 下所有资源相关文章:
- Docker 完全指南 2026:Compose 多服务编排与生产部署
- Nginx 进阶完全指南 2026:反向代理 + HTTPS + 负载均衡
- Linux 服务器初始化安全配置:买完 VPS 必做的 12 件事
- WireGuard VPN 自建完全指南 2026
- Cloudflare Workers 实战完全指南 2026
本文基于 Kubernetes 1.30.x / Helm 3.15.x 验证。K8s API 版本更新较快,部分 apiVersion 字段在未来版本可能变更,请参考 kubernetes.io/docs 获取最新 API 规范。
Kubernetes 入门完全指南 2026:核心概念 + kubectl 实战 + Helm 应用部署
https://971918.xyz/posts/docs/kubernetes-basics-guide/