一、为什么需要 Kubernetes?
在传统部署方式中,我们通常会遇到以下问题:
- 应用部署依赖环境复杂,无法快速迁移
- 扩容与缩容需要人工干预
- 服务一旦宕机需要手动拉起
- 多个应用之间资源抢占,没有统一管理方式
Docker 的出现让“应用即容器”成为现实,而 Kubernetes(简称 K8s)则让“容器集群”以自动化方式运行,成为容器编排领域的事实标准。
📌 Kubernetes 解决的问题
- 自动化部署与滚动更新
- 应用自愈(Self-Healing)
- 负载均衡与服务发现
- 资源调度与隔离
- 弹性扩缩容
二、Kubernetes 架构与核心概念
🌐 1. Kubernetes 架构图(Control Plane & Worker)
K8s 的架构分为两大部分:
控制平面(Control Plane)
| 组件 | 功能 |
|---|---|
| kube-apiserver | 集群 API 入口,所有操作都通过它 |
| etcd | 分布式键值存储,保存集群状态 |
| kube-scheduler | 决定 Pod 调度到哪个节点 |
| kube-controller-manager | 运行控制器(如 Deployment、Node 控制器) |
| cloud-controller-manager | 与云厂商交互(如 AWS、阿里云) |
节点(Worker Node)
| 组件 | 功能 |
|---|---|
| kubelet | 负责 Pod 生命周期 |
| kube-proxy | 负责网络转发 |
| Container Runtime | 容器运行时(如 containerd、CRI-O) |
📦 三、K8s 常用资源对象
🧩 常用 Kubernetes 资源及使用场景
| 资源类型 | 资源名称 | 典型使用场景 | 说明 |
|---|---|---|---|
| 工作负载(Workloads) | Pod | 调试、单容器任务、作为其他控制器的基础单元 | 最小调度单位,通常不直接创建,由控制器管理 |
| Deployment | 无状态应用部署(如 Web 服务、API 服务) | 支持滚动更新、回滚、扩缩容,最常用的工作负载 | |
| StatefulSet | 有状态应用(如 MySQL、Redis、ZooKeeper、Kafka) | 提供稳定的网络标识(hostname)、有序启停、持久化存储绑定 | |
| DaemonSet | 每节点运行一个 Pod(如日志采集、监控代理、网络插件) | 适用于集群级守护进程,新节点自动部署 | |
| Job | 一次性任务(如数据迁移、批处理计算) | 运行到成功完成即终止 | |
| CronJob | 定时任务(如每日备份、报表生成) | 基于 Cron 表达式周期性触发 Job | |
| HorizontalPodAutoscaler (HPA) | 自动扩缩容 | 根据 CPU、内存或自定义指标动态调整 Pod 副本数 | |
| 服务与网络(Service & Networking) | Service | 为 Pod 提供稳定访问入口 | 支持 ClusterIP(集群内)、NodePort(节点端口)、LoadBalancer(云厂商 LB) |
| Ingress | HTTP/HTTPS 路由到多个 Service | 需配合 Ingress Controller(如 Nginx、Traefik),实现域名/路径路由 | |
| IngressClass | 指定 Ingress 使用的控制器类型 | 多 Ingress Controller 场景下区分路由策略 | |
| NetworkPolicy | 限制 Pod 间网络通信 | 实现"零信任"网络,仅允许白名单流量(需 CNI 支持,如 Calico) | |
| 配置与存储(Config & Storage) | ConfigMap | 注入非敏感配置(如 app.conf、环境变量) | 可通过 Volume 或 env 引用,支持热更新(部分场景) |
| Secret | 存储敏感信息(密码、Token、TLS 证书) | Base64 编码(非加密),建议配合 etcd 加密或外部 Vault | |
| PersistentVolume (PV) | 集群级持久化存储(如云盘、NFS) | 由管理员预配或通过 StorageClass 动态创建 | |
| PersistentVolumeClaim (PVC) | 用户申请存储资源 | Pod 通过 PVC 挂载 PV,解耦存储使用与供给 | |
| StorageClass | 定义存储类型(SSD/HDD、快照策略等) | 支持动态卷供应(Dynamic Provisioning) | |
| 集群与策略(Cluster & Policy) | Namespace | 多租户隔离(dev / test / prod) | 逻辑分区,资源配额和权限可按 Namespace 控制 |
| ResourceQuota | 限制命名空间资源总量(CPU、内存、Pod 数等) | 防止单个团队耗尽集群资源 | |
| LimitRange | 设置 Pod 默认/最小/最大资源请求 | 避免用户提交无资源限制的 Pod | |
| PodDisruptionBudget (PDB) | 保障高可用(自愿中断时最少可用 Pod 数) | 确保滚动升级或节点维护时不中断服务 | |
| Role / RoleBinding | 命名空间级 RBAC 权限控制 | 授权用户/ServiceAccount 操作特定资源 | |
| ClusterRole / ClusterRoleBinding | 集群级权限控制 | 如监控组件读取所有节点信息 | |
| 扩展机制 | CustomResourceDefinition (CRD) | 扩展 K8s API(如 Istio 的 VirtualService、Prometheus 的 ServiceMonitor) | 与自定义控制器(Operator)配合,实现领域自动化 |
| APIService | 注册聚合 API(如 metrics-server) | 将外部服务注册为 K8s API 的子资源 |
Namespace
创建ns.yml
apiVersion: v1
kind: Namespace
metadata:
name: dev
执行命令 kubectl apply -f ns.yml
# 将当前 kubectl 上下文的默认命名空间设为 dev
kubectl config set-context --current --namespace=dev
# 查看当前默认命名空间:
kubectl config view --minify | grep namespace
Pod
K8s 的最小调度单位,一般不直接使用 Pod。
示例:运行一个 Nginx Pod
创建nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev # ← 关键:资源绑定到 dev 命名空间
labels:
app: nginx
spec:
containers:
- name: nginx-app
image: docker.1ms.run/library/nginx:latest
# imagePullPolicy: Never
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
执行命令 kubectl apply -f nginx.yml
Deployment
管理 Pod 的理想方式,提供滚动更新。
示例:运行一个 3 副本的 Web Deployment
创建 nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev # ← 关键:资源绑定到 dev 命名空间
spec:
replicas: 3
selector:
matchLabels:
app: web-demo
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: app
image: docker.1ms.run/library/nginx:latest
执行命令 kubectl apply -f nginx-deployment.yml
Service
提供稳定访问入口,解决 Pod IP 会变的问题。
创建 nginx-service.yml
apiVersion: v1
kind: Service
metadata:
name: web-demo-service
namespace: dev # ← 关键:资源绑定到 dev 命名空间
spec:
selector:
app: web-demo
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
执行命令 kubectl apply -f nginx-service.yml
四 常用 kubectl 命令分类汇总
1. 查看资源(Read)
# 查看 Pod
kubectl get pods
kubectl get pods -n <namespace>
kubectl get pods --all-namespaces
# 查看 Deployment / Service / ConfigMap 等
kubectl get deploy
kubectl get svc
kubectl get cm
kubectl get ns
# 查看命名空间
# 详细描述资源(含事件、挂载、IP 等)
kubectl describe pod <pod-name>
# 实时监听资源变化
kubectl get pods -w
2. 创建与部署(Create / Apply)
# 声明式部署(推荐)
kubectl apply -f my-app.yaml
# 快速创建(仅用于测试)
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
# 从模板生成 YAML(不实际创建)
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml
3. 删除资源(Delete)
kubectl delete pod <pod-name>
kubectl delete -f my-app.yaml
kubectl delete deploy nginx
kubectl delete all --all -n test # 删除命名空间内所有资源(慎用!)
4. 调试与日志(Debug)
# 查看容器日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> --tail=50 # 实时跟踪最后 50 行
# 进入容器执行命令
kubectl exec -it <pod-name> -- sh
kubectl exec <pod-name> -- cat /etc/hosts
# 端口转发(本地访问 Pod 服务)
kubectl port-forward <pod-name> 8080:80
5. 更新与扩缩容(Update / Scale)
# 扩容 Deployment
kubectl scale deploy nginx --replicas=5
# 滚动更新镜像
kubectl set image deploy/nginx nginx=nginx:1.25
# 暂停/恢复 Deployment
kubectl rollout pause deploy/nginx
kubectl rollout resume deploy/nginx
# 查看发布历史 & 回滚
kubectl rollout history deploy/nginx
kubectl rollout undo deploy/nginx
kubectl rollout undo deploy/nginx --to-revision=2
6. 配置与上下文管理
# 查看当前配置
kubectl config view
# 切换上下文(集群/用户)
kubectl config use-context my-cluster
# 设置默认命名空间(避免每次加 -n)
kubectl config set-context --current --namespace=dev
7. 其他实用技巧
# 快速查看集群信息
kubectl cluster-info
# 查看节点资源使用
kubectl top nodes
kubectl top pods
# 获取所有 API 资源类型
kubectl api-resources
# 查看支持的 API 版本
kubectl api-versions
最佳实践建议
- ✅ 生产环境优先使用
kubectl apply+ YAML 文件,便于版本控制(GitOps)。 - ✅ 使用
--dry-run=client预览效果,避免误操作。 - ✅ 为 Pod 设置
resources.requests/limits,防止资源争抢。 - ✅ 结合
kubectl explain学习官方 API 字段含义。 - ❌ 避免在生产中频繁使用命令式创建(如
kubectl run),难以追溯和复现。