ack-koordinatorコンポーネントを使用すると、ポッドのメモリパラメータを動的に変更できます。 ack-koordinatorを使用して、ポッドのCPUパラメーター、メモリパラメーター、およびディスクIOPS制限を変更できます。 このトピックでは、ack-koordinatorを使用してポッドのリソースパラメーターを動的に変更する方法について説明します。
前提条件
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
ack-koordinator (FKA ack-slo-manager) 0.5.0以降がインストールされています。 ack-koordinatorのインストール方法の詳細については、「ack-koordinator (ack-slo-manager) 」をご参照ください。
説明ack-koordinatorは、リソースコントローラーに基づいてアップグレードおよび最適化されます。 resource-controllerを使用する場合は、ack-koordinatorをインストールする前にアンインストールする必要があります。 詳細については、「Uninstall resource-controller」をご参照ください。
課金ルール
ack-koordinatorコンポーネントをインストールして使用する場合、料金はかかりません。 ただし、次のシナリオでは料金が請求される場合があります。
ack-koordinatorは、インストール後にワーカーノードリソースを占有する管理対象外のコンポーネントです。 コンポーネントのインストール時に、各モジュールが要求するリソースの量を指定できます。
既定では、ack-koordinatorは、リソースプロファイリングやきめ細かいスケジューリングなどの機能のモニタリングメトリックをPrometheusメトリックとして公開します。 ack-koordinatorのPrometheusメトリクスを有効にし、PrometheusのManaged Serviceを使用する場合、これらのメトリクスはカスタムメトリクスと見なされ、料金が課金されます。 料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheusメトリクスを有効にする前に、Prometheusのマネージドサービスの課金概要トピックを読んで、カスタムメトリクスの無料クォータと課金ルールを確認することをお勧めします。 リソース使用量を監視および管理する方法の詳細については、「リソース使用量と請求書」をご参照ください。
背景情報
Kubernetesクラスターで実行されているポッドのコンテナーパラメーターを変更する場合は、PodSpecパラメーターを変更して変更を送信する必要があります。 ただし、変更を送信すると、ポッドは削除され、再作成されます。 ack-koordinatorを使用すると、ポッドを再起動することなく、ポッドのリソースパラメータを動的に変更できます。
シナリオ
この機能は、一時的な調整が必要なシナリオに適しています。 たとえば、ポッドのメモリ使用量が増加します。 この場合、メモリ不足 (OOM) キラーがトリガーされないように、ポッドのメモリ制限を増やす必要があります。 一般的なO&M操作を実行するには、Container Service for Kubernetes (ACK) が提供する関連機能を使用することを推奨します。 詳細については、「CPU Burst」、「Topology-aware CPU scheduling」、および「Resource profiling」をご参照ください。
メモリ制限の変更
cgroupsを使用してポッドのメモリ制限を動的に変更するには、次の手順を実行します。
Kubernetes 1.22以前でのみ、メモリ制限を変更できます。 他のリソースパラメーターは、すべてのKubernetesバージョンで変更できます。
一般的な要件を満たすようにCPU制限を変更する場合は、CPUバースト機能を使用することを推奨します。 この機能は、ポッドのCPU制限を自動的に変更できます。 詳細については、「CPU Burst」をご参照ください。 ポッドのCPU制限を動的に変更する場合は、「resource-controllerからack-koordinatorへのアップグレード」をご参照ください。
次のyamlテンプレートを使用してpod-demo. YAMLファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: pod-demo spec: containers: - name: pod-demo image: polinux/stress resources: requests: cpu: 1 memory: "50Mi" limits: cpu: 1 memory: "1Gi" # Set the memory limit to 1 GB. command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
次のコマンドを実行して、pod-demoポッドをクラスターにデプロイします。
kubectl apply -f pod-demo.yaml
次のコマンドを実行して、コンテナの元のメモリ制限を照会します。
# The actual path consists of the UID of the pod and the ID of the container. cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes
期待される出力:
# In this example, 1073741824 is returned, which is the result of 1 × 1024 × 1024 × 1024. This indicates that the original memory limit of the container is 1 GB. 1073741824
出力は、コンテナーの元のメモリ制限が1 GBであることを示しています。これは、手順1で作成したYAMLファイルの
spec.containers.resources.limits.memory
パラメーターの値と同じです。次のyamlテンプレートを使用して、cgroups-sample. YAMLファイルを作成します。
テンプレートは、コンテナのメモリ制限を変更するために使用されます。
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample spec: pod: name: pod-demo namespace: default containers: - name: pod-demo memory: 5Gi # Change the memory limit of the pod to 5 GB.
次のコマンドを実行して、cgroups-sampleオブジェクトをクラスターにデプロイします。
kubectl apply -f cgroups-sample.yaml
次のコマンドを実行して、変更の送信後にコンテナの新しいメモリ制限を照会します。
# The actual path consists of the UID of the pod and the ID of the container. cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytes
期待される出力:
# In this example, 5368709120 is returned, which is the result of 5 × 1024 × 1024 × 1024. This indicates that the new memory limit of the container is 5 GB. 5368709120
出力は、コンテナーのメモリ制限が5 GBであることを示しています。これは、手順4で作成したYAMLファイルの
spec.pod.containers.memory
パラメーターの値と同じです。次のコマンドを実行して、ポッドのステータスを照会します。
kubectl describe pod pod-demo
期待される出力:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 13m default-scheduler Successfully assigned default/pod-demo to cn-zhangjiakou.192.168.3.238 Normal Pulling 13m kubelet, cn-zhangjiakou.192.168.3.238 Pulling image "polinux/stress" Normal Pulled 13m kubelet, cn-zhangjiakou.192.168.3.238 Successfully pulled image "polinux/stress"
出力は、ポッドが正常に実行され、再起動
イベント
が生成されないことを示します。
ポッドにバインドされているvCoresを変更する
cgroupsを使用して、vCoresのシリアル番号を指定してvCoresをポッドにバインドできます。 ポッドにバインドされているvCoresを変更するには、次の手順を実行します。
一般的なケースでは、トポロジ対応のCPUスケジューリングを使用して、CPU依存ワークロードのCPUリソースを管理することをお勧めします。 詳細については、「Topology-aware CPU scheduling」をご参照ください。
次のyamlテンプレートを使用して、pod-cpuset-demo. YAMLファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: pod-cpuset-demo spec: containers: - name: pod-cpuset-demo image: polinux/stress resources: requests: memory: "50Mi" limits: memory: "1000Mi" cpu: 0.5 command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "2", "--vm-hang", "1"]
次のコマンドを実行して、pod-cpuset-demoオブジェクトをクラスターにデプロイします。
kubectl apply -f pod-cpuset-demo.yaml
次のコマンドを実行して、コンテナーにバインドされているvCoresを照会します。
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus
期待される出力:
0-31
出力は、vCoresをコンテナにバインドする前に、コンテナで使用できるvCoresのシリアル番号が0から31の範囲であることを示しています。
を作成します。Create acgroups-sample-cpusetpod.yamlファイルに次のYAMLテンプレートを追加します。
YAMLファイルは、ポッドにバインドされているvCoresを指定します。
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample-cpusetpod spec: pod: name: pod-cpuset-demo namespace: default containers: - name: pod-cpuset-demo cpuset-cpus: 2-3 # Bind vCore 2 and vCore 3 to the pod.
次のコマンドを実行して、cgroups-sample-cpusetpodオブジェクトをクラスターにデプロイします。
kubectl apply -f cgroups-sample-cpusetpod.yaml
次のコマンドを実行して、変更の送信後にコンテナにバインドされているvCoresを照会します。
# The actual path consists of the UID of the pod and the ID of the container. cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus
期待される出力:
2-3
出力は、vCore 2とvCore 3がコンテナにバインドされていることを示しています。 コンテナーにバインドされているvCoresは、手順4で作成したYAMLファイルの
spec.pod.containers.cpuset-cpus
パラメーターで指定されているvCoresと同じです。
配置レベルのパラメーターの変更
cgroupsを使用してデプロイメントレベルのパラメーターを変更するには、次の手順を実行します。
を作成します。Create ago-demo.yamlファイルに次のYAMLテンプレートを追加します。
展開は、ストレステストプログラムを実行する2つのポッドを作成します。 各ポッドはvCores 0.5要求します。
apiVersion: apps/v1 kind: Deployment metadata: name: go-demo labels: app: go-demo spec: replicas: 2 selector: matchLabels: app: go-demo template: metadata: labels: app: go-demo spec: containers: - name: go-demo image: polinux/stress command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"] imagePullPolicy: Always resources: requests: cpu: 0.5 limits: cpu: 0.5
次のコマンドを実行して、クラスターにgo-demo Deploymentをデプロイします。
kubectl apply -f go-demo.yaml
を作成します。Create acgroups-cpuset-sample.yamlファイルに次のYAMLテンプレートを追加します。
YAMLファイルは、ポッドにバインドされているvCoresを指定します。
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-cpuset-sample spec: deployment: name: go-demo namespace: default containers: - name: go-demo cpuset-cpus: 2,3 # Bind vCore 2 and vCore 3 to the pods.
次のコマンドを実行して、cgroups-cpuset-sampleをクラスターにデプロイします。
kubectl apply -f cgroups-cpuset-sample.yaml
次のコマンドを実行して、変更の送信後にコンテナにバインドされているvCoresを照会します。
# The actual path consists of the UID of the pod and the ID of the container. cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod06de7408_346a_4d00_ba25_02833b6c****.slice/cri-containerd-733a0dc93480eb47ac6c5abfade5c22ed41639958e3d304ca1f85959edc3****.scope/cpuset.cpus
期待される出力:
2-3
出力は、vCore 2とvCore 3がコンテナにバインドされていることを示しています。 コンテナーにバインドされているvCoresは、手順3で作成したYAMLファイルの
spec.de ployment.containers.cpuset-cpus
パラメーターで指定されているvCoresと同じです。
ディスクIOPSの変更
ポッドのディスクIOPSを変更する場合は、管理するワーカーノードのオペレーティングシステムとしてAlibaba Cloud Linuxを使用する必要があります。 ポッドのディスクIOPSを変更するには、次の手順を実行します。
cgroup v1でblkio制限を指定すると、OSカーネルはポッドの直接I/Oのみを制限します。 OSカーネルは、ポッドのバッファリングされたI/Oを制限しません。 ポッドのバッファリングされたI/Oを制限するには、cgroup v2を使用するか、Alibaba Cloud Linuxのcgroupライトバック機能を有効にします。 詳細については、「cgroupライトバック機能の有効化」をご参照ください。
次のYAMLテンプレートを使用してI/O集中型アプリケーションを作成します。
ホストディレクトリ /mntをポッドにマウントします。 対応するディスクのデバイス名は /dev/vda1です。
apiVersion: apps/v1 kind: Deployment metadata: name: fio-demo labels: app: fio-demo spec: selector: matchLabels: app: fio-demo template: metadata: labels: app: fio-demo spec: containers: - name: fio-demo image: registry.cn-zhangjiakou.aliyuncs.com/acs/fio-for-slo-test:v0.1 command: ["sh", "-c"] # Use Fio to perform write stress tests on the disk. args: ["fio -filename=/data/test -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=12000 -group_reporting -name=mytest"] volumeMounts: - name: pvc mountPath: /data # The disk volume is mounted to the /data path. volumes: - name: pvc hostPath: path: /mnt
次のコマンドを実行して、クラスターにfio-demo Deploymentをデプロイします。
kubectl apply -f fio-demo.yaml
ディスクIOPSを制御するために使用されるCgroupsオブジェクトをデプロイして、ポッドのスループットを制限します。
を作成します。Create acgroups-sample-fio.yamlファイルに次のYAMLテンプレートを追加します。
YAMLファイルでは、/dev/vda1デバイスのIOPS制限をbit/sで指定します。
apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample-fio spec: deployment: name: fio-demo namespace: default containers: - name: fio-demo blkio: # The IOPS limit in bit/s. Example: 1048576, 2097152, or 3145728. device_write_bps: [{device: "/dev/vda1", value: "1048576"}]
次のコマンドを実行して、変更の送信後にディスクのIOPS制限を照会します。
# The actual path consists of the UID of the pod and the ID of the container. cat /sys/fs/cgroup/blkio/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod0840adda_bc26_4870_adba_f193cd00****.slice/cri-containerd-9ea6cc97a6de902d941199db2fcda872ddd543485f5f987498e40cd706dc****.scope/blkio.throttle.write_bps_device
期待される出力:
253:0 1048576
出力は、ディスクのIOPS制限が
1048576
ビット /秒であることを示しています。
ノードのモニタリングデータを表示します。
図は、ディスクのIOPS制限が、手順3で作成したYAMLファイルの
device_write_bps
パラメーターで指定された値に変更されていることを示しています。 変更を送信してもポッドは再起動されません。