рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдХреЗрд▓рд┐рдВрдЧ



рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐: рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рджрд┐рди рдореЗрдВ рдПрдХ рдкреАрдХ рд▓реЛрдб рд╣реИ, рдФрд░ рдЕрдиреНрдп рдШрдВрдЯреЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣реА рдХрднреА); рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░рд╛рдд рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ рдкрд╛рд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ, рдХреБрдЫ рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕рд╛рдзрди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдкрдХреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдорд╣рд╛рди рд╣реИрдВред рдЗрд╕рдореЗрдВ рдПрдХ рдХреНрд╖реИрддрд┐рдЬ рдкреЙрдб рдСрдЯреЛрд╕реНрдХреЛрд▓рд░ рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЖрдкреВрд░реНрддрд┐ рдЖрдорддреМрд░ рдкрд░ рдореАрдЯреНрд░рд┐рдХ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЕрдЧрд▓рд╛, рдореИрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рд╕рд╛рде рдореАрдЯреНрд░рд┐рдХ рд╕рд░реНрд╡рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореАрдЯреНрд░рд┐рдХ рд╕рд░реНрд╡рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИ) рдФрд░ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдк рд╣реЗрд▓реНрдо рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдереА)ред рдореАрдЯреНрд░рд┐рдХ рд╕рд░реНрд╡рд░ рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред



# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/" | jq { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "metrics.k8s.io/v1beta1", "resources": [ { "name": "nodes", "singularName": "", "namespaced": false, "kind": "NodeMetrics", "verbs": [ "get", "list" ] }, { "name": "pods", "singularName": "", "namespaced": true, "kind": "PodMetrics", "verbs": [ "get", "list" ] } ] } 

рдлрд┐рд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВ ред рдпрд╣ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-рдПрдбреЗрдкреНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдПрдХ рдЪрд╛рд░реНрдЯ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯреЛ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреАред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq 

(рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд╕реВрдЪреА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛)

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ metrics.k8s.io рдФрд░ custom.metrics.k8s.io urls рдХрд╛ рдЕрд░реНрде рд╣реИ, рдкреНрд░рд▓реЗрдЦрди рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд░ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд▓реЙрдЧ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рджреЗрдЦреЛред рдЖрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

рдЕрдм рдСрдЯреЛрд╕рд╛рд▓рд┐рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрддрд╛рд░ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХрддрд╛рд░ рдХрд╛ рдЖрдХрд╛рд░ рдХреБрдЫ рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдХрддрд╛рд░ рдореЗрдВ рддреЗрдЬрд╝реА рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЪреВрд▓реНрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЬреИрд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдз

 wqueue_tube_total_size{tube="dmload-legacy"} 

рдпрд╣ рд░рд┐рдЯрд░реНрди:

 wqueue_tube_total_size{endpoint="pprof-port",instance="10.116.2.237:8542",job="wqueue-pprof",namespace="default",pod="wqueue-b9fdd9455-66mwm",service="wqueue-pprof",tube="dmload-legacy"} 32 

рдФрд░ рдореИрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

 - seriesQuery: wqueue_tube_total_size{tube="dmload-legacy"} resources: overrides: namespace: resource: namespace tube: resource: service name: {as: "wqueue_tube_total_size_dmload_legacy"} metricsQuery: wqueue_tube_total_size{tube="dmload-legacy"} 

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореБрдЭреЗ service рдореЗрдВ tube рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╣реИ, рдлрд┐рд░ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрдЪрдкреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рд╣реЗрдкрд╛ рд╡рд┐рдиреНрдпрд╛рд╕:

 --- kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2beta1 metadata: name: dmload-v3-legacy namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: dmload-v3-legacy minReplicas: 2 maxReplicas: 20 metrics: - type: Object object: metricName: wqueue_tube_total_size_dmload_legacy target: apiVersion: v1 kind: Service name: dmload-legacy targetValue: 30 

рдпрд╣рд╛рдВ рдореИрдВ wqueue_tube_total_size_dmload_legacy рд╣реВрдВ рдХрд┐ рдЬреИрд╕реЗ рд╣реА wqueue_tube_total_size_dmload_legacy рдХрддрд╛рд░ рдореЗрдВ рдиреМрдХрд░рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 30 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддрдм рддрдХ рдлрд▓реА рдЬреЛрдбрд╝реЗрдВ, рдЬрдм рддрдХ рдХрд┐ 20 рди рд╣реЛрдВ, рдФрд░ рдЕрдЧрд░ targetValue 30 рд╕реЗ рдиреАрдЪреЗ рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ 2 рддрдХ рдХрдо рдХрд░реЗрдВред

рд╣рдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдХрдИ рджрд┐рдиреЛрдВ рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рд╕рд┐рд░реНрдл рдЪреВрд▓реНрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ:

 # kubectl describe hpa dmload-v3-legacy Name: dmload-v3-legacy Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"dmload-v3-legacy","namespace":"d... CreationTimestamp: Thu, 24 Jan 2019 16:16:43 +0300 Reference: Deployment/dmload-v3-legacy Metrics: ( current / target ) "wqueue_tube_total_size_dmload_legacy" on Service/dmload-legacy: 14 / 30 Min replicas: 2 Max replicas: 20 Deployment pods: 15 current / 14 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True SucceededRescale the HPA controller was able to update the target scale to 14 ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from Service metric wqueue_tube_total_size_dmload_legacy ScalingLimited False DesiredWithinRange the desired count is within the acceptable range Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 59m (x14 over 40h) horizontal-pod-autoscaler New size: 13; reason: All metrics below target Normal SuccessfulRescale 59m (x13 over 40h) horizontal-pod-autoscaler New size: 12; reason: All metrics below target Normal SuccessfulRescale 57m (x14 over 40h) horizontal-pod-autoscaler New size: 11; reason: All metrics below target Normal SuccessfulRescale 56m (x14 over 40h) horizontal-pod-autoscaler New size: 10; reason: All metrics below target Normal SuccessfulRescale 56m (x11 over 38h) horizontal-pod-autoscaler New size: 8; reason: All metrics below target Normal SuccessfulRescale 55m (x6 over 36h) horizontal-pod-autoscaler New size: 7; reason: All metrics below target Normal SuccessfulRescale 47m (x103 over 40h) horizontal-pod-autoscaler (combined from similar events): New size: 20; reason: Service metric wqueue_tube_total_size_dmload_legacy above target Normal SuccessfulRescale 3m38s (x19 over 41h) horizontal-pod-autoscaler New size: 17; reason: All metrics below target Normal SuccessfulRescale 2m8s (x23 over 41h) horizontal-pod-autoscaler New size: 16; reason: All metrics below target Normal SuccessfulRescale 98s (x20 over 40h) horizontal-pod-autoscaler New size: 15; reason: All metrics below target Normal SuccessfulRescale 7s (x18 over 40h) horizontal-pod-autoscaler New size: 14; reason: All metrics below target 

рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ 1.13.2 рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-рдСрдкрд░реЗрдЯрд░ рдШрдЯрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдмрдирд╛рдП рдЧрдП рдереЗред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрддрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕ рдХрддрд╛рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдлрд▓реА рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред


(рдЧреНрд░рд╛рдл рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХрддрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢реНрд░рд╡рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ)

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi442638/


All Articles