Припрема апликације за Истио

Припрема апликације за Истио

Истио је згодан алат за повезивање, обезбеђење и надгледање дистрибуираних апликација. Истио користи различите технологије за покретање и управљање софтвером у великом обиму, укључујући контејнере за паковање кода апликације и зависности за примену, и Кубернетес за управљање тим контејнерима. Стога, да бисте радили са Истио-ом, морате знати како функционише апликација са више сервиса заснованих на овим технологијама без Истио. Ако су вам ови алати и концепти већ познати, слободно прескочите овај водич и пређите право на одељак Инсталирање Истио-а на Гоогле Кубернетес Енгине (ГКЕ) или инсталирање екстензије Истио на ГКЕ.

Ово је водич корак по корак у којем ћемо проћи кроз цео процес од изворног кода до ГКЕ контејнера да бисмо вам кроз пример пружили основно разумевање ових технологија. Такође ћете видети како Истио користи моћ ових технологија. Ово претпоставља да не знате ништа о контејнерима, Кубернетес-у, сервисним мрежама или Истио-у.

задаци

У овом водичу ћете завршити следеће задатке:

  1. Учење једноставне апликације хелло ворлд са више услуга.
  2. Покрените апликацију из изворног кода.
  3. Паковање апликације у контејнере.
  4. Креирање Кубернетес кластера.
  5. Постављање контејнера у кластер.

Пре него што почнеш

Пратите упутства да бисте омогућили Кубернетес Енгине АПИ:

  1. Идите у Страница Кубернетес Енгине у конзоли Гоогле Цлоуд Платформ.
  2. Креирајте или изаберите пројекат.
  3. Сачекајте док се АПИ и повезани сервиси не омогуће. Ово може да потраје неколико минута.
  4. Уверите се да је обрачун подешен за ваш пројекат Гоогле Цлоуд Платформ. Сазнајте како да омогућите наплату.

У овом водичу можете користити Цлоуд Схелл, који припрема виртуелну машину г1-смалл у Гоогле Цомпуте Енгине-у са Линук-ом заснованим на Дебиан-у, или Линук или мацОС рачунаром.

Опција А: Коришћење Цлоуд Схелл-а

Предности коришћења Цлоуд Схелл-а:

  • Питхон 2 и Питхон 3 развојна окружења (укључујући виртуаленв) су потпуно конфигурисани.
  • Алатке командне линије гцлоуд, доцкер, git и кубецтл, које ћемо користити су већ инсталирани.
  • Имате неколико на избор уређивачи текста:
    1. Уредник кода, који се отвара са иконом за уређивање на врху прозора Цлоуд Схелл.
    2. Емацс, Вим или Нано, који се отварају из командне линије у Цлоуд Схелл-у.

Користити Цлоуд Схелл:

  1. Идите на ГЦП конзолу.
  2. Притисните дугме Активирајте Цлоуд Схелл (Активирајте Цлоуд Схелл) на врху прозора ГЦП конзоле.

Припрема апликације за Истио

У доњем делу ГЦП конзола Цлоуд Схелл сесија са командном линијом ће се отворити у новом прозору.

Припрема апликације за Истио

Опција Б: Локално коришћење алата командне линије

Ако ћете радити на рачунару који користи Линук или мацОС, мораћете да конфигуришете и инсталирате следеће компоненте:

  1. Прилагоди Питхон 3 и Питхон 2 развојно окружење.

  2. Инсталирајте Цлоуд СДК са алатом командне линије гцлоуд.

  3. Сет кубецтл - алат командне линије за рад са Кубернетес.

    gcloud components install kubectl

  4. Сет Доцкер Цоммунити Едитион (ЦЕ). Користићете алатку командне линије доцкерда креирате слике контејнера за пример апликације.

  5. Инсталирајте алат Гит контрола верзијада добијете пример апликације са ГитХуб-а.

Преузмите узорак кода

  1. Преузмите изворни код хеллосервер:

    git clone https://github.com/GoogleCloudPlatform/istio-samples

  2. Идите на пример директоријума кода:

    cd istio-samples/sample-apps/helloserver

Истраживање апликације са више услуга

Пример апликације је написан у Питхон-у и састоји се од две компоненте које су у интеракцији помоћу ОДМОР:

  • сервер: једноставан сервер са једном крајњом тачком ДОБИТИ, /, који штампа "здраво свет" на конзоли.
  • лоадген: скрипта која шаље саобраћај ка сервер, са подесивим бројем захтева у секунди.

Припрема апликације за Истио

Покретање апликације из изворног кода

