การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร
จะประหยัดต้นทุนคลาวด์เมื่อทำงานกับ Kubernetes ได้อย่างไร ไม่มีวิธีแก้ปัญหาที่ถูกต้องเพียงวิธีเดียว แต่บทความนี้จะอธิบายเครื่องมือต่างๆ ที่สามารถช่วยให้คุณจัดการทรัพยากรได้อย่างมีประสิทธิภาพมากขึ้น และลดต้นทุนการประมวลผลบนระบบคลาวด์
ฉันเขียนบทความนี้โดยคำนึงถึง Kubernetes สำหรับ AWS แต่จะนำไปใช้กับผู้ให้บริการคลาวด์รายอื่นๆ (เกือบ) ในลักษณะเดียวกันทุกประการ ฉันสมมติว่าคลัสเตอร์ของคุณมีการกำหนดค่าการปรับขนาดอัตโนมัติแล้ว (
บทความนี้จะครอบคลุม:
- ทำความสะอาดทรัพยากรที่ไม่ได้ใช้ (
kube-ภารโรง ) - ลดมาตราส่วนในช่วงนอกเวลาทำงาน (
kube-downscaler ) - ใช้การปรับขนาดอัตโนมัติแนวนอน (HPA)
- ลดการสำรองทรัพยากรส่วนเกิน (
รายงานทรัพยากร kube , วีพีเอ) - การใช้อินสแตนซ์ Spot
ทำความสะอาดทรัพยากรที่ไม่ได้ใช้
การทำงานในสภาพแวดล้อมที่เร่งรีบเป็นสิ่งที่ดีมาก เราต้องการองค์กรด้านเทคโนโลยี
(เฮนนิ่งจาคอบส์:
ซิซ่า:
(คำพูด) Corey Quinn:
ตำนาน: บัญชี AWS ของคุณเป็นฟังก์ชันของจำนวนผู้ใช้ที่คุณมี
ข้อเท็จจริง: คะแนน AWS ของคุณขึ้นอยู่กับจำนวนวิศวกรที่คุณมี
อีวาน คูร์โนซอฟ (ตอบกลับ):
ข้อเท็จจริง: คะแนน AWS ของคุณเป็นฟังก์ชันของจำนวนสิ่งที่คุณลืมปิดการใช้งาน/ลบ)
- กฎทั่วทั้งคลัสเตอร์สามารถกำหนดเวลาสูงสุดในการใช้งาน (TTL) สำหรับการปรับใช้ PR/การทดสอบ
- ทรัพยากรแต่ละรายการสามารถใส่คำอธิบายประกอบด้วยภารโรง/ttl ได้ เช่น เพื่อลบขัดขวาง/ต้นแบบโดยอัตโนมัติหลังจาก 7 วัน
กฎทั่วไปถูกกำหนดไว้ในไฟล์ YAML เส้นทางของมันถูกส่งผ่านพารามิเตอร์ --rules-file
ใน kube-ภารโรง นี่คือกฎตัวอย่างในการลบเนมสเปซทั้งหมดด้วย -pr-
ในนามหลังจากผ่านไปสองวัน:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
ตัวอย่างต่อไปนี้ควบคุมการใช้ป้ายกำกับแอปพลิเคชันบนพ็อด Deployment และ StatefulSet สำหรับการปรับใช้/StatefulSets ใหม่ทั้งหมดในปี 2020 แต่ในขณะเดียวกันก็อนุญาตให้ดำเนินการทดสอบโดยไม่มีป้ายกำกับนี้เป็นเวลาหนึ่งสัปดาห์:
- id: require-application-label
# удалить deployments и statefulsets без метки "application"
resources:
- deployments
- statefulsets
# см. http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7d
เรียกใช้การสาธิตแบบจำกัดเวลาเป็นเวลา 30 นาทีบนคลัสเตอร์ที่รัน kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
แหล่งที่มาของต้นทุนที่เพิ่มขึ้นอีกประการหนึ่งคือปริมาณถาวร (AWS EBS) การลบ Kubernetes StatefulSet จะไม่ลบวอลุ่มถาวร (PVC - PersistentVolumeClaim) ปริมาณ EBS ที่ไม่ได้ใช้อาจส่งผลให้มีค่าใช้จ่ายหลายร้อยดอลลาร์ต่อเดือนได้อย่างง่ายดาย Kubernetes Janitor มีคุณสมบัติในการทำความสะอาด PVC ที่ไม่ได้ใช้ ตัวอย่างเช่น กฎนี้จะลบ PVC ทั้งหมดที่ไม่ได้ติดตั้งโดยโมดูลและไม่ได้อ้างอิงโดย StatefulSet หรือ CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor สามารถช่วยให้คุณรักษาคลัสเตอร์ของคุณให้สะอาดและป้องกันไม่ให้ต้นทุนการประมวลผลบนคลาวด์เพิ่มขึ้นอย่างช้าๆ สำหรับคำแนะนำในการปรับใช้และการกำหนดค่า ให้ปฏิบัติตาม
ลดขนาดในช่วงเวลาที่ไม่ทำงาน
โดยทั่วไประบบการทดสอบและการจัดเตรียมจำเป็นสำหรับการทำงานเฉพาะในช่วงเวลาทำการเท่านั้น แอปพลิเคชันการผลิตบางอย่าง เช่น เครื่องมือแบ็คออฟฟิศ/ผู้ดูแลระบบ ต้องการความพร้อมใช้งานที่จำกัดและอาจถูกปิดใช้งานข้ามคืน
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# не отключать компоненты инфраструктуры
- --exclude-namespaces=kube-system,infra
# не отключать kube-downscaler, а также оставить Postgres Operator, чтобы исключенными БД можно было управлять
- --exclude-deployments=kube-downscaler,postgres-operator
- --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
- --include-resources=deployments,statefulsets,stacks,cronjobs
- --deployment-time-annotation=deployment-time
นี่คือกราฟสำหรับการปรับขนาดโหนดของผู้ปฏิบัติงานคลัสเตอร์ในช่วงสุดสัปดาห์:
การลดขนาดโหนดผู้ปฏิบัติงานจากประมาณ 13 เหลือ 4 โหนดจะสร้างความแตกต่างที่เห็นได้ชัดเจนในค่าบริการ AWS ของคุณอย่างแน่นอน
แต่ถ้าฉันต้องทำงานระหว่าง "เวลาหยุดทำงาน" ของคลัสเตอร์ล่ะ การใช้งานบางอย่างสามารถแยกออกจากการปรับขนาดได้อย่างถาวรโดยการเพิ่ม downscaler/exclude: true annotation การปรับใช้สามารถยกเว้นได้ชั่วคราวโดยใช้ downscaler/exclude-until คำอธิบายประกอบที่มีการประทับเวลาที่แน่นอนในรูปแบบ YYYY-MM-DD HH:MM (UTC) หากจำเป็น คุณสามารถปรับขนาดคลัสเตอร์ทั้งหมดกลับได้โดยการปรับใช้พ็อดที่มีคำอธิบายประกอบ downscaler/force-uptime
ตัวอย่างเช่น โดยการเปิดตัว nginx Blank:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # удалить развертывание через час
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true
ดู
ใช้การปรับขนาดอัตโนมัติแนวนอน
แอปพลิเคชั่น/บริการจำนวนมากจัดการกับรูปแบบการโหลดแบบไดนามิก บางครั้งโมดูลของพวกมันไม่ได้ใช้งาน และบางครั้งก็ทำงานเต็มประสิทธิภาพ การใช้งานกลุ่มพ็อดถาวรเพื่อรับมือกับปริมาณโหลดสูงสุดนั้นไม่ประหยัด Kubernetes รองรับการปรับขนาดอัตโนมัติในแนวนอนทั่วทั้งทรัพยากร
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 100
type: Utilization
Zalando ได้สร้างส่วนประกอบเพื่อเชื่อมต่อตัววัดที่กำหนดเองเพื่อการปรับขนาดได้อย่างง่ายดาย:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
annotations:
# metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
metric-config.pods.requests-per-second.json-path/json-key: "$.http_server.rps"
metric-config.pods.requests-per-second.json-path/path: /metrics
metric-config.pods.requests-per-second.json-path/port: "9090"
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: requests-per-second
target:
averageValue: 1k
type: AverageValue
การกำหนดค่าการปรับขนาดอัตโนมัติแนวนอนด้วย HPA ควรเป็นหนึ่งในการดำเนินการเริ่มต้นเพื่อปรับปรุงประสิทธิภาพสำหรับบริการไร้สัญชาติ Spotify มีการนำเสนอพร้อมประสบการณ์และคำแนะนำสำหรับ HPA:
ลดการจองทรัพยากรมากเกินไป
ปริมาณงาน Kubernetes จะกำหนดความต้องการ CPU/หน่วยความจำผ่าน "คำขอทรัพยากร" ทรัพยากร CPU วัดเป็นคอร์เสมือนหรือโดยทั่วไปมีหน่วยเป็น “มิลลิคอร์” เช่น 500m หมายถึง vCPU 50% ทรัพยากรหน่วยความจำวัดเป็นไบต์ และส่วนต่อท้ายทั่วไปสามารถใช้ได้ เช่น 500Mi ซึ่งหมายถึง 500 เมกะไบต์ ความจุคำขอ "ล็อก" ทรัพยากรบนโหนดของผู้ปฏิบัติงาน หมายความว่าพ็อดที่มีคำขอ CPU 1000 เมตรบนโหนดที่มี 4 vCPU จะเหลือเพียง 3 vCPU ที่พร้อมใช้งานสำหรับพ็อดอื่น
หย่อน (สำรองส่วนเกิน) คือความแตกต่างระหว่างทรัพยากรที่ร้องขอและการใช้งานจริง ตัวอย่างเช่น พ็อดที่ขอหน่วยความจำ 2 GiB แต่ใช้เพียง 200 MiB จะมีหน่วยความจำ “ส่วนเกิน” ~1,8 GiB ส่วนเกินต้องเสียเงิน เราสามารถประมาณคร่าวๆได้ว่าหน่วยความจำสำรอง 1 GiB มีราคาประมาณ 10 เหรียญสหรัฐฯ ต่อเดือน
การลดคำขอ CPU จาก 3000 ม. เหลือ ~ 400 ม. จะทำให้ทรัพยากรว่างสำหรับเวิร์กโหลดอื่น ๆ และช่วยให้คลัสเตอร์มีขนาดเล็กลง
“การใช้งาน CPU โดยเฉลี่ยของ EC2 instance มักจะอยู่ในช่วงเปอร์เซ็นต์หลักเดียว”
แต่เราต้องการให้ผู้คนเปลี่ยนค่าในไฟล์ YAML จริงหรือ? ไม่ เครื่องจักรสามารถทำได้ดีกว่ามาก! คูเบอร์เนเตส
ฉันเขียนเรื่องเล็กๆ
การใช้อินสแตนซ์สปอต EC2
สุดท้ายแต่ไม่ท้ายสุด คุณสามารถลดต้นทุน AWS EC2 ได้โดยใช้อินสแตนซ์ Spot เป็นโหนดผู้ปฏิบัติงาน Kubernetes
จะรัน Kubernetes บน EC2 Spot ได้อย่างไร มีหลายตัวเลือก: ใช้บริการของบุคคลที่สาม เช่น SpotInst (ปัจจุบันเรียกว่า "Spot" ไม่ต้องถามฉันว่าทำไม) หรือเพียงเพิ่ม Spot AutoScalingGroup (ASG) ลงในคลัสเตอร์ของคุณ ตัวอย่างเช่น นี่คือตัวอย่างข้อมูล CloudFormation สำหรับ Spot ASG ที่ "ปรับความจุให้เหมาะสม" ซึ่งมีอินสแตนซ์หลายประเภท:
MySpotAutoScalingGroup:
Properties:
HealthCheckGracePeriod: 300
HealthCheckType: EC2
MixedInstancesPolicy:
InstancesDistribution:
OnDemandPercentageAboveBaseCapacity: 0
SpotAllocationStrategy: capacity-optimized
LaunchTemplate:
LaunchTemplateSpecification:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
Overrides:
- InstanceType: "m4.2xlarge"
- InstanceType: "m4.4xlarge"
- InstanceType: "m5.2xlarge"
- InstanceType: "m5.4xlarge"
- InstanceType: "r4.2xlarge"
- InstanceType: "r4.4xlarge"
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
MinSize: 0
MaxSize: 100
Tags:
- Key: k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot
PropagateAtLaunch: true
Value: "true"
หมายเหตุบางประการเกี่ยวกับการใช้ Spot กับ Kubernetes:
- คุณต้องจัดการกับการสิ้นสุด Spot เช่น การรวมโหนดเมื่ออินสแตนซ์หยุดทำงาน
- ซาลันโด้ใช้
ส้อม การปรับขนาดคลัสเตอร์อย่างเป็นทางการอย่างเป็นทางการพร้อมลำดับความสำคัญของ Node Pool - จุดโหนด
สามารถบังคับได้ ยอมรับ "การลงทะเบียน" ของปริมาณงานเพื่อทำงานใน Spot
สรุป
ฉันหวังว่าคุณจะพบว่าเครื่องมือบางอย่างที่นำเสนอมีประโยชน์ในการลดค่าบริการคลาวด์ของคุณ คุณสามารถค้นหาเนื้อหาส่วนใหญ่ของบทความได้ที่
แนวทางปฏิบัติที่ดีที่สุดในการประหยัดต้นทุนระบบคลาวด์บน Kubernetes คืออะไร กรุณาแจ้งได้ที่
ที่มา: will.com