Kubernetes 1.27 ve önceki sürümlerde, pod çalışma zamanı sırasında konteyner parametrelerini güncellemek için PodSpec'in yeniden gönderilmesi gerekir; bu işlem pod'un silinip yeniden oluşturulmasını tetikler. ACK, çalışan bir pod'un CPU, bellek ve disk G/Ç yalıtım parametrelerini cgroup dosyaları aracılığıyla geçici olarak değiştirmenize olanak tanır — yeniden başlatma gerekmez.
Bu özellik yalnızca geçici acil durum ayarlamaları içindir. Düzenli kaynak yönetimi için CPU Burst, CPU topolojiye duyarlı zamanlama veya kaynak profil oluşturma kullanın.
Çalışma biçimi
ACK, kaynak değişikliklerini ack-koordinator'a iletmek için kind: Cgroups türünde özel bir kaynak tanımı (CRD) kullanır. Bir Cgroups kaynağı uyguladığınızda, düğümdeki koordlet yeni değerleri doğrudan cgroup dosyalarına yazar; bu işlem Kubernetes zamanlayıcısını ve kubelet uzlaştırma döngüsünü atlar. Pod'un PodSpec'i değişmez; yalnızca düğümdeki cgroup değerleri güncellenir.
Belirli bir pod'u hedeflemek için spec.pod alanını veya bir Deployment'taki tüm pod'ları hedeflemek için spec.deployment alanını kullanın.
Ön koşullar
Aşağıdakileri sağlayın:
kubectl, ACK kümesine bağlıdır.
ack-koordinator 0.5.0 veya sonraki bir sürümü yüklüdür.
Faturalandırma
ack-koordinator'u yüklemek ve kullanmak ücretsizdir. Aşağıdaki durumlarda ek ücretler uygulanabilir:
Çalışan düğüm kaynakları: ack-koordinator, yüklendikten sonra çalışan düğümlerde kaynak tüketen yönetilmeyen bir eklentidir. Eklentiyi yüklerken her modül için kaynak isteklerini belirtin.
Prometheus izleme ölçümleri: Enable Prometheus monitoring metrics for ACK-Koordinator seçeneğini etkinleştirir ve Managed Service for Prometheus kullanırsanız, ölçümler özel ölçümler olarak faturalandırılır. Ücretler küme boyutuna ve uygulama sayısına bağlıdır. Bu özelliği etkinleştirmeden önce Prometheus örneği faturalandırması belgesini inceleyin ve tüketimi izlemek için kullanım sorgusu aracını kullanın.
Sınırlamalar
| Kısıtlama | Ayrıntı |
|---|---|
| Kapsam | Yalnızca geçici ayarlamalar. Pod'un PodSpec'ini güncellemez ve pod yeniden başlatıldığında kalıcı olmaz. |
| Küme sürümü (bellek) | Küme sürümü 1.22 veya üzeri için ack-koordinator v1.5.0-ack1.14 veya sonraki bir sürüm gerekir. Önceki eklenti sürümleri yalnızca 1.22 veya önceki sürümleri çalıştıran kümeleri destekler. |
| Disk G/Ç | Çalışan düğümler Alibaba Cloud Linux (Alinux) çalıştırmalıdır. |
| cgroup v1 arabellekli G/Ç | cgroup v1'de blkio sınırları yalnızca doğrudan G/Ç için geçerlidir. Arabellekli G/Ç'yi sınırlamak için Alinux'ta cgroup writeback özelliğini etkinleştirin. |
| cgroup v2 | cgroup v2 ortamlarında blkio üzerinden disk G/Ç kısıtlaması desteklenmez. |
| CPU sınırı | Geçici CPU sınırı ayarlamaları için bkz. resource-controller'dan ack-koordinator'a geçiş. |
Bellek sınırını değiştirin
Pod'u yeniden başlatmadan OOM (Out Of Memory) sonlandırmalarını önlemek için bir pod'un bellek sınırını artırın. Bu örnekte sınır 1 GiB'den 5 GiB'ye yükseltilmektedir.
-
Aşağıdaki içeriğe sahip
pod-demo.yamldosyasını oluşturun.apiVersion: v1 kind: Pod metadata: name: pod-demo spec: containers: - name: pod-demo image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 resources: requests: cpu: 1 memory: "50Mi" limits: cpu: 1 memory: "1Gi" # Initial memory limit: 1 GiB command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"] -
Pod'u dağıtın.
kubectl apply -f pod-demo.yaml -
İlk bellek sınırını doğrulayın. cgroup yolu, pod UID'sinden ve konteyner kimliğinden oluşturulur.
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesBeklenen çıktı:
10737418241073741824= 1 GiB, pod tanımındakispec.containers.resources.limits.memorydeğeriyle eşleşir. -
Yeni bellek sınırını ayarlamak için
cgroups-sample.yamldosyasını oluşturun.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample spec: pod: name: pod-demo namespace: default containers: - name: pod-demo memory: 5Gi # New memory limit: 5 GiB -
Cgroups kaynağını uygulayın.
kubectl apply -f cgroups-sample.yaml -
Güncellenmiş bellek sınırını doğrulayın.
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podaf44b779_41d8_43d5_a0d8_8a7a0b17****.slice/memory.limit_in_bytesBeklenen çıktı:
53687091205368709120= 5 GiB, Cgroups kaynağındakispec.pod.containers.memorydeğeriyle eşleşir. -
Pod'un yeniden başlatılmadığını onaylayın.
kubectl describe pod pod-demoEventsbölümünde yeniden başlatma olayı olmadığını, yalnızca orijinal zamanlama ve başlatma olaylarının bulunduğunu onaylayın:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 36m default-scheduler Successfully assigned default/pod-demo to cn-hangzhou.192.168.0.50 Normal AllocIPSucceed 36m terway-daemon Alloc IP 192.XX.XX.51/24 took 4.490542543s Normal Pulling 36m kubelet Pulling image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" Normal Pulled 36m kubelet Successfully pulled image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" in 2.204s (2.204s including waiting). Image size: 7755078 bytes. Normal Created 36m kubelet Created container pod-demo Normal Started 36m kubelet Started container pod-demoYeniden başlatma olayının olmaması, bellek sınırının yerinde güncellendiğini doğrular.
CPU çekirdek bağlama kapsamını değiştirin
Daha sıkı kaynak yalıtımı için bir pod'u belirli CPU çekirdeklerine bağlayın. Bu örnekte, bir pod'un tüm 32 çekirdekten (0–31) sadece 2–3 numaralı çekirdeklere erişimi kısıtlanmaktadır.
Üretim ortamında kalıcı CPU çekirdek bağlama için bunun yerine CPU topolojiye duyarlı zamanlama kullanın.
-
Aşağıdaki içeriğe sahip
pod-cpuset-demo.yamldosyasını oluşturun.apiVersion: v1 kind: Pod metadata: name: pod-cpuset-demo spec: containers: - name: pod-cpuset-demo image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 resources: requests: memory: "50Mi" limits: memory: "1000Mi" cpu: 0.5 command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "2", "--vm-hang", "1"] -
Pod'u dağıtın.
kubectl apply -f pod-cpuset-demo.yaml -
Geçerli CPU çekirdek bağlamasını kontrol edin. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpusBeklenen çıktı:
0-310-31ifadesi, konteynerin tüm 32 CPU çekirdeğini kullanabileceği anlamına gelir. -
CPU bağlamasını ayarlamak için
cgroups-sample-cpusetpod.yamldosyasını oluşturun.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 # Restrict the pod to CPU cores 2 and 3 -
Cgroups kaynağını uygulayın.
kubectl apply -f cgroups-sample-cpusetpod.yaml -
Güncellenmiş CPU bağlamasını doğrulayın.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpusBeklenen çıktı:
2-3Konteyner, Cgroups kaynağındaki
spec.pod.containers.cpuset-cpusdeğeriyle eşleşen şekilde 2–3 numaralı çekirdeklere bağlanmıştır. -
Pod'un yeniden başlatılmadığını onaylayın.
kubectl describe pod pod-cpuset-demoEventsbölümü, koordlet'ten gelen birCPUSetBindolayı içerir ancak yeniden başlatma olayı içermez:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m7s default-scheduler Successfully assigned default/pod-cpuset-demo to cn-hangzhou.192.XX.XX.50 Normal AllocIPSucceed 7m5s terway-daemon Alloc IP 192.XX.XX.56/24 took 2.060752512s Normal Pulled 7m5s kubelet Container image "registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4" already present on machine Normal Created 7m5s kubelet Created container pod-cpuset-demo Normal Started 7m5s kubelet Started container pod-cpuset-demo Normal CPUSetBind 84s koordlet set cpuset 2-3 to container pod-cpuset-demo success
Disk G/Ç parametrelerini değiştirin
Çalışan düğümler Alinux çalıştırmalıdır. cgroup v1'de blkio sınırları yalnızca doğrudan G/Ç için geçerlidir. Arabellekli G/Ç'yi sınırlamak için Alinux'ta cgroup writeback özelliğini etkinleştirin. cgroup v2'de desteklenmez.
Bu örnek, bir fio iş yükü dağıtır ve yazma aktarım hızını bir cgroup dosyası aracılığıyla sınırlar.
-
Aşağıdaki içeriğe sahip
fio-demo.yamldosyasını oluşturun. Ana bilgisayar dizini/mntpod içinde/datakonumuna monte edilir ve/dev/vda1cihazına eşlenir.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"] # Run a sequential write test on disk I/O using fio 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 volumes: - name: pvc hostPath: path: /mnt -
Uygulamayı dağıtın.
kubectl apply -f fio-demo.yaml -
Bir cgroup dosyası kullanarak yazma aktarım hızını sınırlayın.
-
/dev/vda1cihazında saniye başına bayt (BPS) yazma sınırı ayarlamak içincgroups-sample-fio.yamldosyasını oluşturun.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-sample-fio spec: deployment: name: fio-demo namespace: default containers: - name: fio-demo blkio: # BPS limit in bytes per second (e.g., 1048576 = 1 MiB/s) device_write_bps: [{device: "/dev/vda1", value: "1048576"}] -
Cgroups kaynağını uygulayın.
kubectl apply -f cgroups-sample-fio.yaml -
Güncellenmiş disk G/Ç sınırını doğrulayın. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.
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_deviceBeklenen çıktı:
253:0 1048576/dev/vda1(253:0cihazı) için yazma BPS sınırı1048576(1 MiB/s) olarak ayarlanmıştır. Pod yeniden başlatılmamıştır.
-
Disk izleme verilerini Prometheus'ta görüntülemek için konsola gidin ve Operations > Prometheus Monitoring seçeneğini belirleyin. Application Monitoring sekmesinde örnek uygulamayı filtreleyin. Bkz. Alibaba Cloud Prometheus İzlemeye Bağlanma ve Yapılandırma.
Değişiklikleri Deployment düzeyinde uygulayın
Yukarıdaki tüm yordamlar Deployment düzeyinde de çalışır; spec.pod yerine spec.deployment kullanın. Bu örnek, bir Deployment'a CPU çekirdek bağlaması uygular.
-
Aşağıdaki içeriğe sahip
go-demo.yamldosyasını oluşturun. Bu Deployment, her biri 0.5 CPU kullanan iki çoğaltma çalıştırır.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: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 command: ["stress"] args: ["--vm", "1", "--vm-bytes", "556M", "-c", "1", "--vm-hang", "1"] imagePullPolicy: Always resources: requests: cpu: 0.5 limits: cpu: 0.5 -
Uygulamayı dağıtın.
kubectl apply -f go-demo.yaml -
Deployment'ın pod'larını belirli CPU çekirdeklerine bağlamak için
cgroups-cpuset-sample.yamldosyasını oluşturun.apiVersion: resources.alibabacloud.com/v1alpha1 kind: Cgroups metadata: name: cgroups-cpuset-sample spec: deployment: # Targets a Deployment, not a single pod name: go-demo namespace: default containers: - name: go-demo cpuset-cpus: 2,3 # Bind to CPU cores 2 and 3 -
Cgroups kaynağını uygulayın.
kubectl apply -f cgroups-cpuset-sample.yaml -
Pod'lardan birinin CPU bağlamasını doğrulayın. Yol, pod UID'sinden ve konteyner kimliğinden oluşturulur.
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod06de7408_346a_4d00_ba25_02833b6c****.slice/cri-containerd-733a0dc93480eb47ac6c5abfade5c22ed41639958e3d304ca1f85959edc3****.scope/cpuset.cpusBeklenen çıktı:
2-3Konteyner, Cgroups kaynağındaki
spec.deployment.containers.cpuset-cpusdeğeriyle eşleşen şekilde 2–3 numaralı çekirdeklere bağlanmıştır.
Sonraki adımlar
CPU Burst: Konteynerler kullanılmayan CPU zaman dilimlerini biriktirir ve trafik artışları sırasında harcayarak gecikme süresini azaltır ve hizmet kalitesini iyileştirir. Bkz. CPU Burst ilkesini etkinleştirme.
CPU topolojiye duyarlı zamanlama: CPU bağlam değiştirme ek yükünü ve NUMA arası bellek erişimini ortadan kaldırmak için pod'ları zamanlama aşamasında belirli CPU çekirdeklerine sabitleyin. Bkz. CPU topolojiye duyarlı zamanlamayı etkinleştirme.
Dinamik kaynak aşırı satışı: Tahsis edilmiş ancak kullanılmayan kaynakları geri kazanın ve bunları daha düşük öncelikli iş yüklerinin kullanımına sunun. Uygulamalar arasında performans etkileşimini önlemek için tek düğümlü QoS ilkeleriyle birleştirin. Bkz. Dinamik kaynak aşırı satışını etkinleştirme.
Kaynak profil oluşturma: Konteyner istekleri ve sınırları için doğru boyutlandırma önerileri almak amacıyla geçmiş kullanım verilerini analiz edin. Bkz. Kaynak profil oluşturma.