1. Kubernetes 容器编排平台解析
Kubernetes(简称K8s)作为当前最主流的容器编排系统,已经成为云原生应用的事实标准。我第一次在生产环境部署K8s集群是在2017年,当时为了应对微服务架构下的数百个容器实例管理需求。经过这些年的实践,K8s确实从根本上解决了容器化应用的部署、扩展和运维难题。
2. 核心架构与工作原理
2.1 控制平面组件
Master节点包含以下核心组件:
- API Server:集群的"前门",处理所有REST请求
- etcd:分布式键值存储,保存集群所有配置数据
- Scheduler:决定Pod应该运行在哪个Node上
- Controller Manager:运行各种控制器(如Deployment控制器)
生产环境建议:etcd需要配置SSD存储并保持奇数个节点(3/5/7),这是保证集群高可用的关键
2.2 工作节点组件
每个Worker Node包含:
- kubelet:与API Server通信的节点代理
- kube-proxy:维护节点网络规则
- 容器运行时:如Docker、containerd等
bash复制# 查看节点组件状态
kubectl get componentstatuses
3. 关键资源对象详解
3.1 Pod设计与实践
Pod是K8s最小调度单元,特点包括:
- 包含1个或多个容器(通常1个主容器+多个sidecar)
- 共享网络命名空间和存储卷
- 通过标签(Label)进行组织管理
yaml复制apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
3.2 Deployment管理策略
Deployment提供了声明式的更新方式,支持:
- 滚动更新(RollingUpdate)
- 回滚(Rollback)
- 副本数伸缩(ReplicaSet)
bash复制# 查看部署历史
kubectl rollout history deployment/my-app
4. 网络与存储方案
4.1 网络模型实现
K8s网络需要满足:
- 每个Pod拥有独立IP(IP-per-Pod)
- 所有Pod可以不经过NAT互相通信
- 所有节点可以与所有Pod通信
常用CNI插件对比:
| 插件 | 特点 | 适用场景 |
|---|---|---|
| Calico | BGP路由,策略丰富 | 企业级生产环境 |
| Flannel | 简单易用,Overlay网络 | 中小规模集群 |
| Cilium | eBPF高性能,安全策略 | 高性能需求场景 |
4.2 持久化存储方案
PV/PVC工作流程:
- 管理员创建PV(物理存储资源)
- 用户创建PVC(存储资源请求)
- K8s将PVC绑定到合适的PV
yaml复制apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/mysql
5. 生产环境最佳实践
5.1 集群部署方案
主流部署方式对比:
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| kubeadm | 官方工具,简单 | 需要手动配置 | 测试/中小规模 |
| kOps | AWS集成好 | 云平台锁定 | AWS环境 |
| RKE | 简单可靠 | 仅支持Docker | 本地/云混合 |
5.2 监控与日志方案
推荐监控栈:
- Prometheus(指标收集)
- Grafana(可视化)
- Alertmanager(告警)
日志收集架构:
code复制Fluentd(日志收集) -> Elasticsearch(存储) -> Kibana(展示)
6. 常见问题排查
6.1 Pod启动失败排查流程
- 查看Pod描述信息
bash复制kubectl describe pod/<pod-name>
- 检查容器日志
bash复制kubectl logs <pod-name> [-c <container-name>]
- 验证镜像拉取
bash复制kubectl get events --sort-by=.metadata.creationTimestamp
6.2 网络连接问题检查
- 验证Service是否存在
bash复制kubectl get svc <service-name>
- 检查Endpoint是否正常
bash复制kubectl get endpoints <service-name>
- 测试DNS解析
bash复制kubectl run -it --rm --image=busybox test --restart=Never -- nslookup <service-name>
7. 性能优化技巧
7.1 资源请求与限制
合理设置requests和limits:
yaml复制resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
经验值:Java应用建议内存limit是request的1.5-2倍
7.2 HPA自动伸缩配置
示例HPA配置:
yaml复制apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
8. 安全加固措施
8.1 RBAC权限控制
创建ServiceAccount并绑定Role:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: ci-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: ci-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ci-role-binding
subjects:
- kind: ServiceAccount
name: ci-user
roleRef:
kind: Role
name: ci-role
apiGroup: rbac.authorization.k8s.io
8.2 Pod安全策略
示例PSP配置:
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
hostNetwork: false
hostIPC: false
hostPID: false
9. 版本升级策略
9.1 升级路径规划
K8s版本支持策略:
- 每个版本提供约1年的补丁支持
- 最多支持3个次要版本同时维护
- 建议保持与最新版本差距不超过2个次要版本
升级前检查清单:
- 备份etcd数据
- 检查API废弃通知
- 验证工作负载兼容性
- 准备回滚方案
9.2 使用kubeadm升级
分步升级流程:
bash复制# 1. 升级kubeadm
yum install -y kubeadm-1.20.0 --disableexcludes=kubernetes
# 2. 升级控制平面
kubeadm upgrade apply v1.20.0
# 3. 升级kubelet和kubectl
yum install -y kubelet-1.20.0 kubectl-1.20.0 --disableexcludes=kubernetes
systemctl daemon-reload
systemctl restart kubelet
10. 生态系统工具链
10.1 CI/CD集成方案
主流工具对比:
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Argo CD | GitOps理念,声明式 | 需要审计追踪的环境 |
| Tekton | 云原生Pipeline | 复杂构建流程 |
| Jenkins X | 全自动CI/CD | 快速交付需求 |
10.2 服务网格选择
Istio核心组件:
- Envoy:数据平面代理
- Pilot:配置分发
- Citadel:证书管理
- Galley:配置验证
安装精简版Istio:
bash复制istioctl install --set profile=demo