一、Kubernetes 组件概述
1. 控制平面组件(Control Plane)
控制平面是整个集群的“大脑”,负责集群的决策、调度、状态维护等核心功能。
- kube-apiserver: 集群统一入口,处理所有 API 请求,是各组件通信的中枢。
- etcd: 集群数据库,存储所有配置信息与状态数据,保证一致性。
- kube-scheduler: 根据资源、亲和性、节点状态等策略,为 Pod 选择最合适的节点。
- kube-controller-manager: 运行各种控制器(如副本控制器、节点控制器),确保集群处于期望状态。
- cloud-controller-manager: 对接云服务 API,管理云厂商特有资源(如负载均衡、云盘挂载等)。
2. 节点组件(Node Components)
节点层是应用运行的“计算层”,负责实际的容器运行与网络转发。
- kubelet: 运行在每个节点上,负责 Pod 生命周期管理和容器状态上报。
- kube-proxy: 维护节点网络规则,支持 Service 与 Pod 的负载均衡与转发。
- 容器运行时(CRI): 提供容器运行环境,如 Docker、containerd,负责容器的创建、启动和停止。
3. 核心组件功能速览
| 组件名称 | 核心作用 |
|---|---|
| kube-apiserver | 集群 API 入口,协调各组件通信 |
| etcd | 存储集群配置与状态,提供一致性数据存储 |
| kube-scheduler | 基于策略调度 Pod 到合适节点 |
| kube-controller-manager | 运行控制器,维持集群期望状态 |
| cloud-controller-manager | 对接云平台 API,管理负载均衡与存储等资源 |
| kubelet | 管理 Pod 生命周期并上报节点状态 |
| kube-proxy | 维护网络规则,实现通信与负载均衡 |
| 容器运行时(CRI) | 运行容器的底层环境 |
二、常用命令汇总
1.命令解释
top # 查看节点 CPU、内存使用情况
drain # 排空节点
taint # 给节点添加/移除污点
describe # 查看资源详细信息
logs # 查看容器日志
exec # 在容器中执行命令
cp # 在本地与 Pod 间复制文件
apply # 通过配置文件创建或更新资源
label # 添加或修改标签
2.简写速查表
| 命令用途 | 常用缩写形式 | 示例命令 | 主要作用 |
|---|---|---|---|
| 查看 Pod | kubectl get po |
kubectl get po -n kube-system |
查看 Pod 状态 |
| 查看详细信息 | kubectl describe |
kubectl describe po nginx-xxx |
查看资源详细状态 |
| 查看日志 | kubectl logs |
kubectl logs -f nginx-xxx |
查看容器运行日志 |
| 进入容器 | kubectl exec |
kubectl exec -it nginx-xxx -- sh |
进入 Pod 内部执行命令 |
| 打标签 | kubectl label |
kubectl label node node1 env=prod |
给节点或 Pod 添加标签 |
| 打污点 | kubectl taint |
kubectl taint nodes node1 key=value:NoSchedule |
设置调度限制(防止调度) |
| 容忍污点 | YAML中 tolerations |
在 Pod spec 中添加容忍配置 | 允许 Pod 调度到被污点节点 |
| 查看事件 | kubectl get ev |
kubectl get ev --sort-by=.metadata.creationTimestamp |
查看集群事件变化 |
| 应用配置 | kubectl apply -f |
kubectl apply -f deploy.yaml |
创建或更新资源 |
| 删除资源 | kubectl delete |
kubectl delete po nginx-xxx |
删除资源对象 |
如果只记快捷命令,可以掌握以下常用别名(适合高频操作):
kubectl get po # 获取Pod
kubectl describe po # 查看详情
kubectl logs po # 查日志
kubectl exec -it po # 进容器
kubectl label node # 打标签
kubectl taint node # 加污点
kubectl apply -f xxx # 应用配置
kubectl delete po # 删除资源
三、Namespace(命名空间)
命名空间用于在逻辑上隔离资源,方便多用户、多项目协作。
Kubernetes 启动后会创建以下默认命名空间:
- default:用户默认使用的命名空间。
- kube-node-lease:存储节点心跳信息。
- kube-public:公开可读资源。
- kube-system:Kubernetes 系统组件使用。
kubectl create ns test
kubectl delete ns test
四、Pod(最小部署单元)
Pod 是 Kubernetes 中最小的调度与运行单元,可包含一个或多个容器。 同一个 Pod 内的容器共享网络与存储命名空间。
# 创建 Pod
kubectl run my-pod --image=nginx:latest
# 查看 Pod
kubectl get po -A
kubectl get po -n kube-system
# 查看详情与日志
kubectl describe pod my-pod
kubectl logs my-pod
# 删除 Pod
kubectl delete pod my-pod
五、Deployment(部署控制器)
Deployment 负责应用的部署与更新,提供副本管理、自愈、滚动升级等能力。
kubectl create deploy my-tomcat --image=tomcat
kubectl get deploy
kubectl delete deploy my-tomcat
1. 自愈机制
删除一个 Pod 后,Deployment 会自动拉起新的 Pod:
kubectl delete pod my-tomcat-xxxx
2. 多副本与扩缩容
kubectl create deploy my-tomcat --replicas=3
kubectl scale deploy my-tomcat --replicas=5
六、Service(服务抽象)
Service 用于为一组 Pod 提供统一访问入口,支持内部通信或外部暴露。
kubectl expose deployment my-tomcat --port=8080 --type=NodePort
kubectl get svc -o wide
1. 四类 Service 类型
| 类型 | 说明 | 访问方式 | 适用场景 |
|---|---|---|---|
| ClusterIP(默认) | 仅在集群内访问 | <ClusterIP>:<Port> |
集群内部通信 |
| NodePort | 在节点端口暴露服务 | <NodeIP>:<NodePort> |
内外网测试、简易暴露 |
| LoadBalancer | 云负载均衡器方式暴露 | 云 LB 公网地址 | 云端生产环境 |
| ExternalName | 映射外部域名 | 通过 DNS 访问外部域名 | 外部数据库或 API 接入 |
七、Pod 与 Deployment 区别
| 对比项 | kubectl create pod |
kubectl create deployment |
|---|---|---|
| 创建对象 | Pod | Deployment(包含 ReplicaSet 与 Pod) |
| 管理方式 | 命令式,一次性创建 | 声明式,自动维持期望状态 |
| 自愈能力 | 无 | 有(Pod 异常会自动重建) |
| 扩缩容 | 不支持 | 支持 scale 命令 |
| 滚动更新与回滚 | 不支持 | 支持 |
| 适用场景 | 临时测试 | 长期运行服务 |
| 最佳实践 | 开发调试阶段使用 | 生产部署推荐使用 |
八、更新与回滚机制
1. 滚动重启
kubectl rollout restart deployment/my-app
kubectl rollout status deployment/my-app
2. 滚动升级
kubectl set image deployment/my-app my-container=my-image:v2
kubectl rollout status deployment/my-app
3. 回退历史版本
kubectl rollout history deployment/my-app
kubectl rollout undo deployment/my-app
4. 重建更新(Recreate)
kubectl patch deployment/my-app -p '{"spec":{"strategy":{"type":"Recreate"}}}'
kubectl set image deployment/my-app my-container=my-image:v2
5. 蓝绿部署(Blue-Green)
# 旧版本(蓝)
kubectl create deploy my-app-blue --image=my-image:v1 --replicas=3
kubectl expose deploy my-app-blue --port=80 --name=my-service
# 新版本(绿)
kubectl create deploy my-app-green --image=my-image:v2 --replicas=3
kubectl patch svc my-service -p '{"spec":{"selector":{"app":"my-app-green"}}}'
6. 金丝雀发布(Canary)
kubectl create deploy my-app --image=my-image:v1 --replicas=3
kubectl create deploy my-app-canary --image=my-image:v2 --replicas=1
kubectl label deploy/my-app-canary app=my-app
7. 更新方式对比表
| 特性 | 滚动重启 | 滚动升级 | 回退历史版本 | 重建更新 | 蓝绿部署 | 金丝雀发布 |
|---|---|---|---|---|---|---|
| 核心逻辑 | 重建 Pod 不改配置 | 逐步替换 Pod | 恢复历史版本 | 删除后重建 | 双环境切换流量 | 少量新版本灰度 |
| 服务中断 | 否 | 否 | 否 | 是 | 否 | 否 |
| 资源消耗 | 中 | 中 | 中 | 低 | 高 | 中 |
| 操作复杂度 | 低 | 低 | 低 | 低 | 高 | 中 |
| 典型场景 | 重启服务 | 正常升级 | 快速回滚 | 停机更新 | 高可用验证 | 灰度验证 |