随着组织采用微服务和云原生架构,Kubernetes正在成为容器编排的标准。尽管Kubernetes简化了部署和管理容器的过程,但规模化的工作负载使生活变得复杂,因此必须采用健壮的最佳实践。
在本文中,我将介绍在Kubernetes中进行规模化工作负载管理的技术策略和最佳实践。
了解Kubernetes规模化挑战
在Kubernetes中扩展意味着要克服诸如:
- 集群资源调度等障碍。在节点之间优化CPU、内存和磁盘的使用。
- 网络复杂性。在大型分布式环境中保持一致的服务间通信。
- 故障和可伸缩性。处理故障期间的可用性以及在扩展/收缩场景下的可用性。
- 运维开销。消除诸如扩展、监控和负载均衡等重复操作。
- 规模化安全。在大型集群中采用基于角色的访问控制(RBAC)、秘钥和网络策略。
在本文中,我将通过结合Kubernetes的原生功能和辅助工具的示例来克服这些障碍。
功能和工具
1. 高效调度集群资源
规模化性能直接由规模化资源的分配决定。在Kubernetes中有各种优化资源使用的功能:
请求和限制
声明CPU和内存的请求和限制将导致资源的公平分配,并且不允许邻居占用所有资源。
apiVersion v1
kind Pod
metadata
name resource-demo
spec
containers
name app
image nginx
resources
requests
memory"128Mi"
cpu"500m"
limits
memory"256Mi"
cpu"1"
最佳实践:
- 使用配额来强制在命名空间级别执行。
- 定期使用
kubectl top
分析使用情况,并对限制进行任何必要的调整。
集群自动缩放器
自动缩放器根据工作负载需求动态调整集群节点数。
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/cluster-autoscaler-<version>/cluster-autoscaler.yaml
最佳实践:
- 为节点适当标记自动缩放器操作。
- 监视缩放行为以避免过度提供。
2. 水平和垂直Pod自动缩放
水平Pod自动缩放器(HPA)和垂直Pod自动缩放器(VPA)自动缩放能力在Kubernetes中是原生的,但像Istio和Linkerd这样的服务网格使得服务间通信更加简单高效。
水平Pod自动缩放器(HPA)
HPA根据CPU、内存或自定义指标扩展Pod的副本。
示例:用于自动缩放的CPU使用率
apiVersion autoscaling/v2
kind HorizontalPodAutoscaler
metadata
name hpa-example
spec
scaleTargetRef
apiVersion apps/v1
kind Deployment
name web-app
minReplicas2
maxReplicas10
metrics
type Resource
resource
name cpu
target
type Utilization
averageUtilization50
垂直 Pod 自动缩放器(VPA)
垂直 Pod 自动缩放器会调整 Pod 的运行时请求和限制。
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-<version>/vpa.yaml
3. 在规模上优化网络
服务网格
像 Istio 和 Linkerd 这样的服务网格通过抽象服务负载、重试和加密问题,使服务之间的通信更容易和更高效。
示例:用于流量路由的 Istio VirtualService
apiVersion networking.istio.io/v1beta1
kind VirtualService
metadata
name example-route
spec
hosts
example.com
http
route
destination
host service-v1
weight80
destination
host service-v2
weight20
网络策略
使用网络策略约束 Pod 之间的流量,以增强安全性。
apiVersion networking.k8s.io/v1
kind NetworkPolicy
metadata
name restrict-traffic
spec
podSelector
matchLabels
app web-app
policyTypes
Ingress
ingress
from
podSelector
matchLabels
role backend
4. 增强可观察性
在控制 Kubernetes 的更大层面上,可观察性至关重要。使用 Prometheus、Grafana 和 Jaeger 等工具来获取指标、日志和跟踪信息。
Prometheus 指标
使用 Prometheus 注释来收集 Pod 的指标。
apiVersion v1
kind Pod
metadata
annotations
prometheus.io/scrape"true"
prometheus.io/port"8080"
labels
app monitored-app
spec
containers
name app
image monitored-app latest
ports
containerPort8080
5. 构建弹性
Pod 中断预算(PDB)
使用 PDB 来在维护和升级期间保持 Pod 的最低可用性。
apiVersion policy/v1
kind PodDisruptionBudget
metadata
name pdb-example
spec
minAvailable2
selector
matchLabels
app web-app
滚动更新
分阶段推出更新,以确保没有任何停机时间。
kubectl set image deployment/web-app web-app=web-app:v2 --record
kubectl rollout status deployment/web-app
6. 在规模上保护 Kubernetes 安全
RBAC 配置
使用 RBAC 来限制用户和应用程序的权限。
apiVersion rbac.authorization.k8s.io/v1
kind Role
metadata
namespace default
name pod-reader
rules
apiGroups""
resources"pods"
verbs"get" "list" "watch"
密钥管理
利用 Kubernetes Secrets 安全地管理敏感信息。使用 Kubernetes Secrets 安全地管理敏感信息。
apiVersion v1
kind Secret
metadata
name db-credentials
type Opaque
data
username dXNlcg==
password cGFzc3dvcmQ=
7. 自动化的 GitOps
利用 GitOps 与 ArgoCD 和 Flux 等工具。在 Git 存储库中版本化和存储 Kubernetes 清单,并让集群自动与其同步。
8. 大规模测试
使用 K6 和 Locust 等工具模拟高规模工作负载。在测试环境中验证配置、资源分配和扩展。
9. 大规模存储处理
动态持久卷分配
自动化动态为应用程序提供存储。
apiVersion storage.k8s.io/v1
kind StorageClass
metadata
name fast-storage
provisioner kubernetes.io/aws-ebs
parameters
type gp2
fsType ext4
10. 优化用于 Kubernetes 的 CI/CD 流水线
构建和推送 Docker 镜像
使用 Jenkins、GitHub Actions 和 GitLab CI 等 CI/CD 工具优化创建和发布容器镜像的流程。
结论
要扩展 Kubernetes,必须充分利用资源、自动化、可观测性和强大的安全流程的组合。通过充分利用 Kubernetes 本地功能并将其与辅助工具结合,您的工作负载可以在任何规模下高性能、安全且具有弹性。
Source:
https://dzone.com/articles/best-practices-managing-kubernetes-at-scale