ืชืจืืื ืืืืืจ ืืืื ืขืจื ืชืืืืช ืืงืืจืก
ืืืฆื ืืืกืื ืืขืืืืืช ืืขื ื ืืขืืืื ืขื Kubernetes? ืืื ืคืชืจืื ืืื ื ืืื, ืืื ืืืืจ ืื ืืชืืจ ืืื ืืืื ืฉืืืืืื ืืขืืืจ ืื ืื ืื ืืช ืืืฉืืืื ืฉืื ืืฆืืจื ืืขืืื ืืืชืจ ืืืืคืืืช ืืช ืขืืืืืช ืืืฉืื ืืขื ื ืฉืื.
ืืชืืชื ืืช ืืืืืจ ืืื ืขื Kubernetes ืขืืืจ AWS ืืจืืฉ, ืืื ืืื ืืืื (ืืืขื) ืืืืืง ืืืืชื ืฆืืจื ืขื ืกืคืงื ืขื ื ืืืจืื. ืื ื ืื ืื ืืืฉืืื/ืื ืฉืื ืืืจ ืืืืืจ ืงื ื ืืืื ืืืืืืื (
ืืืืจ ืื ืืืกื:
- ื ืืงืื ืืฉืืืื ืื ืืฉืืืืฉ (
ืงืื-ืฉืจืช ) - ืืงืื ืช ืงื ื ืืืืื ืืฉืขืืช ืฉืืื ื ืขืืืืืช (
kube-downscaler ) - ืืืืฆืขืืช ืงื ื ืืืื ืืืืืืื ืืืคืงื (HPA),
- ืืคืืชืช ืฉืืืจืช ืืฉืืืื ืืืืืืช (
kube-resource-report , VPA) - ืืืืฆืขืืช ืืืคืขื Spot
ื ืืงืื ืืฉืืืื ืฉืืื ื ืืฉืืืืฉ
ืขืืืื ืืกืืืื ืืืืจื ืื ื ืืืจ. ืื ืื ื ืจืืฆืื ืืจืืื ืื ืืื ืืืืืืื
(ืื ืื ื ื'ืืืงืืืก:
ื'ืืื:
(ืฆืืืืืื) ืงืืจื ืงืืืื:
ืืืชืืก: ืืฉืืื AWS ืฉืื ืืื ืคืื ืงืฆืื ืฉื ืืกืคืจ ืืืฉืชืืฉืื ืฉืืฉ ืื.
ืขืืืื: ืฆืืื ื-AWS ืฉืื ืืื ืคืื ืงืฆืื ืฉื ืืกืคืจ ืืืื ืืกืื ืฉืืฉ ืื.
ืืืืื ืงืืจื ืืกืื (ืืชืืืื):
ืขืืืื ืืืืชืืช: ืฆืืื ื-AWS ืฉืื ืืื ืคืื ืงืฆืื ืฉื ืืกืคืจ ืืืืจืื ืฉืฉืืืช ืืืฉืืืช/ืืืืืง.)
- ืืืืื ืจืืื ืืฉืืื ืืืืืื ืืืืืืจ ืืช ืืืื ืืืจืื ืืืืื (TTL) ืขืืืจ ืคืจืืกืืช ืืืกื ืฆืืืืจ/ืืืืงืืช.
- ื ืืชื ืืืืกืืฃ ืืขืจืืช ืืืฉืืืื ืืืืืื ื-janitor/ttl, ืืืฉื ืืื ืืืกืืจ ืืืืืืืืช ืืช ืืกืคืืืง/ืื-ืืืคืืก ืืืืจ 7 ืืืื.
ืืืืื ืืืืืื ืืืืืจืื ืืงืืืฅ YAML. ืื ืชืื ืฉืื ืขืืืจ ืืจื ืืคืจืืืจ --rules-file
ื-kube-janitor. ืื ื ืืื ืืืืืื ืืืกืจืช ืื ืืจืืื ืืฉืืืช ืืืชื -pr-
ืืฉื ืืืืจ ืืืืืื:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2d
ืืืืืื ืืืื ืืกืืืจื ืืช ืืฉืืืืฉ ืืชืืืืช ืืืคืืืงืฆืื ืืชืจืืืืื ืฉื Deployment ื-StatefulSet ืขืืืจ ืื ืืคืจืืกื/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 ืฉืื.
ืืื ืื ืื ืื ื ืฆืจืื ืืขืืื ืืืืื "ืืื ืืฉืืชื" ืฉื ืืฉืืื? ื ืืชื ืืื ืืข ืืฆืืืชืืช ืคืจืืกืืช ืืกืืืืืช ืืฉืื ืื ืงื ื ืืืื ืขื ืืื ืืืกืคืช ืืขืจื ืืืืจืื/ืื ืืืืื: ืืืช. ื ืืชื ืืืืจืื ืืืืคื ืืื ื ืคืจืืกืืช ืืืืฆืขืืช ืืืขืจื ืืืืจืื/ืื ืืืืื-ืขื ืขื ืืืชืืช ืืื ืืืืืืช ืืคืืจืื 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 ืงืืืขืื ืืช ืฆืจืื ืืืขืื/ืืืืจืื ืฉืืื ืืืืฆืขืืช "ืืงืฉืืช ืืฉืืืื". ืืฉืืื ืืขืื ื ืืืืื ืืืืืืช ืืืจืืืืืืืช ืื ืืืชืจ ื ืคืืฅ ื"ืืืืืงืืจืื", ืืืฉื 500m ืืจืื ืขื 50% vCPU. ืืฉืืื ืืืืจืื ื ืืืืื ืืืชืื, ืื ืืชื ืืืฉืชืืฉ ืืกืืืืืช ื ืคืืฆืืช, ืืื 500Mi, ืืืืืจ 500 ืืื. ืืฉืืืื ืืืงืฉืื "ื ืขืืืช" ืงืืืืืช ืืฆืืชื ืขืืืืื, ืืืืืจ ืคืื ืขื ืืงืฉืช ืืขืื ืฉื 1000 ื' ืืฆืืืช ืขื 4 vCPUs ืืฉืืืจ ืจืง 3 vCPUs ืืืื ืื ืืชืจืืืืื ืืืจืื.
ืจืคืืื (ืจืืจืื ืขืืืคืช) ืืื ืืืืื ืืื ืืืฉืืืื ืืืืืงืฉืื ืืฉืืืืฉ ืืคืืขื. ืืืืืื, ืคืื ืฉืืืงืฉ 2 GiB ืฉื ืืืืจืื ืืื ืืฉืชืืฉ ืจืง ื-200 MiB ืืฉ ~1,8 GiB ืฉื ืืืืจืื "ืขืืืฃ". ืขืืืฃ ืขืืื ืืกืฃ. ืืคืฉืจ ืืืขืจืื ืืืืคื ืืก ืฉ-1 GiB ืฉื ืืืืจืื ืืืืชืจ ืขืืื ~$10 ืืืืืฉ.
ืฆืืฆืื ืืงืฉืช ื-CPU ื-3000 ื' ื-~400 ื' ืืคื ื ืืฉืืืื ืืขืืืกื ืขืืืื ืืืจืื ืืืืคืฉืจ ืืืฉืืื ืืืืืช ืงืื ืืืชืจ.
"ืืฉืืืืฉ ืืืืืฆืข ืืืขืื ืืืืคืขื EC2 ืืจืืฃ ืืขืชืื ืงืจืืืืช ืืืืื ืืืืื ืืื-ืกืคืจืชื,"
ืืื ืืื ืื ืื ื ืืืืช ืจืืฆืื ืฉืื ืฉืื ืืฉื ื ืขืจืืื ืืงืืฆื YAML? ืื, ืืืื ืืช ืืืืืืช ืืขืฉืืช ืืช ืื ืืจืื ืืืชืจ ืืื! Kubernetes
ืืชืืชื ืงืื
ืฉืืืืฉ ื-EC2 Spot Instances
ืืืจืื ืืืื, ื ืืชื ืืืืืื ืืช ืขืืืืืช AWS EC2 ืขื ืืื ืฉืืืืฉ ืืืืคืขื Spot ืืฆืืืชื ืขืืืื ืฉื Kubernetes
ืืืฆื ืืืคืขืื ืืช Kubernetes ื-EC2 Spot? ืืฉื ื ืืกืคืจ ืืคืฉืจืืืืช: ืืฉืชืืฉ ืืฉืืจืืช ืฆื ืฉืืืฉื ืืื SpotInst (ื ืงืจื ืืขืช "Spot", ืื ืชืฉืื ืืืชื ืืื), ืื ืคืฉืื ืืืกืฃ Spot AutoScalingGroup (ASG) ืืืฉืืื ืฉืื. ืืืืืื, ืื ื ืงืืข CloudFormation ืขืืืจ ASG Spot "ืืืชืื ืืงืืืืืช" ืขื ืืกืคืจ ืกืืื ืืืคืขืื:
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 ืขื Kubernetes:
- ืืชื ืฆืจืื ืืืคื ืืืคืกืงืืช Spot, ืืืฉื ืขื ืืื ืืืืื ืืฆืืืช ืืืฉืจ ืืืืคืข ื ืขืฆืจ
- ืืื ืื ืืฉืชืืฉ
ืืืื ืงื ื ืืืื ืจืฉืื ืฉื ืืฉืืื ืขื ืกืืจื ืขืืืคืืืืช ืฉื ืืืืจ ืฆืืชืื - ืฆืืชืื ื ืงืืืชืืื
ื ืืชื ืืืคืืช ืืงืื "ืืจืฉืืืช" ืฉื ืขืืืกื ืขืืืื ืืืคืขืื ื-Spot
ืชืงืฆืืจ
ืื ื ืืงืืื ืฉืชืืฆื ืืื ืืืืืื ืฉืืืฆืื ืฉืืืืฉืืื ืืืคืืชืช ืืฉืืื ืืขื ื ืฉืื. ืืชื ืืืื ืืืฆืื ืืช ืจืื ืชืืื ืืืืืจ ืื ื
ืืื ืืฉืืืืช ืืืืืืฆืืช ืฉืื ืืืืกืืื ืืขืืืืืช ืืขื ื ื-Kubernetes? ืื ื ืืืืข ืื ื-
ืืงืืจ: www.habr.com