د مقالې ژباړه د کورس د پیل په ماښام چمتو شوې وه
د کبرنیټس سره کار کولو پرمهال د بادل لګښتونو څنګه خوندي کول؟ هیڅ یو سم حل شتون نلري، مګر دا مقاله ډیری وسیلې تشریح کوي چې کولی شي ستاسو سره ستاسو سرچینې په اغیزمنه توګه اداره کړي او ستاسو د کلاوډ کمپیوټر لګښتونه کم کړي.
ما دا مقاله د AWS لپاره د Kubernetes سره په ذهن کې لیکلې، مګر دا به (تقریبا) په ورته ډول د نورو بادل چمتو کونکو لپاره پلي شي. زه ګومان کوم چې ستاسو کلسترونه لا دمخه د اتوماتیک کولو تنظیم شوي (
دا مقاله به پوښي:
- د غیر استعمال شوي سرچینو پاکول (
kube - janitor ) - د غیر کاري ساعتونو په جریان کې اندازه کول کم کړئ (
kube-downscaler ) - د افقی اتوماتیک کولو (HPA) کارول،
- د زیاتو سرچینو ذخیره کمول (
kube-resource-report , VPA) - د Spot مثالونو کارول
د غیر استعمال شوي سرچینو پاکول
په ګړندۍ چاپیریال کې کار کول خورا ښه دي. موږ تخنیکي سازمانونه غواړو
(هینینګ جیکبز:
ژیزا:
کوری کوین:
افسانه: ستاسو د AWS حساب د هغو کاروونکو شمیر دی چې تاسو یې لرئ.
حقیقت: ستاسو د AWS نمرې د انجینرانو شمیره ده چې تاسو یې لرئ.
ایوان کورنوسوف (په ځواب کې):
ریښتینی حقیقت: ستاسو د AWS نمرې د هغه شیانو شمیره ده چې تاسو یې غیر فعال کول / حذف کول هیر کړي.)
- د کلستر په کچه مقررات کولی شي د ژوند کولو اعظمي وخت (TTL) د PR/ټیسټ ګمارلو لپاره تعریف کړي.
- انفرادي سرچینې د janitor/ttl سره تشریح کیدی شي، د بیلګې په توګه د 7 ورځو وروسته په اتوماتيک ډول سپیک / پروټوټایپ لرې کول.
عمومي قواعد د YAML فایل کې تعریف شوي. د هغې لاره د پیرامیټر له لارې تیریږي --rules-file
په kube-janitor کې. دلته د ټولو نوم ځایونو لرې کولو لپاره د مثال قانون دی -pr-
په نوم دوه ورځې وروسته:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
لاندې مثال په 2020 کې د ټولو نوي ګمارلو/StatefulSets لپاره د پلي کولو او StatefulSet پوډونو کې د غوښتنلیک لیبل کارول تنظیموي ، مګر په ورته وخت کې د یوې اونۍ لپاره د دې لیبل پرته ازموینې اجرا کولو ته اجازه ورکوي:
- 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 دقیقو لپاره د وخت محدود ډیمو چلول په کلستر کې د کیوب - جانیټر چلول:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
د لګښتونو د زیاتوالي بله سرچینه دوامداره حجم (AWS EBS) دي. د Kubernetes StatefulSet حذف کول د هغې دوامداره حجمونه (PVC - PersistentVolumeClaim) نه حذف کوي. د EBS نه کارول شوي حجمونه په اسانۍ سره په میاشت کې د سلګونو ډالرو لګښتونو پایله کولی شي. Kubernetes Janitor د غیر استعمال شوي PVCs پاکولو لپاره یو ځانګړتیا لري. د مثال په توګه، دا قاعده به ټول PVCs لرې کړي چې د ماډل لخوا ندي نصب شوي او د StatefulSet یا CronJob لخوا حواله شوي ندي:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
د کبرنیټس جنیټر کولی شي تاسو سره ستاسو د کلستر پاک ساتلو کې مرسته وکړي او د کلاوډ کمپیوټري لګښتونو ورو ورو راټولیدو مخه ونیسي. د ګمارنې او ترتیب کولو لارښوونو لپاره، تعقیب کړئ
د غیر کاري ساعتونو په جریان کې اندازه کول کم کړئ
د ازموینې او سټینګ سیسټمونه عموما یوازې د سوداګرۍ ساعتونو په جریان کې د عملیاتو لپاره اړین دي. د تولید ځینې غوښتنلیکونه، لکه د بیک دفتر/اډمین وسیلې هم یوازې محدود شتون ته اړتیا لري او ممکن په شپه کې غیر فعال شي.
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-Tille په کارولو سره د مطلق مهال ویش سره د YYYY-MM-DD HH:MM (UTC) بڼه کې خارج کیدی شي. که اړتیا وي، ټول کلستر د تشریح سره د پوډ په ځای کولو سره بیرته اندازه کیدی شي downscaler/force-uptime
د مثال په توګه، د nginx خالي په پیل کولو سره:
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 د 50٪ vCPU معنی لري. د حافظې سرچینې په بایټ کې اندازه کیږي، او عام ضمیمې کارول کیدی شي، لکه 500Mi، چې معنی یې 500 میګابایټ دی. سرچینې د کارګر نوډونو کې د "لاک" ظرفیت غوښتنه کوي ، پدې معنی چې د 1000 vCPUs سره په نوډ کې د 4m CPU غوښتنې سره پوډ به یوازې 3 vCPUs نورو پوډونو ته شتون پریږدي.
سست (ډیری زیرمه) د غوښتل شوي سرچینو او حقیقي کارونې ترمنځ توپیر دی. د مثال په توګه، یو پوډ چې د 2 GiB حافظې غوښتنه کوي مګر یوازې 200 MiB کاروي د ~ 1,8 GiB "اضافي" حافظه لري. اضافي پیسې مصرفوي. یو څوک تقریبا اټکل کولی شي چې د 1 GiB بې ځایه حافظه په میاشت کې ~ $ 10 لګښت لري.
د CPU غوښتنې له 3000m څخه ~ 400m ته کمول د نورو کاري بارونو لپاره سرچینې خلاصوي او کلستر ته اجازه ورکوي چې کوچني شي.
"د EC2 مثالونو اوسط CPU کارول اکثرا د واحد عدد سلنې حد کې ځړول کیږي"
مګر ایا موږ واقعیا غواړو خلک د YAML فایلونو کې ارزښتونه بدل کړي؟ نه، ماشینونه دا ډیر ښه کولی شي! Kubernetes
ما یو کوچنی لیکلی
د EC2 سپاټ مثالونو کارول
وروستی مګر لږترلږه، د AWS EC2 لګښتونه د سپټ مثالونو په کارولو سره د Kubernetes کارګر نوډونو په توګه کم کیدی شي
په EC2 ځای کې Kubernetes څنګه چلولی شئ؟ ډیری اختیارونه شتون لري: د دریمې ډلې خدمت وکاروئ لکه SpotInst (اوس د "Spot" په نوم یادیږي، له ما څخه پوښتنه مه کوئ چې ولې)، یا په ساده ډول خپل کلستر ته د Spot AutoScalingGroup (ASG) اضافه کړئ. د مثال په توګه، دلته د ډیری مثالونو ډولونو سره د "ظرفیت - مطلوب" ځای 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"
د Kubernetes سره د سپاټ کارولو په اړه ځینې یادښتونه:
- تاسو اړتیا لرئ د Spot پای ته رسیدو اداره کړئ، د بیلګې په توګه د نوډ یوځای کولو سره کله چې مثال ودرول شي
- Zalando کاروي
فورک د نوډ پول لومړیتوبونو سره رسمي کلستر اتوماتیک کول - د ځای نوډونه
مجبور کیدی شي په Spot کې د چلولو لپاره د کاري بارونو "رجسټریشن" قبول کړئ
لنډیز
زه امید لرم چې تاسو ځینې وسیلې ومومئ چې ستاسو د بادل بیل کمولو کې ګټور وي. تاسو کولی شئ د مقالې ډیری مینځپانګې هم دلته ومومئ
په Kubernetes کې د بادل لګښتونو خوندي کولو لپاره ستاسو غوره تمرینونه کوم دي؟ مهرباني وکړئ ما ته خبر راکړئ
سرچینه: www.habr.com