Да бисте истражили пример апликације, покрените је у Цлоуд Схелл-у или на рачунару.
1) У каталогу истио-самплес/сампле-аппс/хеллосервер трцати сервер:

python3 server/server.py

Приликом покретања сервер приказује се следеће:

INFO:root:Starting server...

2) Отворите други прозор терминала за слање захтева сервер. Ако користите Цлоуд Схелл, кликните на икону за додавање да бисте отворили другу сесију.
3) Пошаљите захтев на сервер:

curl http://localhost:8080

сервер одговара:

Hello World!

4) Из директоријума у ​​који сте преузели узорак кода идите на директоријум који садржи лоадген:

cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen

5) Креирајте следеће променљиве окружења:

export SERVER_ADDR=http://localhost:8080
export REQUESTS_PER_SECOND=5

6) Трчи виртуаленв:

virtualenv --python python3 env

7) Активирајте виртуелно окружење:

source env/bin/activate

8) Поставите захтеве за лоадген:

pip3 install -r requirements.txt

9) Трчи лоадген:

python3 loadgen.py

Приликом покретања лоадген приказује нешто попут следеће поруке:

Starting loadgen: 2019-05-20 10:44:12.448415
5 request(s) complete to http://localhost:8080

У другом прозору терминала сервер шаље следеће поруке на конзолу:

127.0.0.1 - - [21/Jun/2019 14:22:01] "GET / HTTP/1.1" 200 -
INFO:root:GET request,
Path: /
Headers:
Host: localhost:8080
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*

Из перспективе умрежавања, цела апликација ради на једном хосту (локални рачунар или Цлоуд Схелл виртуелна машина). Стога можете користити лоцалхостза слање захтева сервер.
10) Престати лоадген и сервер, ентер Цтрл-ц у сваком прозору терминала.
11) У прозору терминала лоадген деактивирајте виртуелно окружење:

deactivate

Паковање апликације у контејнере

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

Да бисте упаковали апликацију у контејнер, потребно вам је Доцкерфиле. Доцкерфиле је текстуална датотека која дефинише команде за уградњу изворног кода апликације и њених зависности у Доцкер слика. Када се направи, слику отпремате у регистар контејнера као што је Доцкер Хуб или Registar kontejnera.

Пример већ има Доцкерфиле за сервер и лоадген са свим потребним командама за прикупљање слика. Испод - Доцкерфиле за сервер:

