Kubernetes (K8S)
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩缩容(Pod 数量多了/少了自动调整)和自愈(坏掉的 Pod 会被自动重建)
基本架构
一个 Kubernetes 集群 (Cluster) = 控制平面 + 工作节点 的组合。要使用K8S,要先搭建集群,deployment.yaml
和 service.yaml
要提交到 K8S 集群,由它调度和运行。
控制平面 (Control Plane)
负责管理整个集群,不直接跑应用。
组件 | 作用 | 比喻 |
---|---|---|
API Server | 接收命令(kubectl)、提供统一接口 | 前台服务员 |
etcd | 存储集群所有状态(配置、Pod 列表等) | 账本/数据库 |
Scheduler | 决定 Pod 跑在哪个 Node 上 | 领班 |
Controller Manager | 保证实际状态符合预期(补 Pod、重建失败的 Pod) | 经理 |
工作节点 (Worker Nodes)
实际跑应用容器。
组件 | 作用 |
---|---|
Kubelet | 负责跟 API Server 沟通,并启动/管理容器 |
容器运行时 | 运行容器(Docker、containerd) |
Kube-Proxy | 管理网络规则,实现 Service 的负载均衡 |
graph TD
A[控制平面] --> B[Node 1]
A --> C[Node 2]
A --> D[Node 3]
B --> E[Pod]
B --> F[Pod]
C --> G[Pod]
D --> H[Pod]
K8S 核心概念
Pod
- 最小运行单元,一个 Pod 里可以有 1 个或多个容器。
- 共享网络和存储空间
Deployment
- 管 Pod 的「副本数」和「版本」。
- 支持滚动更新、回滚
Service
- 提供稳定的网络入口(因为 Pod IP 会变)。
- 负载均衡到一组 Pod。
ConfigMap & Secret
- ConfigMap:存储配置信息(非敏感)。
- Secret:存储敏感信息(密码、Token),会加密。
基本使用方式
Deployment(定义 Pod 模板 + 副本数)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # 要 3 个 Pod
selector:
matchLabels:
app: my-app
template: # Pod 模板
metadata:
labels:
app: my-app #给 Pod 打标签,Service 用 selector 找到这些 Pod 做负载均衡
spec:
containers:
- name: my-app #Pod名
image: my-registry/my-app:v1 # ← 指向 CI 推送后的镜像(仓库/名称:标签)
ports:
- containerPort: 8080 #容器对外提供服务的端口
Pod名可能是:my-app-6f7c9d7c5d-abcde
,它里面的容器名:my-app
映射关系:
kind: Deployment
→ 创建一个「Pod 管理器」replicas: 3
→ 保证始终有 3 个 Podtemplate
→ Pod 的样子(运行哪个镜像、开哪个端口)
Service(提供统一访问入口)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 找到所有带 app=my-app 标签的 Pod
ports:
- port: 80 # Service 入口端口
targetPort: 8080 # Pod 里容器的端口
type: LoadBalancer # 暴露给外部访问
映射关系:
selector
→ 绑定到 Deployment 创建的 Pod,根据 Pod 的标签(my-app)ports
→ 用户访问 80 端口,会转发到 Pod 的 8080type: LoadBalancer
→ 提供一个外部 IP 供用户访问
典型工作流程
sequenceDiagram
开发者->>Git: 提交代码
Git->>CI/CD: 触发构建
CI/CD->>镜像仓库: 构建Docker镜像
CI/CD->>K8S: kubectl apply
K8S->>K8S: 创建/更新Pod
K8S->>K8S: 健康检查
K8S->>用户: 服务可用
sequenceDiagram
开发者->>API Server: kubectl apply -f xxx.yaml
API Server->>etcd: 写入期望状态
API Server->>Scheduler: 请求调度
Scheduler->>Node: 分配 Pod 到合适的节点
Node->>Kubelet: 启动容器
Controller Manager->>Cluster: 监控状态并修复
Service->>用户: 提供统一访问入口
👉 过程总结:
- 提交 YAML → API Server 接收并存到 etcd。
- Scheduler 决定 Pod 去哪个 Node。
- Node 上的 Kubelet 把容器启动。
- Controller Manager 盯着数量,缺了就补。
- Service 统一出口,用户不用关心 Pod IP。
常用操作
前提是1:集群必须已经搭好(minikube/kind/k3s/云厂商的 K8S)。
2:kubectl 已经配置好 kubeconfig
3:镜像能拉取到
- 如果是公有镜像(比如 Docker Hub),直接写就行。
- 如果是私有仓库,需要配
imagePullSecrets
。
# 部署应用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# 查看集群资源
kubectl get pods -o wide
kubectl get deployments
kubectl get services
# 扩缩容
kubectl scale deployment/my-app --replicas=5
# 滚动更新
kubectl set image deployment/my-app my-app=my-registry/my-app:v2
# 回滚
kubectl rollout undo deployment/my-app