← Containers / containers / platform-details
Rollouty
Jak fungují rollouty
A rollout aplikuje cílovou konfiguraci aplikace kontejneru poté, co deploy Worker, který používá Containers. Cíl může měnit obraz, typ instance, limity, umístění nebo jiná nastavení kontejneru.
A instance kontejneru je jedna běžící kopie vašeho image kontejneru v síti Cloudflare. Spouští proces, který zahajuje váš image (ENTRYPOINT/CMD v Dockerfile, případně výchozí hodnota základního image). Když cíl změní image, rollout nahradí instance kontejnerů kopiemi, které běží na cílovém image. Rollouty nemění úložiště Durable Object.
Když se změní efektivní konfigurace existující kontejnerové aplikace, wrangler deploy:
- Nahraje a aktivuje novou verzi Workeru, včetně kódu třídy Durable Object.
- V případě potřeby sestaví a pushne image podle Dockerfile, nebo použije nakonfigurovaný odkaz na image v registru.
- Spustí rollout, který použije cílovou konfiguraci kontejneru.
Worker je aktivní ještě před tím, než začnou kroky pro image a rollout. Tyto kroky nejsou transakční, takže Worker může zůstat aktivní i v případě, že některý pozdější krok s image nebo rolloutem selže. Úspěšné nasazení znamená, že rollout začal, ne že se dokončila náhrada všech instancí kontejneru. První nasazení vytvoří aplikaci kontejneru přímo a nasazení bez skutečných změn kontejneru žádný rollout nespustí.
Když se image změní, nový kód Workeru může až do dokončení rolloutu stále komunikovat s instancemi kontejneru na předchozím image. V tomto okně upřednostněte změny Workeru a image, které spolu fungují společně, nebo zvolte okamžité pokud potřebujete nejkratší smíšené okno, které platforma umožňuje.
Názvy polí a povolené hodnoty jsou uvedeny v části Konfigurace Containers.
Výchozí hodnoty
| Nastavení | Výchozí |
|---|---|
rollout_step_percentage |
100 v případě, že max_instances je vynecháno nebo menší než 2; jinak [10, 100] |
rollout_active_grace_period |
0 sekund |
| Sekvence zastavení při výměně instance kontejneru | SIGTERM hlavnímu procesu a poté SIGKILL po 15 minutách, pokud se neukončil |
Postupné nasazování
Ve výchozím nastavení Wrangler spouští postupné nasazení pomocí rollout_step_percentage. Pokud max_instances je vynecháno nebo menší než 2, Wrangler používá jeden 100 krok. Jinak si Wrangler vyžádá [10, 100]:
- Vyžádejte cíl přibližně 10 % instancí kontejnerů s novou konfigurací. Platforma toto procento v případě potřeby zvýší tak, aby daný krok představoval alespoň jednu instanci při nakonfigurovaném
max_instances. - Cílí na 100% instancí kontejneru s novou konfigurací.
Nakonfigurujte kroky pomocí rollout_step_percentage ve Wrangleru. Výchozí plán pro jedno nasazení přepíšete pomocí --containers-rollout.
Jak se nahrazuje instance kontejneru
Když rollout vybere instanci kontejneru k aktualizaci:
- Ochranná lhůta (pokud je nakonfigurována). Pokud
rollout_active_grace_periodje větší než0, instance kontejneru, které se teprve nedávno připojily ke svému Durable Object se přeskakují, dokud neprojdou tímto oknem. Výchozí hodnota0znamená žádné další čekání. Viz Aktivní ochranná lhůta rolloutu. - Signalizace zastavení. Platforma odešle
SIGTERMhlavnímu procesu v kontejneru, aby mohl přestat přijímat novou práci a dokončit rozpracovanou práci. OšetřeteSIGTERMve vašem image, pokud tento proces před ukončením potřebuje úklid. - Vyprázdnění. Proces má až 15 minut na ukončení po
SIGTERM. - V případě potřeby vynuťte zastavení. Pokud proces stále běží i po 15 minutách, platforma odešle
SIGKILL. - Po ukončení. Třída Container
onStophook se ve Workeru spustí až poté, co proces kontejneru skončí. - Spuštění nové instance kontejneru s cílovým obrazem. Disk je dočasný pokud data neukládáte mimo souborový systém kontejneru.
Každá vybraná instance Container prochází touto sekvencí podle vlastního plánu. Celá flotila se nerestartuje najednou.
Požadavky během spouštění instance kontejneru
Nová instance kontejneru musí spustit svůj proces. Spuštění obvykle trvá řádově sekundy, v závislosti na velikosti image a na tom, co se při startu spouští. Více informací najdete v studené starty.
Požadavek, který danou instanci kontejneru potřebuje, může čekat, dokud kontejner nebude připravený, nebo selže, pokud je časový limit klienta či Workeru kratší než doba spuštění. Práci při spouštění udržujte rychlou, používejte kontroly připravenosti portu, pokud je máte nastavené, a časové limity volte s ohledem na dobu spuštění.
Aktivní ochranná lhůta rolloutu
rollout_active_grace_period platí pouze během rolloutu, kdy platforma vybírá, které instance kontejneru nahradit.
Containers jsou díky Durable Objects. Každá běžící instance kontejneru je přiřazena k instanci Durable Object, která ji spouští a posílá jí provoz. Ochranná lhůta udává, jak dlouho už toto spojení muselo běžet, než smí rollout kontejner vypnout. Neměří se od dokončení nasazení.
| Hodnota | Účinek |
|---|---|
0 (výchozí) |
Žádná další ochrana. Vybrané instance kontejnerů mohou být nahrazeny, jakmile je rollout zasáhne. |
Více než 0 (například 300) |
Instance kontejneru, které jsou ke svému Durable Object připojené kratší dobu, než je zde uvedený počet sekund, se ponechají beze změny, dokud tuto dobu nepřekročí. |
Nenulovou hodnotu použijte, pokud mají krátké relace skončit dřív, než je kontejner nahrazen rolloutem. Instance kontejneru, které jsou připojené déle, mohou být nahrazeny i po uplynutí tohoto časového okna.
rollout_active_grace_period platí pro každý режим rolloutu, včetně okamžité.
Režimy rolloutu
--containers-rollout platí pro wrangler deploy pouze. Nevztahuje se na wrangler versions upload.
Při úplném nasazení Wrangler aktivuje Worker ještě před zpracováním image kontejneru a rolloutu. Režim rolloutu určuje, jak se použije cílová konfigurace kontejneru.
| Režim | Příznak | Instance kontejneru |
|---|---|---|
| Postupné (výchozí) | vynechat příznak | Použijte rollout_step_percentage, který může obsahovat jeden nebo více kroků |
| Okamžité | --containers-rollout=immediate |
Cílení na 100% instancí kontejneru v jednom kroku |
| Žádné | --containers-rollout=none |
Ponechat obrazy a běžící instance kontejnerů beze změny; nasadit pouze kód Workeru |
Okamžité
Možnost Okamžité nastaví plán nasazení na jediný krok, který cílí na 100 % instancí kontejnerů. Neexistuje žádné mezikrokové zadržení na určitém procentu.
npx wrangler deploy --containers-rollout=immediateHodnotu immediate použijte, pokud musí kód Workeru a obraz kontejneru zůstat kompatibilní a chcete, aby přechodné okno bylo co nejkratší, jak to platforma umožňuje (například při zásadní změně komunikace Workeru s procesem uvnitř obrazu).
Chování:
- Nová verze Workeru se aktivuje ještě před tím, než se zpracuje obraz kontejneru a rollout.
- Rollout pak nahrazuje instance kontejnerů až na 100% pomocí stejného sekvence nahrazení jako postupný režim, včetně ochranné lhůty, pokud je nakonfigurována.
- Nahrazení probíhá v reálném čase. Doba trvání závisí na počtu běžících instancí kontejnerů, na tom, jak dlouho trvá zastavení a spuštění každé z nich, a na případné ochranné lhůtě.
- Když se image změní, možnost immediate minimalizuje, ale zcela neodstraňuje období, kdy nový Worker může ještě dosáhnout instancí na předchozím image.
- Úspěšné nasazení znamená, že rollout začal, nikoli že se dokončila výměna instancí.
Žádné
None ponechá images a běžící instance kontejnerů beze změny a nasadí pouze kód Workeru.
Hodnotu none použijte, pokud nasazení nemá publikovat nový obraz ani spouštět rollout instancí kontejneru. Pokud image je cesta k Dockerfile a Docker není dostupný, může Wrangler tento příznak nebo funkční instalaci Docker vyžadovat, aby nasazení mohlo kroky s kontejnerem přeskočit.
Příklad konfigurace
rollout_active_grace_period 300 sekund (pět minut) a zvyšuje se v krocích po [10, 100]:
{
"containers": [
{
"max_instances": 10,
"class_name": "MyContainer",
"image": "./Dockerfile",
"rollout_active_grace_period": 300,
"rollout_step_percentage": [10, 100],
},
],
"durable_objects": {
"bindings": [
{
"name": "MY_CONTAINER",
"class_name": "MyContainer",
},
],
},
"migrations": [
{
"tag": "v1",
"new_sqlite_classes": ["MyContainer"],
},
],
}[[containers]]
max_instances = 10
class_name = "MyContainer"
image = "./Dockerfile"
rollout_active_grace_period = 300
rollout_step_percentage = [ 10, 100 ]
[[durable_objects.bindings]]
name = "MY_CONTAINER"
class_name = "MyContainer"
[[migrations]]
tag = "v1"
new_sqlite_classes = [ "MyContainer" ]