AwsLinker/docs/zh-CN/kubernetes-container-management.md
2025-09-16 17:19:58 +08:00

653 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 'Kubernetes容器管理实战从入门到企业级应用'
description: 'Kubernetes作为容器编排的标准正在重塑现代应用的部署和管理方式。本文深入解析Kubernetes的核心概念、架构设计和企业级应用实践。'
excerpt: 'Kubernetes作为容器编排的标准正在重塑现代应用的部署和管理方式...'
category: 'tech'
tags: ['Kubernetes', '容器化', '微服务', 'DevOps', '云原生']
author: '合肥懂云运维团队'
date: '2024-01-22'
image: '/images/news/kubernetes-container-management.webp'
locale: 'zh-CN'
slug: 'kubernetes-container-management'
featured: false
---
# Kubernetes容器管理实战从入门到企业级应用
Kubernetes已经成为容器编排领域的事实标准为现代应用提供了强大的部署、扩缩容和管理能力。本文将带您深入了解Kubernetes的核心概念和企业级应用实践。
## Kubernetes概述
Kubernetes简称K8s是一个开源的容器编排平台由Google开发并捐献给CNCF基金会。它提供了容器化应用的自动化部署、扩缩容和管理功能。
### 核心价值
- **自动化部署**:自动化容器的部署和更新流程
- **弹性扩缩容**:根据负载自动调整应用实例数量
- **自我修复**:自动重启失败的容器,替换不健康的节点
- **服务发现**:内置的负载均衡和服务发现机制
- **存储编排**:自动挂载存储系统
- **密钥管理**:安全地管理敏感信息
## 核心架构组件
### 控制平面Control Plane
#### API Server
- 集群的API网关和前端接口
- 处理所有REST操作
- 身份验证和授权
- 数据验证和序列化
#### etcd
- 分布式键值存储
- 保存集群的所有配置数据
- 服务发现和配置共享
- 强一致性保证
#### Controller Manager
- 运行控制器进程
- 节点控制器、复制控制器
- 端点控制器、服务账户控制器
- 监控集群状态并执行修复操作
#### Scheduler
- Pod调度器
- 根据资源需求选择合适的节点
- 考虑约束条件和亲和性规则
- 负载均衡和资源优化
### 工作节点Worker Nodes
#### kubelet
- 节点代理
- 与API Server通信
- 管理Pod生命周期
- 容器健康检查
#### kube-proxy
- 网络代理
- 实现服务的负载均衡
- 维护网络规则
- 处理集群内外的网络通信
#### Container Runtime
- 容器运行时
- Docker、containerd、CRI-O
- 拉取镜像和运行容器
- 容器生命周期管理
## 核心资源对象
### Pod
Pod是Kubernetes中最小的部署单元
```yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
```
特点:
- 一个或多个紧密耦合的容器
- 共享网络和存储
- 原子性的部署和调度单位
### 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:1.20
ports:
- containerPort: 80
```
功能:
- 滚动更新和回滚
- 副本数量管理
- 应用版本控制
### Service
服务发现和负载均衡:
```yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
```
类型:
- ClusterIP集群内部访问
- NodePort节点端口暴露
- LoadBalancer外部负载均衡器
- ExternalNameDNS CNAME记录
### ConfigMap和Secret
配置和密钥管理:
```yaml
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "mysql://db:3306/app"
debug: "true"
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4= # base64编码
password: cGFzc3dvcmQ=
```
## 存储管理
### 持久卷PV和持久卷声明PVC
```yaml
# PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-storage
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: fast-ssd
hostPath:
path: /data
---
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: fast-ssd
```
### 存储类StorageClass
动态存储供应:
```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
zones: us-west-2a, us-west-2b
```
## 网络管理
### 网络模型
Kubernetes采用扁平网络模型
- 每个Pod都有唯一的IP地址
- Pod之间可以直接通信
- 不需要NAT转换
- 支持跨节点通信
### 网络插件CNI
常用的CNI插件
- **Calico**:性能优秀,支持网络策略
- **Flannel**:简单易用,适合小型集群
- **Weave**:加密通信,适合安全要求高的环境
- **Cilium**基于eBPF性能和安全性俱佳
### Ingress
HTTP/HTTPS流量路由
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
```
## 安全管理
### RBAC基于角色的访问控制
```yaml
# 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: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
```
### 网络策略
控制Pod间的网络通信
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
```
### Pod安全标准
```yaml
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
containers:
- name: app
image: nginx
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
```
## 应用部署策略
### 滚动更新
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
replicas: 5
template:
spec:
containers:
- name: app
image: app:v2.0
```
### 蓝绿部署
通过Service切换实现零停机部署
```bash
# 部署绿色版本
kubectl apply -f green-deployment.yaml
# 验证绿色版本
kubectl get pods -l version=green
# 切换流量到绿色版本
kubectl patch service app-service -p '{"spec":{"selector":{"version":"green"}}}'
# 清理蓝色版本
kubectl delete deployment blue-deployment
```
### 金丝雀发布
```yaml
# 主版本90%流量)
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-stable
spec:
replicas: 9
template:
metadata:
labels:
app: myapp
version: stable
---
# 金丝雀版本10%流量)
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
version: canary
```
## 监控和日志
### 监控体系
#### Prometheus监控栈
```yaml
# ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: metrics
interval: 30s
path: /metrics
```
#### 关键指标
- **集群级别**节点资源使用率、API Server延迟
- **节点级别**CPU、内存、磁盘、网络使用率
- **Pod级别**:容器资源使用、重启次数
- **应用级别**:请求量、响应时间、错误率
### 日志管理
#### ELK/EFK栈
```yaml
# Fluentd DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
```
#### 日志最佳实践
- 结构化日志格式JSON
- 统一日志等级
- 包含关键上下文信息
- 避免敏感信息泄露
## 运维最佳实践
### 资源管理
#### 资源请求和限制
```yaml
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
```
#### 水平Pod自动扩缩容HPA
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
```
### 健康检查
```yaml
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
```
### 优雅关闭
```yaml
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 15"]
```
## 故障排查
### 常用调试命令
```bash
# 查看Pod状态
kubectl get pods -o wide
# 查看Pod详细信息
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name> -f
# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash
# 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp
# 查看资源使用情况
kubectl top nodes
kubectl top pods
```
### 常见问题和解决方案
#### Pod一直处于Pending状态
可能原因:
- 资源不足
- 节点选择器不匹配
- 存储卷不可用
解决方法:
```bash
kubectl describe pod <pod-name>
kubectl get nodes
kubectl get pv,pvc
```
#### Pod频繁重启
可能原因:
- 应用程序错误
- 健康检查配置不当
- 资源限制过低
解决方法:
```bash
kubectl logs <pod-name> --previous
kubectl describe pod <pod-name>
```
## 企业级应用场景
### 微服务架构
在微服务架构中Kubernetes提供
- 服务注册与发现
- 负载均衡
- 配置管理
- 服务间通信
- 故障隔离
### CI/CD集成
与DevOps工具链集成
- Jenkins、GitLab CI、GitHub Actions
- Helm图表管理
- Kustomize配置管理
- ArgoCD GitOps
### 多环境管理
- 命名空间隔离
- 环境特定配置
- 资源配额管理
- 网络策略
## 性能优化
### 集群优化
- 节点规格选择
- 网络插件优化
- 存储性能调优
- etcd性能优化
### 应用优化
- 镜像大小优化
- 多阶段构建
- 资源配置优化
- 启动时间优化
## 总结
Kubernetes作为云原生时代的基础设施标准为现代应用提供了强大的容器编排能力。成功应用Kubernetes需要
1. **深入理解架构**:掌握核心组件和工作原理
2. **最佳实践应用**:遵循安全、监控、资源管理最佳实践
3. **持续学习优化**:跟上技术发展,持续优化配置
4. **团队技能建设**:培养专业的运维和开发能力
通过合理的架构设计和运维实践Kubernetes能够为企业带来更高的部署效率、更好的资源利用率和更强的系统可靠性。
如需Kubernetes集群建设和应用迁移服务欢迎联系我们的专业团队。