組織がマイクロサービスとクラウドネイティブアーキテクチャを利用するにつれて、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. 水平および垂直ポッドオートスケーリング
水平ポッドオートスケーラー(HPA)と垂直ポッドオートスケーラー(VPA)オートスケーリング機能はKubernetesにネイティブに存在しますが、IstioやLinkerdのようなサービスメッシュは、サービス間通信を簡素化し、より効率的にします。
水平ポッドオートスケーラー(HPA)
HPAは、CPU、メモリ、またはカスタムメトリックに応じてポッドのレプリカをスケールします。
例:オートスケーリングのための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
垂直ポッドオートスケーラー (VPA)
垂直ポッドオートスケーラーは、ポッドのランタイムリクエストと制限をスケーリングします。
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
ネットワークポリシー
ポッド間のトラフィックを制約するためにネットワークポリシーを使用し、セキュリティを強化します。
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アノテーションを使用します。
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. レジリエンスの構築
ポッド障害予算 (PDB)
メンテナンスやアップグレード中にポッドの最小可用性を維持するためにPDBを使用します。
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