2176 字
11 分钟

Kubernetes 入门完全指南 2026:核心概念 + kubectl 实战 + Helm 应用部署

从 Docker 单机部署到 Kubernetes 集群编排,是后端开发者迈向云原生的必经之路。K8s 的概念层次多、术语密集,很多人在官方文档中迷失。

Kubernetes 入门完全指南 2026

本文以”做什么 → 为什么 → 怎么做”的顺序串联核心概念,配合实际可运行的 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
IngressHTTP/HTTPS 路由规则,对外暴露服务Nginx 反向代理
ConfigMap非敏感配置数据(环境变量/配置文件).env 文件
Secret敏感数据(密码/证书/API Key)加密的 .env
Namespace资源隔离的虚拟集群项目/团队隔离
PersistentVolume持久化存储(不随 Pod 消亡而丢失)Docker volume

二、本地开发环境搭建#

2.1 三种本地 K8s 对比#

k3sminikubekind
资源需求512MB RAM,1 核4GB RAM,2 核2GB RAM(Docker)
启动时间~30s~2min~60s
多节点支持✅(需要额外配置)✅(天然)
适合场景低配服务器/生产接近完整学习CI/CD 测试
国内推荐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

2.2 安装 k3s(最推荐)#

Terminal window
# 在 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 使用 k3s
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
# 现在可以直接用 kubectl
kubectl get nodes

2.3 安装 kubectl#

Terminal window
# macOS
brew 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:最小调度单元#

pod.yaml
apiVersion: v1
kind: Pod
metadata:
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: 5
Terminal window
kubectl apply -f pod.yaml # 创建 Pod
kubectl 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#

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
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" }
Terminal window
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 名称:

service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp # 匹配带有此标签的 Pod(自动负载均衡)
ports:
- protocol: TCP
port: 80 # Service 对外暴露的端口
targetPort: 8000 # 转发到 Pod 的端口
type: ClusterIP # 只在集群内部可访问(默认)
# type: NodePort # 通过节点 IP + 随机端口对外暴露(开发测试用)
# type: LoadBalancer # 云厂商提供外部负载均衡器(生产用)
Terminal window
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-svc
kubectl describe svc myapp-svc

六、Ingress:HTTP 路由#

ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
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#

configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
# 多行配置文件
nginx.conf: |
server {
listen 80;
location / { proxy_pass http://backend; }
}
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
# 值必须是 base64 编码
db-password: cGFzc3dvcmQxMjM= # base64("password123")
api-key: bXlhcGlrZXk= # base64("myapikey")
Terminal window
# 创建 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-config
containers:
- volumeMounts:
- name: config-vol
mountPath: /etc/myapp/config

八、HPA:水平自动扩缩容#

hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
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% 时扩容
Terminal window
kubectl apply -f hpa.yaml
kubectl 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 资源:

Terminal window
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
# 添加常用仓库
helm repo add stable https://charts.helm.sh/stable
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add cert-manager https://charts.jetstack.io
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 搜索 Chart
helm search repo nginx
# 安装 Nginx Ingress Controller
helm 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
# 安装 PostgreSQL
helm install my-postgres bitnami/postgresql \
--set auth.postgresPassword=mysecretpassword \
--set primary.persistence.size=10Gi
# 查看已安装的 Chart
helm list -A # -A 显示所有 namespace
# 更新
helm upgrade ingress-nginx ingress-nginx/ingress-nginx
# 卸载
helm uninstall ingress-nginx -n ingress-nginx

十、kubectl 速查表#

Terminal window
# ── 查看资源 ──────────────────────────────────────────────────
kubectl get all # 查看 default ns 所有资源
kubectl get all -n kube-system # 查看 kube-system ns
kubectl get pods -A # 所有 ns 的 Pod
kubectl 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 staging
kubectl config set-context --current --namespace=staging # 切换默认 ns
kubectl get ns # 查看所有 namespace
# ── 快速创建(不推荐生产使用)────────────────────────────────
kubectl create deployment nginx --image=nginx:alpine --replicas=3
kubectl 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 下所有资源

相关文章

本文基于 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/
作者
九所长
发布于
2026-08-02
许可协议
CC BY-NC-SA 4.0