FROM python:3-slim as base
FROM base as builder
RUN apt-get -qq update 
    && apt-get install -y --no-install-recommends 
        g++ 
    && rm -rf /var/lib/apt/lists/*

# Enable unbuffered logging
FROM base as final
ENV PYTHONUNBUFFERED=1

RUN apt-get -qq update 
    && apt-get install -y --no-install-recommends 
        wget

WORKDIR /helloserver

# Grab packages from builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/

# Add the application
COPY . .

EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]

  • Тим ФРОМ питхон:3-слим као основа каже Доцкер-у да користи најновије Питхон 3 слика као основа.
  • Тим ЦОПИ. . копира изворне датотеке у тренутни радни директориј (само у нашем случају сервер.пи) у систем датотека контејнера.
  • УЛАЗНА ТАЧКА дефинише команду која се користи за покретање контејнера. У нашем случају, ова команда је скоро иста као она коју сте користили сервер.пи из изворног кода.
  • Тим ЕКСПОСЕ указује на то сервер чека податке преко порта 8080. Овај тим није обезбеђује луке. Ово је нека врста документације која је потребна за отварање порта 8080 приликом покретања контејнера.

Припрема за контејнеризацију ваше апликације

1) Подесите следеће променљиве окружења. Заменити ПРОЈЕЦТ_ИД на ИД вашег ГЦП пројекта.

export PROJECT_ID="PROJECT_ID"

export GCR_REPO="preparing-istio"

Коришћење вредности ПРОЈЕЦТ_ИД и ГЦР_РЕПО означите Доцкер слику када је направите и гурнете је у приватни регистар контејнера.

2) Подесите подразумевани ГЦП пројекат за алатку командне линије гцлоуд.

gcloud config set project $PROJECT_ID

3) Подесите подразумевану зону за алатку командне линије гцлоуд.

gcloud config set compute/zone us-central1-b

4) Уверите се да је услуга регистра контејнера омогућена у ГЦП пројекту.

gcloud services enable containerregistry.googleapis.com

Сервер за контејнеризацију

  1. Идите у директоријум где се налази пример сервер:

    cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/

  2. Саставите слику користећи Доцкерфиле и променљиве окружења које сте раније дефинисали:

    docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1 .

Параметар -t представља Доцкер ознаку. Ово је назив слике коју користите приликом постављања контејнера.

  1. Отпремите слику у регистар контејнера:
    docker push gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1

Контејнеризација лоадгена

1) Идите у директоријум где се налази пример лоадген:

cd ../loadgen

2) Сакупите слику:

docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/loadgen:v0.0.1 .

3) Отпремите слику у регистар контејнера:

docker push gcr.io/$PROJECT_ID/$GCR_REPO/loadgen:v0.0.1

Погледајте листу слика

Прегледајте листу слика у спремишту и проверите да ли су слике отпремљене:

gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio

Команда приказује називе новоотпремљених слика:

NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen

Креирање ГКЕ кластера.

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

За покретање контејнерских апликација које можете користити ГКЕ. ГКЕ је платформа за оркестрацију контејнера која обједињује виртуелне машине у кластер. Свака виртуелна машина се зове чвор. ГКЕ кластери су засновани на систему управљања кластерима отвореног кода Кубернетес. Кубернетес обезбеђује механизме за интеракцију са кластером.

Креирање ГКЕ кластера:

1) Направите кластер:

gcloud container clusters create istioready 
  --cluster-version latest 
  --machine-type=n1-standard-2 
  --num-nodes 4

Тим гцлоуд креира истиореади кластер у ГЦП пројекту и подразумевану зону коју сте навели. Да бисте покренули Истио, препоручујемо да имате најмање 4 чвора и виртуелну машину н1-стандард-2.

Тим ствара кластер за неколико минута. Када је кластер спреман, команда даје нешто овако сообщение.

2) Наведите акредитиве у алату командне линије кубецтлда га користите за управљање кластером:

gcloud container clusters get-credentials istioready

3) Сада можете да комуницирате са Кубернетес-ом преко кубецтл. На пример, следећа команда може да сазна статус чворова:

kubectl get nodes

Команда производи листу чворова:

NAME                                       STATUS   ROLES    AGE    VERSION
gke-istoready-default-pool-dbeb23dc-1vg0   Ready    <none>   99s    v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-36z5   Ready    <none>   100s   v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-fj7s   Ready    <none>   99s    v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-wbjw   Ready    <none>   99s    v1.13.6-gke.13

Кључни концепти Кубернетеса

Дијаграм приказује апликацију на ГКЕ:

Припрема апликације за Истио

Пре него што примените контејнере у ГКЕ, научите кључне концепте Кубернетеса. Постоје везе на самом крају ако желите да сазнате више.

  • Чворови и кластери. У ГКЕ, чвор је виртуелна машина. На другим Кубернетес платформама, чвор може бити рачунар или виртуелна машина. Кластер је колекција чворова који се могу сматрати једном јединицом у којој примењујете контејнеризовану апликацију.
  • Подс. У Кубернетесу, контејнери раде у подовима. Под у Кубернетесу је недељива јединица. Под садржи један или више контејнера. Ви постављате серверске контејнере и лоадген у одвојеним махунама. Када постоји неколико контејнера у модулу (на пример, сервер апликација и прокси сервер), контејнерима се управља као један ентитет и деле под ресурсе.
  • Деплоиментс. У Кубернетесу, имплементација је објекат који је колекција идентичних подова. Примена покреће вишеструке реплике модула распоређених по чворовима кластера. Примена аутоматски замењује модуле који нису успели или не реагују.
  • Кубернетес сервис. Приликом покретања кода апликације у ГКЕ-у, веза између лоадген и сервер. Када сте покренули услуге на Цлоуд Схелл виртуелној машини или десктопу, послали сте захтеве на сервер у лоцалхост: КСНУМКС. Једном распоређени у ГКЕ, подови се извршавају на доступним чворовима. Подразумевано, немате контролу над којим чвором се под покреће, тако да ви подс нема трајних ИП адреса.
    Да бисте добили ИП адресу за сервер, потребно је да дефинишете мрежну апстракцију на врху подова. То је оно што је Кубернетес сервис. Услуга Кубернетес обезбеђује трајну крајњу тачку за скуп подова. Има их неколико врсте услуга. сервер користи Распоређивање оптерећења, који обезбеђује спољну ИП адресу за контакт сервер изван кластера.
    Кубернетес такође има уграђени ДНС систем који додељује ДНС имена (нпр. хеллосервер.дефаулт.цлустер.лоцал) услуге. Захваљујући томе, махуне унутар кластера комуницирају са другим подовима у кластеру на сталној адреси. ДНС име не може да се користи изван кластера, као што је Цлоуд Схелл или на рачунару.

Кубернетес манифестује

Када сте покренули апликацију из извора, користили сте императивну команду питхон3

сервер.пи

Императив подразумева глагол: „уради ово“.

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

Назначите жељено стање у манифестима или датотекама Иамл. ИАМЛ датотека садржи спецификације за један или више Кубернетес објеката.

Пример садржи ИАМЛ датотеку за сервер и лоадген. Свака ИАМЛ датотека наводи жељено стање објекта имплементације и Кубернетес услуге.

сервер.иамл

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloserver
spec:
  selector:
    matchLabels:
      app: helloserver
  replicas: 1
  template:
    metadata:
      labels:
        app: helloserver
    spec:
      terminationGracePeriodSeconds: 5
      restartPolicy: Always
      containers:
      - name: main
        image: gcr.io/google-samples/istio/helloserver:v0.0.1
        imagePullPolicy: Always

  • врста означава врсту објекта.
  • метаподаци.име специфицира име имплементације.
  • Прво поље spec садржи опис жељеног стања.
  • спец.реплике означава жељени број махуна.
  • Одељак спец.темплате дефинише шаблон под. Постоји поље у спецификацији под слика, који специфицира име слике коју треба издвојити из регистра контејнера.

Услуга је дефинисана на следећи начин:

apiVersion: v1
kind: Service
metadata:
  name: hellosvc
spec:
  type: LoadBalancer
  selector:
    app: helloserver
  ports:
  - name: http
    port: 80
    targetPort: 8080

  • Распоређивање оптерећења: Клијенти шаљу захтеве на ИП адресу балансера оптерећења, која има сталну ИП адресу и доступна је изван кластера.
  • таргетПорт: као што се сећате, тим ЕКСПОСЕ 8080 в Доцкерфиле није обезбедио луке. Ви обезбеђујете луку 8080тако да можете контактирати контејнер сервер ван кластера. У нашем случају хеллосвц.дефаулт.цлустер.лоцал:80 (кратко име: хеллосвц) одговара порту 8080 Под ИП адресе хеллосервер.
  • лука: Ово је број порта на који ће друге услуге у кластеру слати захтеве.

лоадген.иамл

Деплоимент објецт то лоадген.иамл изгледати сервер.иамл. Разлика је у томе што објекат имплементације садржи одељак енв. Дефинише променљиве окружења које су потребне лоадген и које сте инсталирали када сте покренули апликацију из извора.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: loadgenerator
spec:
  selector:
    matchLabels:
      app: loadgenerator
  replicas: 1
  template:
    metadata:
      labels:
        app: loadgenerator
    spec:
      terminationGracePeriodSeconds: 5
      restartPolicy: Always
      containers:
      - name: main
        image: gcr.io/google-samples/istio/loadgen:v0.0.1
        imagePullPolicy: Always
        env:
        - name: SERVER_ADDR
          value: "http://hellosvc:80/"
        - name: REQUESTS_PER_SECOND
          value: "10"
        resources:
          requests:
            cpu: 300m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi

Време лоадген не прихвата долазне захтеве, за поље тип назначено ЦлустерИП. Овај тип обезбеђује трајну ИП адресу коју услуге у кластеру могу да користе, али ова ИП адреса није изложена спољним клијентима.

apiVersion: v1
kind: Service
metadata:
  name: loadgensvc
spec:
  type: ClusterIP
  selector:
    app: loadgenerator
  ports:
  - name: http
    port: 80
    targetPort: 8080

Примена контејнера у ГКЕ

1) Идите у директоријум где се налази пример сервер:

cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/

2) Отвори сервер.иамл у уређивачу текста.
3) Замените име у пољу слика на име ваше Доцкер слике.

image: gcr.io/PROJECT_ID/preparing-istio/helloserver:v0.0.1

Заменити ПРОЈЕЦТ_ИД на ИД вашег ГЦП пројекта.
4) Сачувајте и затворите сервер.иамл.
5) Поставите ИАМЛ датотеку у Кубернетес:

kubectl apply -f server.yaml

По успешном завршетку, команда производи следећи код:

deployment.apps/helloserver created
service/hellosvc created

6) Идите у директоријум где лоадген:

cd ../loadgen

7) Отвори лоадген.иамл у уређивачу текста.
8) Замените име у пољу слика на име ваше Доцкер слике.

image: gcr.io/PROJECT_ID/preparing-istio/loadgenv0.0.1

Заменити ПРОЈЕЦТ_ИД на ИД вашег ГЦП пројекта.
9) Сачувајте и затворите лоадген.иамл, затворите уређивач текста.
10) Поставите ИАМЛ датотеку у Кубернетес:

kubectl apply -f loadgen.yaml

По успешном завршетку, команда производи следећи код:

deployment.apps/loadgenerator created
service/loadgensvc created

11) Проверите статус махуна:

kubectl get pods

Команда показује статус:

NAME                             READY   STATUS    RESTARTS   AGE
helloserver-69b9576d96-mwtcj     1/1     Running   0          58s
loadgenerator-774dbc46fb-gpbrz   1/1     Running   0          57s

12) Извуците евиденције апликација из под лоадген. Заменити ПОД_ИД на идентификатор из претходног одговора.

kubectl logs loadgenerator-POD_ID

13) Добијте спољне ИП адресе хеллосвц:

kubectl get service

Одговор команде изгледа отприлике овако:

NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
hellosvc     LoadBalancer   10.81.15.158   192.0.2.1       80:31127/TCP   33m
kubernetes   ClusterIP      10.81.0.1      <none>          443/TCP        93m
loadgensvc   ClusterIP      10.81.15.155   <none>          80/TCP         4m52s

14) Пошаљите захтев на хеллосвц: заменити ЕКСТЕРНАЛ_ИП на спољну ИП адресу хеллосвц.

curl http://EXTERNAL_IP

Хајдемо на Истио

Већ имате апликацију распоређену на ГКЕ. лоадген може да користи Кубернетес ДНС (хеллосвц:80) за слање захтева сервери можете слати захтеве на сервер преко спољне ИП адресе. Иако Кубернетес има много функција, недостају неке информације о услугама:

  • Како услуге међусобно делују? Какви су односи између услуга? Како се саобраћај одвија између услуга? Да ли сте свесни тога лоадген шаље захтеве на сервер, али замислите да не знате ништа о апликацији. Да бисмо одговорили на ова питања, погледајмо листу покренутих подова у ГКЕ-у.
  • метрике. Колико дуго сервер одговара на долазни захтев? Колико захтева у секунди прими сервер? Да ли даје поруке о грешци?
  • Безбедносне информације. Саобраћај између лоадген и сервер само пролази ХТТП или од мТЛС?

Истио одговара на сва ова питања. Да би то урадио, Истио поставља помоћни прокси изасланик у свакој махуни. Енвои проки пресреће сав долазни и одлазни саобраћај до контејнера апликација. То значи да сервер и лоадген примати преко проки-ја споредног приколице Енвои-а и сав саобраћај од лоадген к сервер иде преко проксија изасланика.

Везе између Енвои проксија формирају мрежу услуга. Архитектура сервисне мреже пружа ниво контроле на врху Кубернетеса.

Припрема апликације за Истио

Пошто се Енвои проксији покрећу у сопственим контејнерима, Истио се може инсталирати на ГКЕ кластер без скоро никаквих промена у коду апликације. Али урадили сте нешто да бисте своју апликацију припремили за управљање од стране Истио-а:

  • Услуге за све контејнере. За распоређивање сервер и лоадген везан за Кубернетес сервис. Чак лоадген, који не прима долазне захтеве, постоји услуга.
  • Портови у услугама морају имати имена. Иако се сервисни портови могу оставити неименовани у ГКЕ-у, Истио захтева да наведете назив порта у складу са својим протоколом. У ИАМЛ датотеци порт за сервер звао хттпјер сервер користи протокол ХТТП... Ако сервис користи гРПЦ, ви бисте назвали луку грпц.
  • Распоређивања су означена. Због тога можете да користите Истио функције управљања саобраћајем, као што је подела саобраћаја између верзија исте услуге.

Инсталирање Истио-а

Постоје два начина да инсталирате Истио. Моћи омогући Истио на екстензији ГКЕ или инсталирајте верзију Истио-а отвореног кода на кластеру. Са Истио-ом на ГКЕ-у, можете лако управљати Истио инсталацијама и надоградњама током животног циклуса ГКЕ кластера. Ако желите најновију верзију Истио-а или више контроле над конфигурацијом Истио контролне табле, инсталирајте верзију отвореног кода уместо екстензије Истио на ГКЕ. Да бисте одлучили о приступу, прочитајте чланак Да ли ми треба Истио на ГКЕ?.

Изаберите опцију, прочитајте одговарајући водич и пратите упутства да бисте инсталирали Истио на свој кластер. Ако желите да користите Истио са својом новопостављеном апликацијом, омогући имплементацију бочне приколице за именски простор Уобичајено.

Чишћење

Да бисте избегли наплату ресурса које сте користили у овом водичу са налога Гоогле Цлоуд платформе, избришите кластер контејнера када инсталирате Истио и играте са примером апликације. Ово ће уклонити све ресурсе кластера, као што су рачунарске инстанце, дискови и мрежни ресурси.

Шта је следеће?

Извор: ввв.хабр.цом

Додај коментар