Wallarm Sidecarのスケーリングと高可用性¶
本ガイドはWallarm Sidecar solutionのスケーリング、高可用性(HA)およびリソースの正しい割り当ての微妙な点に焦点を当てます。これらを効果的に構成することで、Wallarm Sidecarの信頼性とパフォーマンスを向上させ、ダウンタイムを最小限に抑え、効率的なリクエスト処理を実現できます。
構成は大きく二つのセグメントに分類されます:
-
Wallarm Sidecarコントロールプレーン専用の設定
-
サイドカーが注入されたアプリケーションワークロード用の設定
Wallarm Sidecarのスケーリングと高可用性は、標準的なKubernetesのプラクティスに依存します。推奨事項を適用する前に基本を理解するため、次の推奨リンクを参照してください:
Wallarm Sidecarコントロールプレーンのスケーリング¶
Wallarm Sidecarソリューションはcontrollerとpostanalytics (Tarantool)の2つのコンポーネントで構成されます。それぞれに対して、replicas
、requests
、およびpodAntiAffinity
などのKubernetesパラメータを含む個別のスケーリング設定が必要です。
コントローラー¶
Sidecar ControllerはミューテーティングAdmission Webhookとして機能し、アプリケーションのPodにサイドカーコンテナを注入します。ほとんどの場合、HPAスケーリングは不要です。高可用性(HA)展開の場合、次のvalues.yaml
ファイルの設定を検討してください:
-
複数のSidecarポッドインスタンスを使用します。これは
controller.replicaCount
属性で制御します。 -
必要に応じて、コントローラーのPodに予約されたリソースを確保するため、
controller.resources.requests.cpu
およびcontroller.resources.requests.memory
を設定します。 -
必要に応じて、ノード障害時の耐障害性を確保するため、pod anti-affinityを使用してコントローラーポッドを異なるノードに分散させます。
以下は、これらの推奨事項を組み込んだvalues.yaml
ファイル内の調整済みcontroller
セクションの例です:
controller:
replicaCount: 2
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- wallarm-sidecar
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: kubernetes.io/hostname
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 32Mi
Postanalytics (Tarantool)¶
postanalyticsコンポーネントはアプリケーションワークロードに注入されたすべてのサイドカーコンテナからのトラフィックを処理します。このコンポーネントはHPAによるスケーリングはできません。
高可用性(HA)展開の場合、次のvalues.yaml
ファイルの設定を使用して、レプリカ数を手動で調整できます:
-
複数のTarantoolポッドインスタンスを使用します。これは
postanalytics.replicaCount
属性で制御します。 -
アプリケーションワークロードへの予想されるトラフィック量に基づき、ギガバイト(GB)単位で
postanalytics.tarantool.config.arena
を設定します。この設定はTarantoolが使用する最大メモリを決定します。計算ガイドラインについては、他のデプロイオプションに対する同様の推奨事項が参考になります。 -
postanalytics.tarantool.resources.limits
およびpostanalytics.tarantool.resources.requests
をarena
設定と一致させます。ピーク時の需要に対応し、メモリ関連のクラッシュを回避するため、limits
をarena
値以上に設定し、Tarantoolの最適なパフォーマンスのためにrequests
がarena
値と同等またはそれ以上であることを確認します。詳細についてはKubernetes documentationを参照してください。 -
必要に応じて、Tarantoolポッドに専用のリソース割り当てを保証するため、
postanalytics
セクション内の他のすべてのコンテナに対してresources.requests
およびresources.limits
を設定します。これらのコンテナにはpostanalytics.init
、postanalytics.supervisord
、およびpostanalytics.appstructure
が含まれます。 -
必要に応じて、ノード障害時の耐障害性を確保するため、pod anti-affinityを実装してpostanalyticsポッドを異なるノードに分散させます。
以下は、これらの推奨事項を組み込んだvalues.yaml
ファイル内の調整済みpostanalytics
セクションの例です:
postanalytics:
replicaCount: 2
tarantool:
config:
arena: "1.0"
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 100m
memory: 1Gi
init:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
supervisord:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
appstructure:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- wallarm-sidecar
- key: app.kubernetes.io/component
operator: In
values:
- postanalytics
topologyKey: kubernetes.io/hostname
サイドカーコンテナが注入されたアプリケーションワークロードのスケーリング¶
アプリケーションワークロードの管理にHorizontal Pod Autoscaling(HPA)を使用する場合、Wallarm Sidecarによって注入されたコンテナを含む、Pod内のすべてのコンテナに対してresources.requests
を構成することが不可欠です。
前提条件¶
Wallarmコンテナに対してHPAを実装するには、以下の前提条件が満たされていることを確認します:
-
KubernetesクラスターにMetrics Serverが展開され、構成されていること。
-
initコンテナを含む、アプリケーションPod内のすべてのコンテナに対して
resources.request
が構成されていること。
アプリケーションコンテナのリソース割り当てはそのマニフェストに指定される必要があります。Wallarmによって注入されたコンテナに関しては、リソース設定が以下に概説されており、グローバルにおよびPodごとに割り当てることが可能です。
Helmチャートの値を使用したグローバル割り当て¶
コンテナ展開パターン | コンテナ名 | チャート値 |
---|---|---|
分割, 単一 | sidecar-proxy | config.sidecar.containers.proxy.resources |
分割 | sidecar-helper | config.sidecar.containers.helper.resources |
分割, 単一 | sidecar-init-iptables | config.sidecar.initContainers.iptables.resources |
分割 | sidecar-init-helper | config.sidecar.initContainers.helper.resources |
以下はグローバルにリソース(requestsおよびlimits)を管理するためのHelmチャート値の例です:
config:
sidecar:
containers:
proxy:
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
helper:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 300m
memory: 256Mi
initContainers:
helper:
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 300m
memory: 128Mi
iptables:
resources:
requests:
cpu: 50m
memory: 32Mi
limits:
cpu: 100m
memory: 64Mi
Podのアノテーションを使用したPodごとの割り当て¶
コンテナ展開パターン | コンテナ名 | アノテーション |
---|---|---|
単一, 分割 | sidecar-proxy | sidecar.wallarm.io/proxy-{cpu,memory,cpu-limit,memory-limit} |
分割 | sidecar-helper | sidecar.wallarm.io/helper-{cpu,memory,cpu-limit,memory-limit} |
単一, 分割 | sidecar-init-iptables | sidecar.wallarm.io/init-iptables-{cpu,memory,cpu-limit,memory-limit} |
分割 | sidecar-init-helper | sidecar.wallarm.io/init-helper-{cpu,memory,cpu-limit,memory-limit} |
以下は、Podごとの割り当て(requestsおよびlimits)を管理するためのアノテーションの例です(single
コンテナパターンが有効な場合):
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
wallarm-sidecar: enabled
annotations:
sidecar.wallarm.io/proxy-cpu: 200m
sidecar.wallarm.io/proxy-cpu-limit: 500m
sidecar.wallarm.io/proxy-memory: 256Mi
sidecar.wallarm.io/proxy-memory-limit: 512Mi
sidecar.wallarm.io/init-iptables-cpu: 50m
sidecar.wallarm.io/init-iptables-cpu-limit: 100m
sidecar.wallarm.io/init-iptables-memory: 32Mi
sidecar.wallarm.io/init-iptables-memory-limit: 64Mi
spec:
containers:
- name: application
image: kennethreitz/httpbin
ports:
- name: http
containerPort: 80
例¶
以下は、上記の設定を適用したWallarmチャートのvalues.yaml
ファイルの例です。この例は、Wallarmによって注入されたコンテナのリソースがグローバルに割り当てられていることを前提としています。
controller:
replicaCount: 2
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- wallarm-sidecar
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: kubernetes.io/hostname
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 32Mi
postanalytics:
replicaCount: 2
tarantool:
config:
arena: "1.0"
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 100m
memory: 1Gi
init:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
supervisord:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
appstructure:
resources:
limits:
cpu: 250m
memory: 300Mi
requests:
cpu: 50m
memory: 150Mi
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- wallarm-sidecar
- key: app.kubernetes.io/component
operator: In
values:
- postanalytics
topologyKey: kubernetes.io/hostname
config:
sidecar:
containers:
proxy:
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
helper:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 300m
memory: 256Mi
initContainers:
helper:
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 300m
memory: 128Mi
iptables:
resources:
requests:
cpu: 50m
memory: 32Mi
limits:
cpu: 100m
memory: 64Mi