èšäºã®ç¿»èš³ã¯ã³ãŒã¹éå§åå€ã«æºåãããŸãã
Kubernetes ã䜿çšãããšãã«ã¯ã©ãŠãã®ã³ã¹ããç¯çŽããã«ã¯ã©ãããã°ããã§ãã? åäžã®é©åãªãœãªã¥ãŒã·ã§ã³ã¯ãããŸãããããã®èšäºã§ã¯ããªãœãŒã¹ãããå¹æçã«ç®¡çããã¯ã©ãŠã ã³ã³ãã¥ãŒãã£ã³ã°ã®ã³ã¹ããåæžããã®ã«åœ¹ç«ã€ããã€ãã®ããŒã«ã«ã€ããŠèª¬æããŸãã
ãã®èšäºã¯ AWS ã® Kubernetes ã念é ã«çœ®ããŠæžããŸããããä»ã®ã¯ã©ãŠã ãããã€ããŒã«ã (ã»ãŒ) ãŸã£ããåãããã«é©çšã§ããŸãã ã¯ã©ã¹ã¿ãŒã«ã¯ãã§ã«èªåã¹ã±ãŒãªã³ã°ãæ§æãããŠãããšä»®å®ããŸã (
ãã®èšäºã§ã¯ã次ã®å 容ã«ã€ããŠèª¬æããŸãã
- æªäœ¿çšã®ãªãœãŒã¹ãã¯ãªãŒã³ã¢ãããã (
kube-管ç人 ) - å€åæéå€ã®ã¹ã±ãŒãªã³ã°ãæžãã (
kube-ããŠã³ã¹ã±ãŒã©ãŒ ) - æ°Žå¹³èªåã¹ã±ãŒãªã³ã° (HPA) ã䜿çšãã
- éå°ãªãªãœãŒã¹äºçŽã®åæž (
kube-ãªãœãŒã¹-ã¬ããŒã ãVPA) - ã¹ãããã€ã³ã¹ã¿ã³ã¹ã®äœ¿çš
æªäœ¿çšã®ãªãœãŒã¹ã®ã¯ãªãŒã³ã¢ãã
ããŒã¹ã®éãç°å¢ã§åãã®ã¯çŽ æŽãããããšã§ãã ç§ãã¡ã¯ãã¯ãããžãŒçµç¹ãæãã§ããŸã
(ããã³ã°ã»ãžã§ã€ã³ãã¹:
ãžã¶:
(åŒçš) ã³ãŒãªãŒã»ã¯ã€ã³:
誀解: AWS ã¢ã«ãŠã³ãã¯ãææãããŠãŒã¶ãŒã®æ°ã«ãã£ãŠæ±ºãŸããŸãã
äºå®: AWS ã¹ã³ã¢ã¯ãæ±ããŠãããšã³ãžãã¢ã®æ°ã®é¢æ°ã§ãã
ã€ã¯ã³ã»ã¯ã«ããœãïŒè¿çïŒïŒ
å®é: AWS ã¹ã³ã¢ã¯ãç¡å¹å/åé€ãå¿ãããã®ã®æ°ã®é¢æ°ã§ãã)
- ã¯ã©ã¹ã¿ãŒå šäœã®ã«ãŒã«ã«ãããPR/ãã¹ãå±éã®æ倧åç¶æé (TTL) ãå®çŸ©ã§ããŸãã
- åã ã®ãªãœãŒã¹ã« janitor/ttl ã®æ³šéãä»ããããšãã§ããŸããããšãã°ã7 æ¥åŸã«ã¹ãã€ã¯/ãããã¿ã€ããèªåçã«åé€ããŸãã
äžè¬çãªã«ãŒã«ã¯ YAML ãã¡ã€ã«ã§å®çŸ©ãããŸãã ãã®ãã¹ã¯ãã©ã¡ãŒã¿ãéããŠæž¡ãããŸã --rules-file
kube-管ç人ã§ã ãã¹ãŠã®åå空éãåé€ããã«ãŒã«ã®äŸã次ã«ç€ºããŸãã -pr-
XNUMXæ¥åŸã®ååã§:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
次ã®äŸã§ã¯ã2020 幎ã®ãã¹ãŠã®æ°ãã Deployment/StatefulSet ã® Deployment ãããããã³ StatefulSet ãããã§ã®ã¢ããªã±ãŒã·ã§ã³ ã©ãã«ã®äœ¿çšãèŠå¶ããŸãããåæã«ãã®ã©ãã«ã䜿çšããªããã¹ãã®å®è¡ã XNUMX é±éèš±å¯ããŸãã
- 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 åéå®è¡ããŸãã
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
ã³ã¹ãå¢å ã®ãã XNUMX ã€ã®åå ã¯ãæ°žç¶ããªã¥ãŒã (AWS EBS) ã§ãã Kubernetes StatefulSet ãåé€ããŠãããã®æ°žç¶ããªã¥ãŒã (PVC - Persistent VolumeClaim) ã¯åé€ãããŸããã æªäœ¿çšã® 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 ã®è«æ±é¡ã«é¡èãªéããçããŸãã
ããããã¯ã©ã¹ã¿ãŒã®ãããŠã³ã¿ã€ã ãäžã«äœæ¥ããå¿
èŠãããå Žåã¯ã©ãããã°ããã§ãããã? downscaler/exclude: true ã¢ãããŒã·ã§ã³ãè¿œå ããããšã§ãç¹å®ã®ãããã€ã¡ã³ããã¹ã±ãŒãªã³ã°ããæ°žä¹
ã«é€å€ã§ããŸãã 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 ã䜿çšããæ°Žå¹³èªåã¹ã±ãŒãªã³ã°ã®æ§æã¯ãã¹ããŒãã¬ã¹ ãµãŒãã¹ã®å¹çãåäžãããããã®ããã©ã«ã ã¢ã¯ã·ã§ã³ã® XNUMX ã€ã§ããå¿
èŠããããŸãã Spotify ã¯ãHPA ã«é¢ããçµéšãšæšå¥šäºé
ã玹ä»ãããã¬ãŒã³ããŒã·ã§ã³ãè¡ã£ãŠããŸãã
ãªãœãŒã¹ã®ãªãŒããŒãããã³ã°ãåæžãã
Kubernetes ã¯ãŒã¯ããŒãã¯ãããªãœãŒã¹ ãªã¯ãšã¹ãããéã㊠CPU/ã¡ã¢ãªã®ããŒãºã決å®ããŸãã CPU ãªãœãŒã¹ã¯ä»®æ³ã³ã¢ããŸãã¯ããäžè¬çã«ã¯ãããªã³ã¢ãã§æž¬å®ãããŸããããšãã°ã500m 㯠50% ã® vCPU ãæå³ããŸãã ã¡ã¢ãª ãªãœãŒã¹ã¯ãã€ãåäœã§æž¬å®ããã500 ã¡ã¬ãã€ããæå³ãã 500Mi ãªã©ã®äžè¬çãªãµãã£ãã¯ã¹ã䜿çšã§ããŸãã ãªãœãŒã¹ ãªã¯ãšã¹ãã¯ã¯ãŒã«ãŒ ããŒãã®å®¹éããããã¯ãããŸããã€ãŸãã1000 ã€ã® vCPU ãåããããŒãäžã§ 4m CPU ãªã¯ãšã¹ããæã€ãããã¯ãä»ã®ãããã䜿çšã§ãã vCPU ã 3 ã€ã ãæ®ããŸãã
ã¹ã©ãã¯ïŒè¶
éäºåïŒ èŠæ±ããããªãœãŒã¹ãšå®éã®äœ¿çšéã®å·®ã§ãã ããšãã°ã2 GiB ã®ã¡ã¢ãªãèŠæ±ããªãã 200 MiB ãã䜿çšããªããããã«ã¯ãçŽ 1,8 GiB ã®ãéå°ãã¡ã¢ãªããããŸãã éå°ã«ã¯ãéãããããŸãã 1 GiB ã®åé·ã¡ã¢ãªã«ã¯æãããçŽ 10 ãã«ã®è²»çšãããããšå€§ãŸãã«èŠç©ããããšãã§ããŸãã
CPU ãªã¯ãšã¹ãã 3000m ããçŽ 400m ã«åæžãããšãä»ã®ã¯ãŒã¯ããŒãçšã®ãªãœãŒã¹ã解æŸãããã¯ã©ã¹ã¿ãŒãå°ããã§ããŸãã
ãEC2 ã€ã³ã¹ã¿ã³ã¹ã®å¹³å CPU 䜿çšçã¯ãå€ãã®å ŽåãXNUMX æ¡ã®ããŒã»ã³ãç¯å²ã§æšç§»ããŠããŸããã
ããããYAML ãã¡ã€ã«ã®å€ãå€æŽããããšãæ¬åœã«æãã§ããã§ãããã? ããããæ©æ¢°ãªããã£ãšããŸãã§ããŸãã Kubernetes
ã¡ãã£ãšããããšãæžããŸãã
EC2 ã¹ãããã€ã³ã¹ã¿ã³ã¹ã®äœ¿çš
æåŸã«éèŠãªããšã§ãããã¹ããã ã€ã³ã¹ã¿ã³ã¹ã Kubernetes ã¯ãŒã«ãŒ ããŒããšããŠäœ¿çšããããšã§ãAWS EC2 ã®ã³ã¹ããåæžã§ããŸãã
EC2 ã¹ããã㧠Kubernetes ãå®è¡ããã«ã¯ã©ãããã°ããã§ãã? ããã€ãã®ãªãã·ã§ã³ããããŸããSpotInst (çŸåšã¯ãSpotããšåŒã°ããŠããŸããçç±ã¯èããªãã§ãã ãã) ã®ãããªãµãŒãããŒã㣠ãµãŒãã¹ã䜿çšããããåçŽã« Spot AutoScalingGroup (ASG) ãã¯ã©ã¹ã¿ãŒã«è¿œå ããŸãã ããšãã°ãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ ã¿ã€ããæã€ã容éãæé©åããããã¹ããã 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 ã䜿çšããå Žåã®æ³šæç¹:
- ã€ã³ã¹ã¿ã³ã¹ã®åæ¢æã«ããŒããããŒãžãããªã©ããŠãã¹ãããçµäºãåŠçããå¿ èŠããã
- ã¶ã©ã³ãã䜿çšãã
ãã©ãŒã¯ ããŒãããŒã«ã®åªå é äœã䜿çšããå ¬åŒã¯ã©ã¹ã¿ãŒã®èªåã¹ã±ãŒãªã³ã° - ã¹ãããããŒã
匷å¶ã§ãã ã¹ãããã§å®è¡ããã¯ãŒã¯ããŒãã®ãç»é²ããåãå ¥ãã
ãµããªãŒ
ããã§çŽ¹ä»ããããŒã«ã®ããã€ããã¯ã©ãŠãæéã®åæžã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã èšäºã®å
容ã®ã»ãšãã©ã¯æ¬¡ã®å Žæã§ãèŠã€ããããšãã§ããŸãã
Kubernetes ã§ã¯ã©ãŠã ã³ã¹ããç¯çŽããããã®ãã¹ã ãã©ã¯ãã£ã¹ã¯äœã§ãã? ãŸã§ãç¥ãããã ããã
åºæïŒ habr.com