Нова историја

Чекање: Суптилна уметност коју треба да овладате

од стране Nicolas Fränkel6m2025/04/25
Read on Terminal Reader

Предуго; Читати

Недавно, док сам радио на радионицу под називом Тестирање вашег захтева за повлачење на Кубернетесу са ГКЕ и ГитХуб Ацтионс-ом, двапут сам се суочио са истим проблемом: служби А треба сервис Б, али сервис А почиње брже од сервиса Б, а систем не успева.
featured image - Чекање: Суптилна уметност коју треба да овладате
Nicolas Fränkel HackerNoon profile picture

Недавно, док је радио на радионици под називомТестирање вашег захтева за повлачење на Кубернетесу са ГКЕ и ГитХуб акцијама, Суочио сам се са истим проблемом два пута: сервис А треба сервис Б, али сервис А почиње брже од сервиса Б, а систем не успева.

Čekanje u Kubernetes

Може звучати чудно чекати у Кубернетесу. Самоздрављива природа платформе Кубернетес је једна од његових највећих предности. Хајде да размотримо два подпода: апликацију Питхон и ПостгреСКЛ базу података.


Апликација почиње веома брзо и жељно покушава да успостави везу са базом података. У међувремену, база се иницијализује са обезбеђеним подацима; веза не успева.FailedДржава .


Након неког времена, Кубернетес тражи стање под апликације. Пошто није успео, он га прекида и покреће нови под. У овом тренутку, могу се догодити две ствари: под базе података још није спреман, и вратио се на квадрат, или је спреман, а апликација се коначно повезује.

Да би се убрзао процес, Кубернетес нудиСтарт проба• :


startupProbe:
  httpGet:
    path: /health
    port: 8080
  failureThreshold: 30
  periodSeconds: 10


Са горе наведеном сонда, Кубернетес чека првих десет секунди пре него што затражи статус под. Ако не успе, чека још десет секунди. Исперите и поновите 30 пута пре него што дефинитивно не успе.


Možda ste primetili HTTP/healthкрајње тачке изнад. Kubernetes нуди два ексклузивнаТестирањеПодешавање конфигурације:httpGetилиexecПрви је погодан за веб апликације, док је други за друге апликације. То значи да морамо да знамо коју врсту контејнера под садржи и како да провери његово стање, под условом да може.Битнами Хелм графиконIzgleda sledeće kada se primenjuje:


startupProbe:
  exec:
    command:
      - /bin/sh
      - -c
      - -e
      - exec pg_isready -U $PG_USER -h $PG_HOST -p $PG_PORT

Имајте на уму да је горе наведено поједностављење, јер са задовољством игнорише назив базе података и ССЛ сертификат.


Старт сонда убрзава ствари у поређењу са подразумеваном ситуацијом ако га правилно конфигуришете. Можете поставити дуго почетно одлагање, а затим краће повећања. Међутим, што су контејнери разноврснији, то је теже конфигурирати, јер морате бити стручњак у сваком од основних контејнера.


Било би корисно тражити алтернативе.

Чекић4x

Алтернативе су алати чији је фокус на чекању.Пре много времена, нашао самЧекајIdeja je jednostavna: Ideja je jednostavna:


./wait-for је скрипт дизајниран да синхронизује услуге као што су доцкер контејнери.

./wait-for је скрипт дизајниран да синхронизује услуге као што су доцкер контејнери.


Ево како да сачекате HTTP API:


sh -c './wait-for http://my.api/health -- echo "The api is up! Let's use it"'


Добио је посао, али у то време, морали сте да копирате сценарио и ручно проверите за ажурирања.


Четвртак xигра исту улогу, али је доступан као контејнер верзије и пружа више услуга за чекање: ХТТП, ДНС, базе података и редове порука.


Који год алат користите, можете га користити унутарИнтензивни контејнери• :


Под може имати више контејнера који покрећу апликације унутар њега, али може имати и један или више init контејнера, који се покрећу пре него што се контејнери апликације покрену.

Контејнери Init су редовни контејнери, осим:


    Init kontejneri uvek rade do završetka.Svaki init kontejner mora biti uspešno završen pre nego što sledeći počne.

Под може имати више контејнера који покрећу апликације унутар њега, али може имати и један или више init контејнера, који се покрећу пре него што се контејнери апликације покрену.

Контејнери Init су редовни контејнери, осим:


    Init kontejneri uvek rade do završetka.Svaki init kontejner mora biti uspešno završen pre nego što sledeći počne.


Zamislite sledećePodTo zavisi od PostgreSQLDeployment• :


apiVersion: v1
kind: Pod
metadata:
  labels:
    type: app
    app: recommandations
spec:
  containers:
    - name: recommandations
      image: recommandations:latest
      envFrom:
        - configMapRef:
            name: postgres-config


Апликација је Питхон и почиње прилично брзо. Покушава да се повеже са ПостгреСКЛ базом података. Нажалост, база података није завршила иницијализацију, тако да веза не успева, а Кубернетес поново покреће под.


Можемо га поправити саinitContainerИ још један контејнер:


apiVersion: v1
kind: Pod
metadata:
  labels:
    type: app
    app: recommandations
spec:
  initContainers:
    - name: wait-for-postgres
      image: atkrad/wait4x:3.1
      command:
        - wait4x
        - postgresql
        - postgres://$(DATABASE_URL)?sslmode=disable
      envFrom:
        - configMapRef:
            name: postgres-config
  containers:
    - name: recommandations
      image: recommandations:latest
      envFrom:
        - configMapRef:
            name: postgres-config


U gore navedenom obliku, nainitContainerne prestaje dok baza podataka ne prihvati veze. Kada to učini, prestaje irecommandationsконтејнер може да почне. Кубернетес не мора да прекинеPodKao i u prethodnom podešavanju! uključuje manje dnevnika i potencijalno manje obaveštenja.

Када чекање постаје обавезно

Горе наведено је благо побољшање, али можете учинити без њега. У другим случајевима, чекање постаје обавезно. Недавно сам то искусио приликом припреме за горе поменуту радионицу. Сценарио је следећи:


  • Pipeline primenjuje manifest na Kubernetes strani
  • У следећем кораку, он покреће тест
  • Kako test počinje pre nego što se aplikacija pročita, ne uspeva.


Морамо да сачекамо док је бацкенд спреман пре него што тестирамо.wait4xda čekaš naPodда прихватимо захтеве пре него што покренемо тестове:


      - name: Wait until the application has started
        uses: addnab/docker-run-action@v3                                       #1
        with:
          image: atkrad/wait4x:latest
          run: wait4x http ${{ env.BASE_URL }}/health --expect-status-code 200  #2
  1. ГитХуб Акција омогућава покретање контејнера. Могао сам да преузмем Го бинарни уместо тога.
  2. Сачекајте док /health крајња тачка не врати код одговора 200.

Закључак

Kubernetes probe za pokretanje su odličan način da izbegnete nepotrebno restartovanje kada pokrenete usluge koje zavise jedno od drugog.initContainer. .wait4xје алат који се може користити у другим контекстима. Сада је део мог појаса за алате.


To go further:


  • Четвртак x
  • Дакле, морате да сачекате неке ресурсе Кубернетеса?



Оригинално објављено у A Java Geek on April 20th, 2025

Јава Геек
L O A D I N G
. . . comments & more!

About Author

Nicolas Fränkel HackerNoon profile picture
Nicolas Fränkel@nfrankel
Dev Advocate | Developer & architect | Love learning and passing on what I learned!

ХАНГ ТАГС

ОВАЈ ЧЛАНАК ЈЕ ПРЕДСТАВЉЕН У...

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks