Kubernetes (K8s) 核心概念入门
一句话概述:Kubernetes 是容器编排平台,自动管理容器的部署、扩缩容、自愈和负载均衡——你告诉它"我要 5 个副本的 Web 应用",它自动帮你维持这个状态,容器挂了自动重启。
核心知识点
| 概念 | 白话解释 |
|---|
| Pod | K8s 最小单位,一个 Pod 里跑一个或多个容器 |
| Deployment | 管理 Pod 的副本数和更新策略 |
| Service | 给 Pod 一个稳定的访问入口(Pod IP 会变,Service 不变) |
| Namespace | 逻辑隔离,比如 dev/staging/production |
| ConfigMap | 存配置信息(非敏感) |
| Secret | 存敏感信息(密码、Token) |
| Ingress | HTTP 路由入口,根据域名/路径转发到不同 Service |
| Node | 集群中的一台服务器(物理机或虚拟机) |
| 声明式模型 | 你声明"我要什么状态",K8s 自动维持 |
安装配置
本地学习环境
# 方式一:Minikube(最适合学习)
# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start # 启动本地集群
minikube dashboard # 打开 Web 管理界面
# 方式二:Docker Desktop(自带 K8s)
# Docker Desktop → Settings → Kubernetes → Enable
# 方式三:kind(Kubernetes in Docker)
# 用 Docker 容器模拟 K8s 节点,轻量快速
go install sigs.k8s.io/kind@latest
kind create cluster
安装 kubectl
# kubectl 是 K8s 的命令行工具
# macOS
brew install kubectl
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
# 验证
kubectl version --client # 查看版本
kubectl cluster-info # 查看集群信息
基本使用
创建 Deployment
# deployment.yaml - 部署定义
apiVersion: apps/v1 # API 版本
kind: Deployment # 资源类型:部署
metadata:
name: my-web-app # 部署名称
labels:
app: web # 标签,用于选择器
spec:
replicas: 3 # 运行 3 个 Pod 副本
selector:
matchLabels:
app: web # 选择带 app=web 标签的 Pod
template: # Pod 模板
metadata:
labels:
app: web # Pod 的标签
spec:
containers:
- name: web # 容器名
image: nginx:latest # 容器镜像
ports:
- containerPort: 80 # 容器端口
resources: # 资源限制
requests:
memory: "64Mi" # 最少需要 64MB 内存
cpu: "250m" # 最少需要 0.25 核 CPU
limits:
memory: "128Mi" # 最多用 128MB
cpu: "500m" # 最多用 0.5 核
env: # 环境变量
- name: APP_ENV
value: "production"
# 应用配置
kubectl apply -f deployment.yaml # 创建/更新部署
# 查看状态
kubectl get deployments # 列出所有部署
kubectl get pods # 列出所有 Pod
kubectl describe pod <pod-name> # 查看 Pod 详情
kubectl logs <pod-name> # 查看 Pod 日志
创建 Service
# service.yaml - 服务定义
apiVersion: v1
kind: Service
metadata:
name: my-web-service # Service 名
spec:
type: ClusterIP # 类型:集群内访问
# type: NodePort # 暴露到节点端口
# type: LoadBalancer # 创建外部负载均衡器
selector:
app: web # 选择 app=web 的 Pod
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 80 # Pod 端口
kubectl apply -f service.yaml # 创建 Service
kubectl get services # 列出所有 Service
ConfigMap 和 Secret
# configmap.yaml - 配置信息
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db.example.com" # 数据库地址
LOG_LEVEL: "info" # 日志级别
---
# secret.yaml - 敏感信息
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 编码的密码
API_KEY: bXlhcGlrZXk= # echo -n "myapikey" | base64
# 在 Deployment 中使用
containers:
- name: web
image: my-app:latest
envFrom:
- configMapRef:
name: app-config # 注入 ConfigMap 所有键值
- secretRef:
name: app-secrets # 注入 Secret 所有键值
高级用法
Ingress 路由
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: api.example.com # 域名
http:
paths:
- path: / # 路径
pathType: Prefix
backend:
service:
name: my-web-service # 转发到这个 Service
port:
number: 80
滚动更新
# 更新镜像版本(自动滚动更新,零停机)
kubectl set image deployment/my-web-app web=nginx:1.25 # 更新镜像
# 查看更新状态
kubectl rollout status deployment/my-web-app # 等待更新完成
# 回滚
kubectl rollout undo deployment/my-web-app # 回到上一个版本
kubectl rollout history deployment/my-web-app # 查看历史版本
自动扩缩容
# 手动扩缩容
kubectl scale deployment my-web-app --replicas=5 # 扩到 5 个
# 自动扩缩容(HPA)
kubectl autoscale deployment my-web-app \
--min=2 --max=10 --cpu-percent=70 # CPU 超 70% 自动加 Pod
常见报错
| 报错信息 | 原因 | 解决方案 |
|---|
ImagePullBackOff | 拉取镜像失败 | 检查镜像名和标签,确认镜像仓库可访问 |
CrashLoopBackOff | 容器不停崩溃重启 | kubectl logs 查看崩溃原因 |
Pending | Pod 无法调度 | 检查节点资源是否充足 |
OOMKilled | 内存不够被杀了 | 增加 resources.limits.memory |
Service has no endpoints | Service 没匹配到 Pod | 检查 selector 标签是否一致 |
connection refused | 端口不对 | 检查 containerPort 和 targetPort |
速查表
# 基础命令
kubectl get pods # 列出 Pod
kubectl get deployments # 列出部署
kubectl get services # 列出服务
kubectl get all # 列出所有资源
kubectl get all -n <namespace> # 指定命名空间
# 操作命令
kubectl apply -f <file.yaml> # 创建/更新资源
kubectl delete -f <file.yaml> # 删除资源
kubectl scale deployment <name> --replicas=N # 扩缩容
kubectl set image deployment/<name> <container>=<image> # 更新镜像
# 调试命令
kubectl describe pod <name> # 详情
kubectl logs <pod-name> # 日志
kubectl logs <pod-name> -f # 实时日志
kubectl exec -it <pod-name> -- /bin/sh # 进入容器
kubectl port-forward <pod> 8080:80 # 端口转发
# 资源类型缩写
po=Pod deploy=Deployment svc=Service
ns=Namespace cm=ConfigMap ing=Ingress
no=Node pv=PersistentVolume pvc=PersistentVolumeClaim
参考:Kubernetes 官方教程 | kubectl 手册 | CNCF 2026 学习资源