แกแขแแขแแแก แแแ แแแแแ แแแแแแแแ แแฃแ แกแแก แแแฌแงแแแแก แฌแแแ แแฆแแก
แ แแแแ แแแแแแแ แฆแ แฃแแแแก แฎแแ แฏแแแ Kubernetes-แแแ แแฃแจแแแแแกแแก? แแ แแ แกแแแแแก แแ แแ แกแฌแแ แ แแแแแกแแแแแ, แแแแ แแ แแก แกแขแแขแแ แแฆแฌแแ แก แ แแแแแแแแ แแแกแขแ แฃแแแแขแก, แ แแแแแแช แแแแแฎแแแ แแแแ แฃแคแ แ แแคแแฅแขแฃแ แแ แแแ แแแ แแฅแแแแ แ แแกแฃแ แกแแแ แแ แจแแแแชแแ แแ แแฅแแแแ แฆแ แฃแแแแแแแ แแแแแแแแแแแก แฎแแ แฏแแแ.
แแ แแแแฌแแ แ แแก แกแขแแขแแ Kubernetes-แแกแแแแก AWS-แแก แแแแแแแแกแฌแแแแแแ, แแแแ แแ แแก (แแแแฅแแแก) แแฃแกแขแแ แแแแแแแแแ แแ แแฅแแแแ แกแฎแแ แฆแ แฃแแแแแแ แแ แแแแแแแ แแแแ. แแ แแแ แแฃแแแ, แ แแ แแฅแแแแก แแแแกแขแแ (แแ)แก แฃแแแ แแฅแแก แแแขแแกแแแแแ แแแแก แแแแคแแแฃแ แแชแแ (
แแก แกแขแแขแแ แแแแชแแแก:
- แแแแแฃแงแแแแแแแ แ แแกแฃแ แกแแแแก แแแฌแแแแแ (
แแฃแแ-แแแแแแแแแแแ ) - แจแแแแชแแ แแ แแแกแจแขแแแแแ แแ แแกแแแฃแจแแ แกแแแแแแจแ (
แแฃแแ-แแแแแแชแแ แแแแแ ) - แฐแแ แแแแแขแแแฃแ แ แแแขแแกแแแแแ แแแแก (HPA) แแแแแงแแแแแแ,
- แแแแแญแแ แแแแฃแแ แ แแกแฃแ แกแแแแก แแแฏแแแจแแแก แจแแแชแแ แแแ (
kube-resource-report , VPA) - Spot แแแกแขแแแชแแแแแก แแแแแงแแแแแแ
แแแแแฃแงแแแแแแแ แ แแกแฃแ แกแแแแก แแแฌแแแแแ
แกแฌแ แแค แแแ แแแแจแ แแฃแจแแแแ แจแแกแแแแจแแแแแ. แฉแแแ แแแแแแ แขแแฅแแแแฃแ แ แแ แแแแแแแชแแแแ
(แฐแแแแแ แฏแแแแแแกแ:
แแแแ:
(แชแแขแแขแแแ) แแแ แ แฅแฃแแแ:
แแแแ: แแฅแแแแ 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
แจแแแแแแ แแแแแแแแ แแ แแแฃแแแ แแแก แแแแแแแชแแแก แแแแแแแก แแแแแงแแแแแแก Deployment แแ StatefulSet pods-แแ แงแแแแ แแฎแแแ Deployments/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 แแแแแฎแแแ แแแแ แจแแแแแ แฉแฃแแแ แแฅแแแแ แแแแกแขแแ แ แกแแกแฃแคแแแแ แแ แแแแแแแ แแแชแแแแ แฆแ แฃแแแแแแแ แแแแแแแแแก แฎแแ แฏแแแแก แแแแ แแแแ แแแแแ. แแแแแแแแแแกแ แแ แแแแคแแแฃแ แแชแแแก แแแกแขแ แฃแฅแชแแแแแกแแแแก แแแฐแงแแแแ
แจแแแแชแแ แแ แกแแแแแ แแแ แแ แแกแแแฃแจแแ แกแแแแแแจแ
แขแแกแขแแ แแแแกแ แแ แแแแแแแก แกแแกแขแแแแแ, แ แแแแ แช แฌแแกแ, แกแแญแแ แแ แแฎแแแแ แกแแแฃแจแแ แกแแแแแแแก แแแแแแแแแแแจแ. แแแแแแ แแ แกแแฌแแ แแแ แแแแแแแชแแ, แ แแแแ แแชแแ back office/admin แแแกแขแ แฃแแแแขแแแ, แแกแแแ แแแแแฎแแแก แแฎแแแแ แจแแแฆแฃแแฃแ แฎแแแแแกแแฌแแแแแแแแก แแ แจแแแซแแแแ แแแแแ แแฃแแ แแงแแก แฆแแแแ.
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 แแแแแแแ แแแฅแขแจแ.
แแแแ แแ แ แ แแแฎแแแแ, แแฃ แแญแแ แแแแ แแฃแจแแแแ แแแแกแขแแ แฃแแ "แจแแฃแกแแแแแแแแแแก" แแ แแก? แแแแแแ แแ แแแแแแแแแ แจแแแซแแแแ แกแแแฃแแแแแ แแแแแแ แแชแฎแแก แกแแแแแ แแแแกแแแ, แจแแแชแแ แแแแก/แแแแแ แแชแฎแแแก: แแแแแแแแ แแแแขแแชแแแก แแแแแขแแแแ. แแแแแ แแแ แจแแแซแแแแ แแ แแแแแ แแแแแแ แแชแฎแแก แจแแแชแแ แแแแก/แแแแแ แแชแฎแแแก แแแแขแแชแแแก แแแแแงแแแแแแ แแแกแแแฃแขแฃแ แ แแ แแแก แจแขแแแแแ แคแแ แแแขแจแ แฌแฌแฌ-แแ-แแ 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 แ CPU แแแแฎแแแแแ แแแแแซแแ 4 vCPU-แแ แแแขแแแแแก แแฎแแแแ 3 vCPU-แก แฎแแแแแกแแฌแแแแแก แกแฎแแ แแแแแแแกแแแแก.
แกแฃแกแขแ (แญแแ แแ แ แแแแ แแ) แแ แแก แแแแกแฎแแแแแแ แแแแฎแแแแแ แ แแกแฃแ แกแแแกแ แแ แ แแแแฃแ แแแแแงแแแแแแก แจแแ แแก. แแแแแแแแแ, แแแแก, แ แแแแแแช แแแฎแแแก 2 แแแ แแแฎแกแแแ แแแแก, แแแแ แแ แแงแแแแแก แแฎแแแแ 200 แแแแแแขแก, แแฅแแก ~1,8 แแแแแแขแ "แญแแ แแ" แแแฎแกแแแ แแแ. แญแแ แแ แคแฃแแ แฆแแ แก. แฃแฎแแจแแ แจแแแซแแแแ แจแแคแแกแแแก, แ แแ แแแแแแขแ แแแฎแกแแแ แแแแก 1 แแแแแแขแ แแแแจแ 10$ แฆแแ แก.
CPU แแแแฎแแแแแก แจแแแชแแ แแแ 3000 แ-แแแ ~400 แ-แแแ แแแแแแกแฃแคแแแแก แ แแกแฃแ แกแแแก แกแฎแแ แแแขแแแ แแแแกแแแแก แแ แกแแจแฃแแแแแแก แแซแแแแก แแแแกแขแแ แก แแงแแก แฃแคแ แ แแชแแ แ.
"EC2 แแแกแขแแแชแแแแแก CPU-แก แกแแจแฃแแแ แแแแแงแแแแแ แฎแจแแ แแ แแ แแแแจแแ แแ แแชแแแขแฃแ แแแแแแแแแจแแ."
แแแแ แแ แฉแแแ แแแแแแแแแ แแแแแแ, แ แแ แแแแแแแแแแแ แจแแชแแแแแ แแแแจแแแแแแแแแ YAML แคแแแแแแจแ? แแ แ, แแแแฅแแแแแก แแก แแแแ แแ แฃแแแ แจแแฃแซแแแแ! แแฃแแแ แแแขแแแ
แแแขแแ แ แแแแฌแแ แ
EC2 Spot แแแกแขแแแชแแแแแก แแแแแงแแแแแ
แแแแแแแก, แ แแช แแ แแแแแแแ แแแแจแแแแแแแแแแ, 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-แแก แแแแแงแแแแแแก แจแแกแแฎแแ:
- แแฅแแแ แฃแแแ แแแฃแแแแแแแแ Spot แขแแ แแแแแแแแก, แแแแแแแแแ, แแแแแซแแก แจแแ แฌแงแแ, แ แแแแกแแช แแแกแขแแแชแแ แจแแฉแแ แแแฃแแแ
- Zalando แแงแแแแแก
แฉแแแแแแ แแคแแชแแแแฃแ แ แแแแกแขแแ แฃแแ แแแขแแกแแแแแ แแแ แแแแแซแแแแก แแฃแแแก แแ แแแ แแขแแขแแแแ - แฌแแ แขแแแแแแแ แแแแแซแแแ
แจแแแซแแแแ แแแซแฃแแแก แแแแฆแแ แกแแแฃแจแแ แแแขแแแ แแแแแแก โแ แแแแกแขแ แแชแแโ Spot-แจแ แแแกแแจแแแแแ
แ แแแแฃแแ
แแแแแ แแแฅแแก, แ แแ แแฅแแแแแแแก แฌแแ แแแแแแแแแ แ แแแแแแแแ แแแกแขแ แฃแแแแขแ แกแแกแแ แแแแแ แแฅแแแแ แแฅแแแแ แฆแ แฃแแแแแแแ แแแแแกแแฎแแแแก แจแแกแแแชแแ แแแแแ. แแฅแแแ แจแแแแซแแแแ แแแแแแ แกแขแแขแแแก แจแแแแแ แกแแก แฃแแแขแแกแ แแแฌแแแ แแกแแแ แแฅ
แ แ แแ แแก แแฅแแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแ Kubernetes-แแ แฆแ แฃแแแแก แฎแแ แฏแแแแก แแแแแแแแกแแแแก? แแแฎแแแ แจแแแแขแงแแแแแแ แแแกแแแแ แแแ
แฌแงแแ แ: www.habr.com