Kubernetes(k8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。以下是其基本原理、使用步骤和注意事项的总结:
一、k8s 基本原理
核心架构
- Master 节点:控制集群的核心组件,包括:
- API Server:所有操作的入口,提供 RESTful API。
- Scheduler:将 Pod 分配到合适的 Node。
- Controller Manager:维护集群状态(如副本数、故障检测)。
- etcd:分布式键值存储,保存集群状态。
- Worker 节点:运行容器化应用,包含:
- kubelet:与 Master 通信,管理 Pod 生命周期。
- kube-proxy:处理网络规则和负载均衡。
- 容器运行时(如 Docker、containerd)。
- Master 节点:控制集群的核心组件,包括:
关键概念
- Pod:最小部署单元,包含一个或多个共享资源的容器。
- Deployment:定义 Pod 的副本数和更新策略。
- Service:为 Pod 提供稳定的网络访问(ClusterIP、NodePort、LoadBalancer)。
- Namespace:逻辑隔离集群资源(如开发、生产环境)。
- ConfigMap/Secret:管理配置和敏感数据。
工作流程
- 用户通过
kubectl
或 API 提交 YAML 描述文件。 - Master 组件协调资源分配,调度 Pod 到 Node。
- kubelet 拉取镜像并启动容器,持续监控状态。
- 用户通过
以下是一个简化的 Kubernetes 架构图,描述 物理机(服务器)、K8s 集群、应用节点 之间的关系,并用文字逐步解释关键组件和交互流程:
Kubernetes 架构图
关键关系说明
物理服务器层
- 提供硬件资源(CPU/内存/存储/网络)。
- 每台物理机部署一个角色:
- Master 节点:运行控制平面组件(API Server、Scheduler 等)。
- Worker 节点:运行应用负载(Pod)。
K8s 集群层
- Master 节点:
- API Server:接收用户或工具(如
kubectl
)的指令。 - Scheduler:决定 Pod 运行在哪个 Worker 节点。
- etcd:存储集群状态(如 Pod、Service 配置)。
- API Server:接收用户或工具(如
- Worker 节点:
- kubelet:与 Master 通信,管理 Pod 生命周期。
- kube-proxy:处理节点上的网络规则(Service 流量转发)。
- Pod:最小调度单元,包含一个或多个容器。
- Master 节点:
应用层
- 每个 Pod 中运行具体的容器化应用(如 Nginx、MySQL)。
- 应用通过 Service 或 Ingress 暴露给外部访问。
交互流程示例
用户部署应用
- 用户通过
kubectl apply -f app.yaml
提交请求到 API Server。 - Scheduler 根据资源情况,将 Pod 分配到 Node1 或 Node2。
- 目标节点的 kubelet 拉取镜像并启动容器。
- 用户通过
应用访问
- 其他 Pod 或外部用户通过 Service(如 ClusterIP)访问应用。
- kube-proxy 负责将请求转发到具体的 Pod。
高可用性
- 若 Node1 宕机,Master 检测到故障后,会在 Node2 上重新调度 Pod。
注意事项
物理机与 K8s 节点的映射
- 生产环境中,建议 Master 节点独占物理机(避免资源竞争)。
- Worker 节点可以跨多台物理机,提高容灾能力。
网络要求
- 所有物理机需在同一网络,确保 Pod 间可通信。
- 避免防火墙阻断 K8s 组件端口(如 6443、10250)。
存储卷
- 如果应用需要持久化数据,需挂载物理机的存储(如 NFS)或云存储(如 AWS EBS)。
通过此架构图,可以清晰看到:
物理机提供资源 → K8s 管理调度 → 应用运行在 Pod 中。
实际部署时,还需考虑网络插件(如 Calico)、负载均衡(如 MetalLB)等组件。
二、使用步骤
1. 安装与初始化
- 安装工具:
kubectl
、minikube
(本地测试)或kubeadm
(生产集群)。 - 初始化集群(以
kubeadm
为例):kubeadm init --apiserver-advertise-address=<MASTER_IP>
- 加入 Worker 节点:
kubeadm join <MASTER_IP>:6443 --token <TOKEN>
2. 部署应用
编写 YAML 文件(例如
deployment.yaml
):apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
应用配置:
kubectl apply -f deployment.yaml
3. 暴露服务
- 创建 Service:
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer
4. 监控与维护
- 查看资源状态:
kubectl get pods,svc,deployments
- 日志与调试:
kubectl logs <pod-name> kubectl describe pod <pod-name>
三、注意事项
资源规划
- 确保 Node 资源(CPU、内存)充足,避免 Pod 因资源不足被驱逐。
- 使用
Resource Requests/Limits
限制容器资源占用:resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "1Gi"
高可用性
- 生产环境需部署多 Master 节点,避免单点故障。
- 使用
Horizontal Pod Autoscaler (HPA)
自动扩缩容。
安全实践
- 启用 RBAC 控制权限,避免过度授权。
- 定期更新 k8s 版本,修复安全漏洞。
- 敏感数据使用
Secret
而非 ConfigMap。
网络与存储
- 选择适合的 CNI 插件(如 Calico、Flannel)解决网络隔离。
- 持久化存储使用
PersistentVolume (PV)
和PersistentVolumeClaim (PVC)
。
故障排查
- 常见问题:
- Pod 一直
Pending
:检查资源或调度约束。 - CrashLoopBackOff:查看容器日志排查应用错误。
- Pod 一直
- 使用
kubectl events
查看集群事件。
- 常见问题:
备份与恢复
- 定期备份
etcd
数据:etcdctl snapshot save backup.db
- 定期备份
四、常用命令速查
功能 | 命令示例 |
---|---|
查看 Pod | kubectl get pods -A |
进入容器 | kubectl exec -it <pod> -- bash |
删除资源 | kubectl delete -f file.yaml |
查看 Service | kubectl get svc |
滚动更新 | kubectl set image deploy/nginx nginx=nginx:1.20 |
通过理解这些原理和步骤,可以高效使用 k8s 管理容器化应用。生产环境中建议结合监控工具(Prometheus)和日志系统(ELK)完善运维体系。