Недавно, док је радио на радионици под називомТестирање вашег захтева за повлачење на Кубернетесу са ГКЕ и ГитХуб акцијама, Суочио сам се са истим проблемом два пута: сервис А треба сервис Б, али сервис А почиње брже од сервиса Б, а систем не успева.
Č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ćePod
To 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, nainitContainer
ne prestaje dok baza podataka ne prihvati veze. Kada to učini, prestaje irecommandations
контејнер може да почне. Кубернетес не мора да прекинеPod
Kao 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.
Морамо да сачекамо док је бацкенд спреман пре него што тестирамо.wait4x
da č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
- ГитХуб Акција омогућава покретање контејнера. Могао сам да преузмем Го бинарни уместо тога.
- Сачекајте док /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
Јава Геек