隨著組織開始使用微服務和雲原生架構,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 虛擬服務用於路由流量
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
使用ArgoCD和Flux等工具進行GitOps。 將Kubernetes清單的版本存儲在Git存儲庫中,並使集群與其自動同步。
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