පාඨමාලා ආරම්භයට ආසන්න දිනක ලිපියේ පරිවර්තනය සකස් කරන ලදී
Kubernetes සමඟ වැඩ කිරීමේදී වලාකුළු පිරිවැය ඉතිරි කර ගන්නේ කෙසේද? තනි නිවැරදි විසඳුමක් නොමැත, නමුත් මෙම ලිපිය ඔබට ඔබේ සම්පත් වඩාත් ඵලදායී ලෙස කළමනාකරණය කිරීමට සහ ඔබේ වලාකුළු පරිගණක පිරිවැය අඩු කිරීමට උපකාර වන මෙවලම් කිහිපයක් විස්තර කරයි.
මම AWS සඳහා Kubernetes මනසේ තබාගෙන මෙම ලිපිය ලිව්වෙමි, නමුත් එය අනෙකුත් වලාකුළු සපයන්නන්ට (පාහේ) හරියටම අදාළ වනු ඇත. මම උපකල්පනය කරන්නේ ඔබේ පොකුරු(ය) දැනටමත් ස්වයං පරිමාණය වින්යාස කර ඇති බවයි (
මෙම ලිපිය ආවරණය කරනු ඇත:
- භාවිතයට නොගත් සම්පත් පිරිසිදු කිරීම (
kube-janitor ) - වැඩ නොකරන වේලාවන්හිදී පරිමාණය අඩු කරන්න (
kube-downscaler ) - තිරස් ස්වයං පරිමාණය (HPA) භාවිතා කිරීම
- අධික සම්පත් වෙන්කිරීම් අඩු කිරීම (
kube-සම්පත්-වාර්තාව , VPA) - Spot අවස්ථා භාවිතා කිරීම
භාවිතයට නොගත් සම්පත් පිරිසිදු කිරීම
වේගවත් පරිසරයක වැඩ කිරීම විශිෂ්ටයි. අපට තාක්ෂණික සංවිධාන අවශ්යයි
(Henning Jacobs:
Zhiza:
(උපුටා දැක්වීම්) Corey Quinn:
මිථ්යාව: ඔබේ AWS ගිණුම ඔබට ඇති පරිශීලකයින් සංඛ්යාවේ කාර්යයකි.
සත්යය: ඔබේ AWS ලකුණු යනු ඔබ සතු ඉංජිනේරුවන් සංඛ්යාවේ ශ්රිතයකි.
Ivan Kurnosov (ප්රතිචාර වශයෙන්):
සැබෑ සත්යය: ඔබේ AWS ලකුණු යනු ඔබට අබල කිරීමට/මකා දැමීමට අමතක වූ දේවල් ගණනේ ශ්රිතයකි.)
- PR/පරීක්ෂණ යෙදවීම් සඳහා පොකුරු-පුළුල් රීති වලට ජීවත් වීමට උපරිම කාලය (TTL) අර්ථ දැක්විය හැක.
- දින 7කට පසු ස්පයික්/මූලාකෘතිය ස්වයංක්රීයව ඉවත් කිරීමට උදාහරණයක් ලෙස, තනි පුද්ගල සම්පත් janitor/ttl සමඟින් සටහන් කළ හැක.
සාමාන්ය රීති YAML ගොනුවේ අර්ථ දක්වා ඇත. එහි මාර්ගය පරාමිතිය හරහා ගමන් කරයි --rules-file
kube-janitor දී. සියලුම නාම අවකාශයන් ඉවත් කිරීමට උදාහරණ රීතියක් මෙන්න -pr-
දින දෙකකට පසු නමින්:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
පහත උදාහරණය 2020 දී සියලුම නව Deployments/StatefulSets සඳහා Deployment සහ StatefulSet Pods මත යෙදුම් ලේබලය භාවිතය නියාමනය කරයි, නමුත් ඒ සමඟම සතියක් සඳහා මෙම ලේබලය නොමැතිව පරීක්ෂණ ක්රියාත්මක කිරීමට ඉඩ ලබා දේ:
- 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
kube-janitor ධාවනය වන පොකුරක් මත මිනිත්තු 30ක් සඳහා කාල සීමා සහිත demo ධාවනය කරන්න:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
පිරිවැය වැඩිවීමේ තවත් ප්රභවයක් වන්නේ අඛණ්ඩ පරිමාවන් (AWS EBS) ය. Kubernetes StatefulSet එකක් මකා දැමීමෙන් එහි ස්ථීර වෙළුම් (PVC - PersistentVolumeClaim) මැකෙන්නේ නැත. භාවිතයට නොගත් EBS වෙළුම් පහසුවෙන් මසකට ඩොලර් සිය ගණනක පිරිවැයක් ඇති කළ හැකිය. Kubernetes Janitor සතුව භාවිතයට නොගත් PVC පිරිසිදු කිරීමට විශේෂාංගයක් ඇත. උදාහරණයක් ලෙස, මෙම රීතිය මඟින් මොඩියුලයක් මඟින් සවි කර නොමැති සහ StatefulSet හෝ CronJob විසින් යොමු නොකළ සියලුම PVC ඉවත් කරනු ඇත:
# удалить все 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 බිල්පතෙහි කැපී පෙනෙන වෙනසක් ඇති කරයි.
නමුත් මට පොකුරු "අක්රීය කාලය" තුළ වැඩ කිරීමට අවශ්ය නම් කුමක් කළ යුතුද? සමහර යෙදවීම් ස්ථීරවම පරිමාණයෙන් බැහැර කළ හැක, පහතට දැමීම / බැහැර කිරීම: සත්ය විවරණ එකතු කිරීම. 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 කි. සම්පත් ඉල්ලීම් සේවක නෝඩ් වල ධාරිතාව "අගුළු දැමීම", එනම් vCPUs 1000ක් සහිත node එකක් මත 4m CPU ඉල්ලීමක් සහිත පොඩ් එකක් අනෙකුත් කරල් සඳහා ඉතිරි වන්නේ vCPU 3ක් පමණි.
ස්ලැක් (අතිරික්ත සංචිත) ඉල්ලූ සම්පත් සහ සැබෑ භාවිතය අතර වෙනස වේ. උදාහරණයක් ලෙස, 2 GiB මතකයක් ඉල්ලා සිටින නමුත් 200 MiB පමණක් භාවිතා කරන පොඩ් එකක "අතිරික්ත" මතකය ~1,8 GiB ඇත. අතිරික්ත මුදල් වැය වේ. 1 GiB අතිරික්ත මතකයක් සඳහා මසකට ~$10ක් වැය වන බව කෙනෙකුට දළ වශයෙන් ඇස්තමේන්තු කළ හැක.
CPU ඉල්ලීම 3000m සිට ~400m දක්වා අඩු කිරීම අනෙකුත් වැඩ බර සඳහා සම්පත් නිදහස් කරන අතර පොකුර කුඩා වීමට ඉඩ සලසයි.
"EC2 නිදසුන්වල සාමාන්ය CPU භාවිතය බොහෝ විට තනි ඉලක්කම් ප්රතිශත පරාසයක පවතී"
නමුත් YAML ගොනු වල අගයන් වෙනස් කරන පුද්ගලයින් අපට සැබවින්ම අවශ්යද? නැත, යන්ත්රවලට එය වඩා හොඳින් කළ හැකිය! කුබර්නෙටස්
මම පොඩි එකක් ලිව්වා
EC2 Spot අවස්ථා භාවිතා කිරීම
අවසාන වශයෙන් නොව අවම වශයෙන්, AWS EC2 පිරිවැය Kubernetes සේවක නෝඩ් ලෙස Spot අවස්ථා භාවිතා කිරීමෙන් අඩු කළ හැක.
EC2 Spot මත Kubernetes ධාවනය කරන්නේ කෙසේද? විකල්ප කිහිපයක් තිබේ: SpotInst වැනි තෙවන පාර්ශ්ව සේවාවක් භාවිතා කරන්න (දැන් "Spot" ලෙස හැඳින්වේ, ඇයි මගෙන් අහන්න එපා) හෝ ඔබේ පොකුරට Spot AutoScalingGroup (ASG) එක් කරන්න. උදාහරණයක් ලෙස, බහුවිධ අවස්ථා වර්ග සහිත "ධාරිතාව-ප්රශස්ත" Spot ASG සඳහා CloudFormation ස්නිපට් එකක් මෙන්න:
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 භාවිතා කිරීම පිළිබඳ සමහර සටහන්:
- ඔබට Spot terminations හැසිරවීමට අවශ්ය වේ, උදාහරණයක් ලෙස එම අවස්ථාව නැවැත්වූ විට node එක ඒකාබද්ධ කිරීමෙන්
- Zalando භාවිතා කරයි
දෙබලක නෝඩ් සංචිත ප්රමුඛතා සහිත නිල පොකුරු ස්වයංක්රීය පරිමාණය - පැල්ලම් නෝඩ්
බල කළ හැක Spot හි ධාවනය කිරීමට වැඩ බර "ලියාපදිංචි කිරීම්" පිළිගන්න
සාරාංශය
ඔබගේ වලාකුළු බිල්පත අඩු කිරීම සඳහා ඉදිරිපත් කර ඇති සමහර මෙවලම් ප්රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි. ඔබට ලිපියේ බොහෝ අන්තර්ගතයන් ද සොයාගත හැකිය
Kubernetes හි ක්ලවුඩ් පිරිවැය ඉතිරි කිරීම සඳහා ඔබේ හොඳම භාවිතයන් මොනවාද? කරුණාකර මට දන්වන්න
මූලාශ්රය: www.habr.com