零基础理解k8s
# Kubernetes入门指南## 📖 目录- [1. Kubernetes是什么](#1-kubernetes是什么)
- [2. 快速上手实践](#2-快速上手实践)
- [3. 适用场景](#3-适用场景)
- [4. 实现机制与系统架构](#4-实现机制与系统架构)
- [5. 功能模块及作用](#5-功能模块及作用)
- [6. 最佳实践](#6-最佳实践)
- [7. 总结](#7-总结)---## 1. Kubernetes是什么### 1.1 基本概念**Kubernetes(简称K8s)** 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发,现在由云原生计算基金会(CNCF)维护。### 1.2 为什么需要Kubernetes?在容器化时代,我们面临以下挑战:- **容器管理复杂性**:手动管理大量容器变得困难
- **服务发现**:容器间如何相互发现和通信
- **负载均衡**:如何分配流量到多个容器实例
- **自动扩缩容**:根据负载自动调整容器数量
- **故障恢复**:容器崩溃时如何自动重启
- **滚动更新**:如何零停机更新应用Kubernetes解决了这些问题,让容器管理变得简单高效。### 1.3 核心特性- ✅ **自动化部署**:一键部署应用到集群
- ✅ **服务发现**:自动发现和注册服务
- ✅ **负载均衡**:智能分配流量
- ✅ **自动扩缩容**:根据CPU/内存使用率自动调整
- ✅ **滚动更新**:零停机更新应用
- ✅ **故障自愈**:自动重启失败的容器
- ✅ **配置管理**:统一管理配置和密钥
- ✅ **存储编排**:自动挂载存储卷---## 2. 快速上手实践### 2.1 在线体验环境我们将使用 [Killercoda Kubernetes Playground](https://killercoda.com/playgrounds/scenario/kubernetes) 进行实践,这是一个免费的在线Kubernetes学习环境。### 2.2 环境准备1. **访问在线环境**- 打开浏览器,访问:https://killercoda.com/playgrounds/scenario/kubernetes- 点击"Start Scenario"开始2. **验证环境**```bash# 检查Kubernetes版本kubectl version --client# 查看集群信息kubectl cluster-info# 查看节点状态kubectl get nodes
2.3 第一个应用部署
步骤1:创建Deployment
# 创建一个nginx部署
kubectl create deployment nginx-app --image=nginx:1.20# 查看部署状态
kubectl get deployments# 查看Pod状态
kubectl get pods
步骤2:暴露服务
# 创建Service暴露应用
kubectl expose deployment nginx-app --port=80 --type=NodePort# 查看服务
kubectl get services# 获取访问地址
kubectl get service nginx-app -o wide
步骤3:访问应用
# 获取节点IP和端口
kubectl get nodes -o wide
kubectl get service nginx-app# 使用curl访问(替换为实际的IP和端口)
curl http://<NODE_IP>:<NODE_PORT>
2.4 扩缩容实践
# 扩容到3个副本
kubectl scale deployment nginx-app --replicas=3# 查看Pod分布
kubectl get pods -o wide# 缩容到1个副本
kubectl scale deployment nginx-app --replicas=1
2.5 滚动更新
# 更新镜像版本
kubectl set image deployment/nginx-app nginx=nginx:1.21# 查看更新状态
kubectl rollout status deployment/nginx-app# 查看更新历史
kubectl rollout history deployment/nginx-app# 回滚到上一版本
kubectl rollout undo deployment/nginx-app
2.6 清理资源
# 删除部署和服务
kubectl delete deployment nginx-app
kubectl delete service nginx-app# 确认删除
kubectl get all
3. 适用场景
3.1 微服务架构
场景描述:将单体应用拆分为多个微服务
K8s优势:
- 每个微服务独立部署和扩展
- 服务间通信通过Service自动发现
- 故障隔离,单个服务故障不影响整体
示例:
用户服务 (user-service) → 2个副本
订单服务 (order-service) → 3个副本
支付服务 (payment-service) → 2个副本
3.2 云原生应用
场景描述:构建云原生、可扩展的应用
K8s优势:
- 自动扩缩容应对流量波动
- 多云部署避免厂商锁定
- 声明式配置管理
3.3 DevOps和CI/CD
场景描述:自动化部署和持续集成
K8s优势:
- 与Jenkins、GitLab CI等工具集成
- 蓝绿部署、金丝雀发布
- 环境一致性保证
3.4 大数据和机器学习
场景描述:运行大数据处理和ML训练任务
K8s优势:
- 支持GPU资源调度
- 批处理作业管理
- 资源隔离和配额管理
3.5 不适合的场景
❌ 简单应用:单机应用不需要容器编排
❌ 资源受限:小团队或预算有限的项目
❌ 学习成本:团队缺乏容器化经验
4. 实现机制与系统架构
4.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes集群 │
├─────────────────────────────────────────────────────────────┤
│ Master节点 (控制平面) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ API Server │ │ Scheduler │ │ Controller │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ │
│ │ etcd │ │
│ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Worker节点 (数据平面) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ kubelet │ │ kube-proxy │ │ Container │ │
│ │ │ │ │ │ Runtime │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
4.2 Master节点组件
API Server
- 作用:集群的统一入口,处理所有API请求
- 功能:认证、授权、准入控制、数据验证
- 特点:RESTful API,支持多种客户端
etcd
- 作用:分布式键值存储,保存集群状态
- 功能:配置存储、服务发现、协调
- 特点:强一致性、高可用
Scheduler
- 作用:调度器,决定Pod运行在哪个节点
- 功能:资源评估、亲和性规则、污点容忍
- 特点:可插拔、可扩展
Controller Manager
- 作用:控制器管理器,维护集群期望状态
- 功能:节点管理、副本控制、端点管理
- 特点:多控制器、自动修复
4.3 Worker节点组件
kubelet
- 作用:节点代理,管理Pod生命周期
- 功能:容器启动、健康检查、资源监控
- 特点:与API Server通信、本地执行
kube-proxy
- 作用:网络代理,实现Service功能
- 功能:负载均衡、服务发现、网络规则
- 特点:iptables/ipvs模式
Container Runtime
- 作用:容器运行时,运行容器
- 支持:Docker、containerd、CRI-O
- 功能:镜像管理、容器生命周期
4.4 工作流程
- 用户提交请求 → API Server
- API Server验证 → 存储到etcd
- Scheduler调度 → 选择合适节点
- kubelet执行 → 启动容器
- Controller监控 → 维护期望状态
5. 功能模块及作用
5.1 核心资源对象
Pod
# Pod示例
apiVersion: v1
kind: Pod
metadata:name: nginx-pod
spec:containers:- name: nginximage: nginx:1.20ports:- containerPort: 80
作用:
- 最小部署单元
- 包含一个或多个容器
- 共享网络和存储
Deployment
# Deployment示例
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.20
作用:
- 管理Pod副本
- 滚动更新
- 回滚功能
Service
# Service示例
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app: nginxports:- port: 80targetPort: 80type: ClusterIP
作用:
- 服务发现
- 负载均衡
- 网络抽象
5.2 配置管理
ConfigMap
# ConfigMap示例
apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:database_url: "mysql://localhost:3306"debug_mode: "true"
作用:
- 存储配置数据
- 环境变量注入
- 配置文件挂载
Secret
# Secret示例
apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:username: YWRtaW4= # base64编码password: cGFzc3dvcmQ=
作用:
- 存储敏感信息
- 加密存储
- 安全传输
5.3 存储管理
PersistentVolume (PV)
# PV示例
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: slowhostPath:path: /data/mysql
PersistentVolumeClaim (PVC)
# PVC示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: slow
作用:
- 持久化存储
- 动态供应
- 存储抽象
5.4 网络功能
Ingress
# Ingress示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: app-ingress
spec:rules:- host: app.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: app-serviceport:number: 80
作用:
- HTTP/HTTPS路由
- SSL终止
- 域名管理
5.5 监控和日志
资源监控
- Metrics Server:收集资源使用指标
- Prometheus:监控和告警
- Grafana:可视化仪表板
日志管理
- Fluentd:日志收集
- Elasticsearch:日志存储
- Kibana:日志分析
6. 最佳实践
6.1 应用设计原则
容器化最佳实践
# 多阶段构建
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=productionFROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
原则:
- 使用多阶段构建减小镜像大小
- 非root用户运行
- 健康检查配置
- 资源限制设置
应用配置
# 资源限制示例
apiVersion: v1
kind: Pod
spec:containers:- name: appimage: myapp:latestresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"livenessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 30periodSeconds: 10
6.2 安全最佳实践
RBAC权限控制
# Role示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]# RoleBinding示例
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-pods
subjects:
- kind: Username: janeapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
网络安全
- Network Policies:网络隔离
- Pod Security Standards:Pod安全标准
- 镜像扫描:安全漏洞检测
6.3 运维最佳实践
监控和告警
# ServiceMonitor示例(Prometheus)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: app-monitor
spec:selector:matchLabels:app: myappendpoints:- port: metricsinterval: 30s
备份和恢复
- etcd备份:定期备份集群状态
- 应用数据备份:PV数据备份
- 配置备份:YAML文件版本控制
灾难恢复
- 多区域部署:跨可用区部署
- 数据复制:关键数据多副本
- 故障转移:自动故障切换
6.4 性能优化
资源优化
# HPA自动扩缩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: app-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70
网络优化
- Service Mesh:Istio/Linkerd
- CNI插件:Calico/Flannel
- 负载均衡:优化流量分配
7. 总结
7.1 学习路径建议
-
基础阶段(1-2周)
- 理解容器和Docker基础
- 学习Kubernetes基本概念
- 完成在线实验
-
实践阶段(2-4周)
- 部署真实应用
- 学习YAML配置
- 掌握常用命令
-
进阶阶段(1-2个月)
- 学习高级功能
- 掌握运维技能
- 了解生态工具
7.2 推荐资源
官方文档
- Kubernetes官方文档
- Kubernetes概念
- Kubernetes任务
学习平台
- Killercoda:在线实验环境
- Katacoda:交互式教程
- Play with Kubernetes:免费集群
认证考试
- CKA:Certified Kubernetes Administrator
- CKAD:Certified Kubernetes Application Developer
- CKS:Certified Kubernetes Security Specialist
7.3 常见问题
Q: Kubernetes学习曲线陡峭吗?
A: 初期有一定难度,但通过实践和系统学习可以掌握。
Q: 小团队是否需要Kubernetes?
A: 取决于应用复杂度和团队规模,简单应用可能不需要。
Q: 如何选择Kubernetes发行版?
A: 根据需求选择,云厂商托管服务通常更适合初学者。
Q: Kubernetes与Docker Swarm的区别?
A: Kubernetes功能更强大但复杂,Docker Swarm更简单但功能有限。
🎯 下一步行动
- 立即开始:访问 Killercoda 进行实践
- 深入学习:阅读官方文档和教程
- 项目实践:在个人项目中应用Kubernetes
- 社区参与:加入Kubernetes社区,参与讨论
本文档将持续更新,欢迎反馈和建议。祝您Kubernetes学习之旅愉快! 🚀
