Liveness/Readiness թեստեր
2) Դիզայնի սկզբունքները
1. Կիսեք սեմանտիկները։
Readiness: արտաքին կարողությունը ծառայելու (հաշվի է առնում կրիտիկական կախվածությունները)։
Liveness 'գործընթացի «անբուժելի» վիճակը։
2. Fail-fox, բայց ոչ «false-fox»։ Timaute/շեմն «fail.ru Threshold» այնպես, որ կարճ աճը չի հանգեցնի ավելի մեծ ռեստարտների։
3. Փորձարկումների մեջ ոչ մի ծանր վիրահատություն։ Ստուգումը պետք է լինի արագ (100-200 մզ) և առանց կողմնակի ազդեցությունների։
4. Գրացիոզային դեգրադացիա։ Կախվածության մասնակի անհասանելիության դեպքում 'Readiness = OK, եթե կա անվտանգ ֆոլբեկ (kash/hotruning)։
5. Deterministic I/O. Կարգավիճակները կախված են միայն ներկա վիճակից, ոչ թե «պատահական» արտաքին թեստերից։
3) HEALTH-endpoints սեմանտիկան
3. 1 HTTP մոտեցում (խորհուրդ)
«GET/healthz/liveness» 200 եթե գործընթացը «կենդանի» է (event-loop պտտվում է, GC-ը չի խրվել, watchdog «սիրտը» ծեծում է)։
«GET/healthz/readiness» 200 եթե օրինակը պատրաստ է կրիտիկական դասարանի հետաձգման համար։ Ստուգումներ ՝ փամփուշտներ, տեղական քեշներ, բիզնեսի տրամաբանության միջուկի հասանելիությունը։
«GET/healthz/startup» -200-ը նախաձեռնությունից հետո (ստանդարտ/տաքացում/մոդելների բեռնում)։
Կանոնները
Դուք չեք կարող քայլել արտաքին BD/API-ում, դա կհանգեցնի «ինքնասպանությունների» ռուսական կախվածության ժամանակ։
Readiness-ում դուք կարող եք ստուգել կրիտիկական կախվածությունները, բայց թայմաուտների և դեգրադացիայի հետ, եթե կա վալիդային ֆոլբեկ, չնկատեք։
3. 2 gRPC Health Checking
Օգտագործեք www.'grpc։ health. v1. Health/Serving 's-scoped-ը («SERSERING», «DRT _ SERING»)։ Kubernetes-ի համար grpc-թեստեր (կամ http-2019)։
3. 3 Ներքին ձգումներ
Watchdog-ը «փափուկ» կանգառում է. SIGTERM-ում ցուցադրել Readiness = FAIL-ը նախատեսվում է գոյատևել «terminae Grance PeriodSeconds» - ը նախատեսվում է ավարտել, շարքերը։
4) Թայմինգները և շեմերը (tuning)
Kubernetes-ի հիմնական դաշտերը
`initialDelaySeconds`, `periodSeconds`, `timeoutSeconds`, `successThreshold`, `failureThreshold`.
Սկսնակ պրոֆիլների առաջարկությունները
Web/API արագ մեկնարկով
readiness: `period=5s, timeout=0. 2–0. 5s, failure=2`
liveness: `period=10s, timeout=0. 2–0. 5s, failure=3`
Ծանր սկիզբը (JIT/մոդել/պրոտեև)
startup:
readiness/liveness ակտիվանում են startup հաջողությունից հետո
Batch/consumer:- readiness արտահայտում է վերամշակման պատրաստակամությունը (միացում է բրոկերին, կա՞ արդյոք DLQ-դեգրադացիա),
- liveness - ներքին heartbeat loop.
Becoff-ի գրառումների վրա. Գրանցամատյանում օգտագործեք էքսպոնենցիալ backoff-ը կախվածության փոխպատվաստման համար, հակառակ դեպքում readiness-ը կլինի «փչացնել»։
5) Կազմաձևում (բեկորներ)
5. 1 Kubernetes, HTP թեստեր
yaml livenessProbe:
httpGet: { path: /healthz/liveness, port: 8080 }
periodSeconds: 10 timeoutSeconds: 1 failureThreshold: 3
readinessProbe:
httpGet: { path: /healthz/readiness, port: 8080 }
periodSeconds: 5 timeoutSeconds: 1 failureThreshold: 2
startupProbe:
httpGet: { path: /healthz/startup, port: 8080 }
periodSeconds: 5 failureThreshold: 60
5. 2 Kubernetes, gRPC-փորձարկում
yaml readinessProbe:
grpc:
port: 9090 service: my. app. Service periodSeconds: 5 timeoutSeconds: 1
5. 3 Graceful shutdown
yaml terminationGracePeriodSeconds: 30 lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","curl -s localhost:8080/healthz/drain && sleep 5"]
«/healthz/intain »-ը թարգմանում է Readiness = FAIL (stop-accepting), ժամանակ է տալիս ավարտել ակտիվ հարցումները։
6) Կախվածությունը և քայքայումը
Քննադատական (առանց դրանց չի կարելի ծառայել) 'BD հեղինակային իրավունքի համար '/login ", ստացիոնար դարպասը '/www.ru։ Դուք կարող եք ստուգել timeoutSeconds 'փորձարկումների 80 տոկոսը timeoutSeconds-ի հետ։
Ոչ ռիթմիկ 'վերլուծաբան, email, քեշի շերտ, երբ կա բեռնաթափում։ Մի միացրեք դրանք readiness-ում։ օգտագործեք ֆոլբեքը։
Feature-flags-ը 'մասնակի քայքայման ժամանակ անջատեք կախվածություն ունեցող ֆիչերը' պահպանելով Readiness = OK-ը։
7) Գծեր և ֆոնային բուժողներ
Consumers/Workers:- Readiness = OK, եթե բաժանորդագրությունը/brocker-ը տեղադրված է և կա վերամշակման ռեսուրս։
- DLQ/Lage Pro Readiness-ը կարող է մնալ OK (եթե մենք ընդունում և ծալում ենք), բայց SLI-ն «թարմ/լագը» կրակ ունի, ալերտը տվյալների համաձայն։
- Liveness: Վերահսկեք poll ցիկլը/heartbeat, դետեկտոր։
Idempotent: արագացնում է վերականգնումը liveness-ի վերականգնումից հետո։
8) Sidecar/mesh/ingress
Օգտագործելով wwww.mesh (Istio/Linkerd) probe-ը կարող է անցնել sidecar-ի միջոցով
Միացրեք «readom Gate» (K8s), որպեսզի հաշվի առնի sidecar կարգավիճակը,
Համոզվեք, որ փորձարկումները չեն ընկնում mTRK խոչընդոտների մեջ (կամ ավելացրեք բացառությունները)։
Ingress/Envoy/Nginx: Հավաքեք '/healthz/" տեղական, մի "դուրս հանեք" ներքին մանրամասները։
9) Անվտանգությունն ու գաղտնիությունը
Health-endpoints-ը չպետք է բացահայտի եզրերը, գրադարանների տարբերակները, սխալների տողերը միայն «OK/FAIL» + նվազագույն պատճառի կոդը։
Արտաքին հասանելիությունը սահմանափակեք (NetworkPolicy/ACL)։ Հանրային համար, եկեք միայն liveness-պինգ առանց մանրամասների։
Health-ստուգման լոգները DEBUG-ի մակարդակում, տրոտլինգի հետ։
10) Դիտարկումը և SLO-ն
Արտանետեք մետրերը ՝ "health _ readiness + status +," health _ liveness + status ", փորձարկման ժամանակ։
Միացրեք Readiness Flups-ը SLO հասանելիության հետ (էնդպոինտներից - 5xx/connectronet reset)։
Ալերտա
«Հաճախակի restarts liveness> N/ժամ» - պապերի/արտահոսքերի ախտանիշ։
«Flap Readiness> X/15 րոպե» - կախվածության/ցանցային խնդիրների ախտանիշ։
Հարաբերակցությունը դոպլոի հետ (")։ version`).
11) Թեստավորում
Unit/Winract: Endpoints '/healthz/" վերադարձնում են ճիշտ կարգավիճակները յուրաքանչյուր կախվածության անջատման ժամանակ։
Chaos: BD/kash/brocker: Readiness-ը պետք է ընկնի կամ ներառի ֆոլբեկը մոդելի վրա։ Liveness-ը չի ձգվում, եթե գործընթացը «կենդանի» է։
Load/Soak 'health-endpoints բեռի տակ պետք է արագ մնան (չփչացնել հակադրումը)։
Canary 'Ստուգեք Readiness-ը նախքան գնումների ավելացումը։
12) Հաճախակի սխալներ և ինչպես խուսափել դրանցից
Liveness ստուգում է BD/արտաքին API-ը։ Արդյունքը անսահման ռեստարտերն են պատահականության ժամանակ։ Որոշումը 'սահմանափակել liveness «գործընթացի կյանքը»։
Փորձարկումների ծանր ստուգումներ։ Այն հանգեցնում է կեղծ պատնեշների։ Լուծումը 'թեթև ստուգումներ + առանձին background-health մոնիտորներ։
Ոչ Startup Probe-ը։ Դանդաղ մեկնարկները «սպանում են» liveness. Լուծումը 'ավելացնել startup լայն պատուհանով։
Graceful shutdown-ի բացակայությունը։ Հազվագյուտ 5xx-ը դոպլեով։ Լուծումը 'preStop + հեռացումը հավասարակշռությունից։
Ֆլիպ փոթորիկներ։ Չափազանց ագրեսիվ շեմեր։ Լուծումը 'բարձրացնել «fail.ru Threshold», ավելացնել «timeoutSeconds», ավելացնել backoff։
Նույն էնդպոինտները ամեն ինչի համար։ Սեմանտիկի խառնուրդը։ Լուծումը 'առանձին «liveness/readiness/startup»։
13) Mini-Patterns իրականացման
Պարզ HTTP-handler (կեղծ)
python
@app. get("/healthz/liveness")
def liveness():
return 200
@app. get("/healthz/readiness")
def readiness():
ok_core = core_is_ready () # local pools/caches/initialization ok_db = db. ping (timeout = 50 _ ms) # only if the DB is critical return 200 if (ok_core and ok_db) else 503
@app. get("/healthz/startup")
def startup():
return 200 if INIT_DONE else 503
@app. post("/healthz/drain")
def drain():
set_readiness(False); return 200
GRPC health (գաղափարը)
go
// use google. golang. org/grpc/health/grpc_health_v1 healthServer. SetServingStatus("my. app. Service", SERVING) // or NOT_SERVING
Readom Gate (ճշմարտությունը mesh)
yaml spec:
readinessGates:
- conditionType: "proxy. istio. io/ready"
14) Չեկ թերթերը
Մինչ վաճառքը
- Բաժանված են liveness/readiness/startup էնդպոինտները, նկարագրված են նրանց սեմանտիկան։
- Liveness չի դիպչում արտաքին կախվածություններին. Readiness-ը ստուգում է միայն քննադատները թայմաուտների և ֆոլբեկի հետ։
- Տրամադրված են «initational Dray/period/timeout/fail.ru Threshold» -ի տակ։
- Ներառված է graceful shutdown: "preStop '+ վերացումը հավասարակշռությունից։
- Metriki/առողջության լույսերը միացված են; ալտերտեր/ֆլամպ։
- Կախվածության և դանդաղ մեկնարկի փորձարկումները անցան։
Վիրահատություն
- Շաբաթական զեկույց readiness և flups-ի վերաբերյալ։
- Շեմերից հետո։ հաղորդագրությունների հետ կապը։
- Կախվածության անջատման թեստեր։
- Սեմանտիկի արդիականությունը, երբ փոխում է կախվածության քննադատությունը։
15) FAQ
Մի՞ թե հնարավոր է փակել ամեն ինչ։
Օ ', անցանկալի է։ Բաժանեք «startup», «readiness», «liveness» - սա նվազեցնում է կեղծ գործարկումները և արագացնում RCA-ն։
Իսկ 'Ստուգե՞ լ քեշը readiness-ում։
Օ 'Եթե առանց քեշի կա ճիշտ (չնայած դանդաղ) ռեժիմ, մի ասեք readiness, պարզապես միացրեք դեգրադացիան։
Ի՞ նչ կարելի է անել հաճախակի liveness-ում։
Օ 'Նախ բացառեք ձեր ուտելիքը/արտահոսքը։ ապա թուլացրեք շեմերը և ավելացրեք watchdog։
Ինչպե՞ ս կարելի է հաշվի առնել բազմապատկությունը։
Օ 'Readiness-ը պետք է արտացոլի ցանկացած վարձավճար-2019 ծառայելու կարողությունը։ Հատուկ վարձողի մասնավոր խնդիրների համար մի փոխեք readiness-ը, այլ ազդարարեք առանձին SLI/alerts-ը։
Կապված նյութեր
«Դիտարկումը 'լոգներ, մետրեր, հետքեր»
«Բաշխված ուղիներ»
«SLO/SLA և մետրիկները»
«Վեբհուկի առաքման երաշխիքները»
«In Transit»
«Գաղտնիքների կառավարում»