á¨á˝áá áľááá á¨á°áááá á áľáá
ááą ááááŞáŤ ááá áá ááá˘
ᨠKubernetes áá á˛á°áŠ á á°áá ááŞáá˝ áá áĽáá´áľ ááá ἠááťáá? á ááľ áľáááá áááľá á¨ááᣠááá áá áá
á˝áá ááĽáśá˝áá á áĽááľ áĽáá˛áŤáľá°áłáľáŠ áĽá á¨á°áá ááľááľ ááŞáá˝áá áĽáá˛áááą á¨ááŤááááľá á ááŤáł ááłáŞáŤáá˝á ááááťáá˘
áá
áá á˝áá á¨áťááŠáľ Kubernetes á AWS á á áĽááŽáŹ ááᣠáá (á¨áá áá°á) áááá˝ á¨á°áá á á
áŤá˘áá˝ á á°ááłáłá ááááľ á°ááťá ááááᢠá¨áĽááľá ááá(áá˝) ááľáááá á ááśáá˛áŤááá á°áá
á¨áá áĽáŹ áĽáááłááá˘
áá á˝áá á¨áá¨á°ááľá áŤá áááá
- áĽá
á áá áŤááá ááĽáśá˝á áá
áłáľ (
áŠá¤-ááá°á ) - á áľáŤ á°á áłáľ ááľáĽ á¨ááĽá°áľ ááááľá ááááą (
kube-downscaler ) - á ááľá á ááśáá˛á (HPA) á áá áá áŁ
- á¨áá á á áá á¨áá áŁá á፠ááá˝áľ ááááľ (
kube-resource-report áŞáá¤) - áľááľ ááłááá˝á á áá áá
áĽá á áá áŤááá ááĽáśá˝á áá˝áłáľ
ááŁá á áá á áŤáŁá˘ ááľáĽ ááĽáŤáľ á áŁá áĽáŠ ááᢠá¨á´áááá áľáá
áśá˝ áĽáááááá
(áááá ááŽáĽáľáĄ-
áááĄ
(áĽá
áśá˝) áŽáŞ ááááĄ
á¨á°áłáłá° á áááŤá¨áľáĄ á¨AWS áááŤá
áŤáá
á¨á°á áááá˝ áĽááľ á°ááŁá ááá˘
áĽáááłáĄ á¨AWS ááĽáĽá
áŤáá
áááá˛áśá˝ áĽááľ ááá˘
á˘áŤá áŠáááśá (á áááš)
áĽááá°á áĽáááłáĄ á¨AWS ááĽáĽá
ááá°áá¨á/ ááá°á¨á á¨á¨áˇá¸á á¨áááŽá˝ áĽááľ á°ááŁá ááá˘)
- áááľá°á-á°á á°ááŚá˝ á PR/ááá¨áŤ áá°ááŤáśá˝ á¨áá°ááá á¨ááĽáł áá (TTL) ááááš áá˝ááá˘
- á¨ááá°áĽ ááááá˝ á ááá°á/ttl ááááš áá˝ááᣠáááłá ᨠ7 áááľ á áá ášá/ááŽáśáłááá á áŤáľ-á°á áááľáááľá˘
á á ááá á
áá˝ á YAML ááá ááľáĽ á°ááá¸ááᢠá¨áĽáą ááááľ á áááŞáŤá ááľáĽ áŤááá --rules-file
á áŠá¤-ááá°á. áááá á¨áľá ááá°áśá˝á áááľáááľ á¨ááłá á
á áĽáá
á áᢠ-pr-
á¨áááľ áááľ á áá á áľá:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
á¨áá¨á°áá ááłá á 2020 áááá á á˛áľ áá°ááŤáśá˝/StatefulSet á Deployment and 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)ᢠáĽá á áá áŤááá á¨á˘á˘á¤áľ áá á á áá á ááśáá˝ á¨ááá á áśáá ááŞá á ááá ááŤáľá¨áľá áá˝ááᢠ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
á¨áŠá áááľáľ á¨á
áłáľ á°áŤá°á áááľá°ááá ááá
áĽáá˛áá áĽá á¨á°áá ááľááľ ááŞáá˝á ááľ á ááľ áĽááłáá¨áአáá¨áłááľ áá˝ááᢠááá°ááŤáľ áĽá ááááá áááŞáŤáá˝á áá¨á°á
á áľáŤ á°á áłáľ ááľáĽ á¨ááĽá°áľ ááááľá ááááą
á¨áá¨áŤ áĽá á¨ááá áľ áľáááśá˝ á á°áááś á áľáŤ á°ááłáľ ááľáĽ áĽáť áááľáŤáľ áŤáľááááᢠá ááłááľ á¨ááá¨áť á áááŹá˝áá˝áŁ áĽáá° á¨áá á˘áŽ/á áľá°áłáłáŞ ááłáŞáŤáá˝áŁ áĽáá˛áá á¨á°áá°á á°ááááľ áĽáť á¨ááŤáľáááá¸á áĽá á á ááľ ááá á áá°áá¨á áá˝ááá˘
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 ááłáĽá áá ááá
ááἠáŤááŁáá˘
ááá áá á áááľá°á "á ááá° áá" ááľáĽ ááĽáŤáľ áŤáľáááááľ? á ááłááľ áá°ááŤáśá˝ á¨áá¨á°áá/á¨ááŤáŤáľáľáĄ áĽááá°á ááĽáŤáŞáŤá á áá¨áá á¨áááá á ááááľ áááá áá˝ááᢠáááá-áá-á˛á¤á˝á¤á˝áĄáá (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
á°ááá¨áľ
á ááľá á ááśáá˛áá á°á áá
áĽá á áááŹá˝áá˝/á áááááśá˝ á¨á°áááá á¨ááŤá ááľá áá áááááᥠá ááłááľ áá ááááťá¸á áľáŤ ááľ á˛áá á ááłáá´á á áá á á
á áá°áŤáᢠá¨áá°ááá á¨áá°á áááľ ááááá áá á¨ááłáá˝ ááá¨áŚá˝á áá¨ááá á˘áŽáááŤá á áá°áá. áŠá áááľáľ á á ááľ ááĽáľ áá á ááľá áŤáľ-áá áá áá°ááá
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
ááááś ááááŤáľ áĽá áááŞáŤáá˝á á ááá ááááááľ á ááľ á áŤá ááĽáŻááĄ-
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 áŤáá¸áá áááľ áĽá áááŽá˝ á¨áŤá á¨ááá
áľ á ááŤá¨áĽ á áá¸ááĄ
á¨ááĽáľ á áá ááľáŤáá ááááą
á¨áŠá áááľáľ á¨áľáŤ áŤááá˝ á¨á˛ááŠ/á¨áá
á°á¨ áľááľáł ááááłá¸áá á¨áááľááľ á "á¨ááĽáľ áĽáŤááá˝" ááᢠá¨á˛áአááĽáśá˝ á¨áááŤá á áááŁá áŽáŽá˝ áá ááá á á°áááś âáááŽáâ ááľáĽ ááᣠáááłá 500m 50% vCPUá áŤáłáŤáᢠá¨áá
á°á¨ áľááľáł ááĽáśá˝ á áŁááľ áááŤá áĽá á¨á°áááą á
áĽáŤáá˝á áĽáá° 500Mi, áááľá 500 áááŁááľ áá áá ááťáá. á¨ááá áĽáŤá á á áŤá°á á áááá˝ áá á¨"áááááŤ" á á
áá áá áááᣠáá
á áááľ á¨1000á á˛áአáĽáŤá áŤáá ááľ á 4 vCPUs ááľááá ááááľ áá 3 áŞá˛ááŠáá˝á áĽáť áááŤáá˘
Slack (á¨áá á á áá áá áŁá ááŤ) á á°á á¨á ááĽáśá˝ áĽá á áĽááá°á á á ááá ááŤá¨á áŤáá ááŠááľ ááᢠáááłáᣠ2 áᢠáá
á°á¨ áľááľáł á¨áá áá
ááá áá 200 áᢠáĽáť á¨áá áá ááľ ~1,8 áᢠ"áľáá" áá
á°á¨ áľááľáł á ááᢠáľáá áááἠáŤáľá¨áááᢠá ááľ á°á 1 áᢠá°á¨á᪠á¨ááľáłááľ á˝ááł á áá ~ 10 áśáá áĽáá°ááŤáᣠá áááľ ááááľ áá˝ááá˘
á¨á˛áአáĽáŤáá á¨3000á áá° ~400á áá
ááľá¨á áááá˝ á¨áľáŤ áŤááá˝ ááĽáśá˝á ááť áŤá°ááá áĽá áááľá°á áŤáá° áĽáá˛áá áŤáľá˝ááá˘
"á¨EC2 á ááŁááá˝ á ááŤá á¨á˛áአá á ááá áĽááá áá á á ááľ á áá ááśá ááá ááľáĽ áŤááŁáĽáŁá"
áá á áĽáááą á YAML áááá˝ ááľáĽ á°áá˝ áĽá´áśá˝á áĽáá˛ááአáĽáááááá? á á, áá˝áá˝ á áŁá á á°áťá áááł ááŤá°áááľ áá˝áá! áŠá áááľáľ
áľáá˝ áťááŠ
EC2 áľááľ ááłááá˝á á áá áá
á áá¨á¨áť áá á˘áŤááľáŁ á¨AWS EC2 ááŞáá˝ áĽáá° Kubernetes á¨á°áŤá°á á áááá˝ áľááľ ááłááá˝á á áá áá ááááľ áá˝ááá˘
Kubernetes á EC2 Spot áá áĽáá´áľ ááľáŹáľ ááťáá? áĽá á ááŤáŽá˝ á áᥠá¨áśáľá°á ááá á áááááľ áĽáá° SpotInst (á áá "áľááľ" áĽá¨á°áŁá á¨áá áŤá) á°á ááᣠááá áĽáá°áá á áľá áááᣠááá á ááá 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 áá á¨á°áá ááŞáá˝á áááá ἠá¨áĽááľá ááἠáááśá˝ áááľáá¸á? áĽáŁááá á áá áŤáłááá
ááá: hab.com