- PVSM.RU - https://www.pvsm.ru -
Istio — это удобный инструмент для соединения, защиты и мониторинга распределенных приложений. В Istio используются разные технологии для масштабного запуска ПО и управления им, включая контейнеры для упаковки кода приложения и зависимостей для развертывания и Kubernetes — для управления этими контейнерами. Поэтому для работы с Istio вы должны знать, как приложение с несколькими сервисами на основе этих технологий работает без Istio. Если эти инструменты и понятия вам уже знакомы, смело пропускайте это руководство и переходите прямо к разделу Установка Istio на Google Kubernetes Engine (GKE) [1] или установке расширения Istio on GKE [2].
Это пошаговое руководство, где мы рассмотрим весь процесс от исходного кода до контейнера на GKE, чтобы вы получили базовое представление об этих технологиях на примере. Также вы увидите, как Istio использует возможности этих технологий. Предполагается, что вы не знаете ничего о контейнерах, Kubernetes, service mesh или Istio.
В этом руководстве вы выполните следующие задачи:
Следуйте инструкциям, чтобы включить Kubernetes Engine API:
В этом руководстве можно использовать Cloud Shell, который подготавливает виртуальную машину g1-small в Google Compute Engine [5] с Linux на основе Debian, или компьютер на Linux или macOS.
Преимущества использования Cloud Shell:
Чтобы использовать Cloud Shell [8]:
В нижней части консоли GCP [9] в новом окне откроется сеанс Cloud Shell с командной строкой.
Если вы будете работать на компьютере с Linux или macOS, нужно настроить и установить следующие компоненты:
Настройте среду разработки Python 3 и Python 2 [10].
Установите Cloud SDK [11] с инструментом командной строки gcloud.
Установите kubectl — инструмент командной строки для работы с Kubernetes [12].
gcloud components install kubectl
Установите Docker Community Edition (CE) [13]. Вы будете использовать инструмент командной строки docker, чтобы создавать образы контейнеров для примера приложения.
Установите инструмент контроля версий Git [14], чтобы получить пример приложения с GitHub.
Загрузите исходный код helloserver:
git clone https://github.com/GoogleCloudPlatform/istio-samples
Перейдите в каталог примера кода:
cd istio-samples/sample-apps/helloserver
Пример приложения написан на Python и состоит из двух компонентов, которые взаимодействуют с помощью REST [15]:
Чтобы изучить пример приложения, запустите его в Cloud Shell или на компьютере.
1) В каталоге istio-samples/sample-apps/helloserver запустите server:
python3 server/server.py
При запуске server отображается следующее:
INFO:root:Starting server...
2) Откройте другое окно терминала, чтобы отправлять запросы к server. Если вы используете Cloud Shell, нажмите значок добавления, чтобы открыть другой сеанс.
3) Отправьте запрос к server:
curl http://localhost:8080
server отвечает:
Hello World!
4) Из каталога, куда вы загрузили примера кода, перейдите в каталог, который содержит loadgen:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
5) Создайте следующие переменные среды:
export SERVER_ADDR=http://localhost:8080
export REQUESTS_PER_SECOND=5
6) Запустите virtualenv:
virtualenv --python python3 env
7) Активируйте виртуальную среду:
source env/bin/activate
8) Установите требования для loadgen:
pip3 install -r requirements.txt
9) Запустите loadgen:
python3 loadgen.py
При запуске loadgen выводит примерно следующее сообщение:
Starting loadgen: 2019-05-20 10:44:12.448415
5 request(s) complete to http://localhost:8080
В другом окне терминала server выводит на консоль примерно следующие сообщения:
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: */*
С точки зрения сети, все приложение работает на одном хосте (локальном компьютере или виртуальной машине Cloud Shell). Поэтому можно использовать localhost, чтобы отправлять запросы к server.
10) Чтобы остановить loadgen и server, введите Ctrl-c в каждом окне терминала.
11) В окне терминала loadgen деактивируйте виртуальную среду:
deactivate
Чтобы запустить приложение на GKE, нужно упаковать пример приложения — server и loadgen — в контейнеры [16]. Контейнер — это способ упаковать приложение, чтобы изолировать его от среды.
Чтобы упаковать приложение в контейнер, нужен Dockerfile. Dockerfile — это текстовый файл, где определяются команды для сборки исходного кода приложения и его зависимостей в образ Docker. [17] После сборки вы загружаете образ в реестр контейнеров, например Docker Hub или Container Registry [18].
В примере уже есть Dockerfile для server и loadgen со всеми нужными командами, чтобы собрать образы. Ниже — Dockerfile для server:
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" ]
1) Задайте следующие переменные среды. Замените PROJECT_ID на идентификатор своего проекта GCP.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
С помощью значений PROJECT_ID и GCR_REPO вы помечаете образ Docker, когда собираете и отправляете его в частный Container Registry.
2) Задайте проект GCP по умолчанию для инструмента командной строки gcloud.
gcloud config set project $PROJECT_ID
3) Задайте зону по умолчанию для инструмента командной строки gcloud.
gcloud config set compute/zone us-central1-b
4) Убедитесь, что сервис Container Registry включен в проекте GCP.
gcloud services enable containerregistry.googleapis.com
Перейдите в каталог, где находится пример server:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/
Соберите образ с помощью Dockerfile и переменных среды, которые вы определили раньше:
docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1 .
Параметр -t представляет тег Docker. Это имя образа, который вы используете при развертывании контейнера.
docker push gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.1
1) Перейдите в каталог, где находится пример loadgen:
cd ../loadgen
2) Соберите образ:
docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/loadgen:v0.0.1 .
3) Отправьте образ в Container Registry:
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
Эти контейнеры можно было бы запустить на виртуальной машине Cloud Shell или на компьютере командой docker run. Но в производственной среде нужен способ централизованно оркестрировать контейнеры. Например, нужна система, которая следит, чтобы контейнеры всегда работали, и нужен способ увеличивать масштаб и запускать дополнительные экземпляры контейнеров, если трафик возрастет.
Для запуска контейнерных приложений можно использовать GKE [21]. GKE — это платформа оркестрации контейнеров, которая объединяет виртуальные машины в кластер. Каждая виртуальная машина называется узлом. Кластеры GKE основаны на опенсорс-системе управления кластерами Kubernetes. Kubernetes предоставляет механизмы взаимодействия с кластером.
Создание кластера GKE:
1) Создайте кластер:
gcloud container clusters create istioready
--cluster-version latest
--machine-type=n1-standard-2
--num-nodes 4
Команда gcloud создает кластер istioready в проекте GCP и зоне по умолчанию, которые вы указали. Чтобы запустить Istio, рекомендуем иметь хотя бы 4 узла и виртуальную машину n1-standard-2 [22].
Команда создает кластер несколько минут. Когда кластер будет готов, команда выдает подобное сообщение [23].
2) Укажите учетные данные в инструменте командной строки kubectl [24], чтобы с ее помощью управлять кластером:
gcloud container clusters get-credentials istioready
3) Теперь можно общаться с Kubernetes через kubectl. Например, следующей командой можно узнать статус узлов:
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
На схеме показано приложение на GKE:
Прежде чем развернуть контейнеры в GKE, изучите ключевые понятия Kubernetes. В самом конце есть ссылки, если вы хотите узнать больше.
Когда вы запускали приложение из исходного кода, вы использовали императивную команду python3
server.py
Императивность подразумевает глагол: «сделай это».
Kubernetes использует декларативную модель [29]. Это значит, что мы не говорим Kubernetes, что именно нужно делать, а описываем желаемое состояние. Например, Kubernetes запускает и останавливает pod’ы по мере необходимости, чтобы фактическое состояние системы соответствовало желаемому.
Желаемое состояние вы указываете в манифестах, или файлах YAML [30]. Файл YAML содержит спецификации для одного или нескольких объектов Kubernetes.
В примере содержится файл YAML для server и loadgen. Каждый файл YAML указывает желаемое состояние объекта развертывания и сервиса Kubernetes.
server.yaml
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
Сервис определяется следующим образом:
apiVersion: v1
kind: Service
metadata:
name: hellosvc
spec:
type: LoadBalancer
selector:
app: helloserver
ports:
- name: http
port: 80
targetPort: 8080
loadgen.yaml
Объект развертывания в loadgen.yaml похож на server.yaml. Разница в том, что объект развертывания содержит раздел env. Он определяет переменные среды, которые нужны loadgen и которые вы установили при запуске приложения из исходного кода.
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
Раз loadgen не принимает входящие запросы, для поля type указано ClusterIP. Этот тип предоставляет постоянный IP-адрес, который могут использовать сервисы в кластере, но этот IP-адрес не предоставляется внешним клиентам.
apiVersion: v1
kind: Service
metadata:
name: loadgensvc
spec:
type: ClusterIP
selector:
app: loadgenerator
ports:
- name: http
port: 80
targetPort: 8080
1) Перейдите в каталог, где находится пример server:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/
2) Откройте server.yaml в текстовом редакторе.
3) Замените имя в поле image на имя вашего образа Docker.
image: gcr.io/PROJECT_ID/preparing-istio/helloserver:v0.0.1
Замените PROJECT_ID на идентификатор вашего проекта GCP.
4) Сохраните и закройте server.yaml.
5) Разверните файл YAML в Kubernetes:
kubectl apply -f server.yaml
После успешного завершения команда выдает следующий код:
deployment.apps/helloserver created
service/hellosvc created
6) Перейдите в каталог, где находится loadgen:
cd ../loadgen
7) Откройте loadgen.yaml в текстовом редакторе.
8) Замените имя в поле image на имя вашего образа Docker.
image: gcr.io/PROJECT_ID/preparing-istio/loadgenv0.0.1
Замените PROJECT_ID на идентификатор вашего проекта GCP.
9) Сохраните и закройте loadgen.yaml, закройте текстовый редактор.
10) Разверните файл YAML в Kubernetes:
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) Извлеките логи приложения из пода loadgen. Замените POD_ID на идентификатор из предыдущего ответа.
kubectl logs loadgenerator-POD_ID
13) Получите внешние IP-адреса hellosvc:
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) Отправьте запрос к hellosvc: замените EXTERNAL_IP на внешний IP-адрес hellosvc.
curl http://EXTERNAL_IP
У вас уже есть приложение, развернутое в GKE. loadgen может использовать Kubernetes DNS (hellosvc:80), чтобы отправлять запросы к server, и вы можете отправлять запросы к server по внешнему IP-адресу. Хотя у Kubernetes много возможностей, кое-какой информации о сервисах не хватает:
На все эти вопросы отвечает Istio. Для этого Istio помещает sidecar-прокси Envoy [32] в каждый pod. Прокси Envoy перехватывает весь входящий и исходящий трафик к контейнерам приложения. Это означает, что server и loadgen получают по sidecar-прокси Envoy, и весь трафик от loadgen к server проходит через прокси Envoy.
Соединения между прокси Envoy образуют service mesh. Архитектура service mesh предоставляет уровень контроля поверх Kubernetes.
Раз прокси Envoy выполняются в своих контейнерах, Istio можно установить поверх кластера GKE, почти не меняя код приложения. Но вы проделали кое-какую работу, чтобы подготовить приложение к управлению с помощью Istio:
Установить Istio можно двумя способами. Можно включить расширение Istio on GKE [34] или установить опенсорс-версию Istio [35] на кластере. С Istio on GKE можно легко управлять установкой и апгрейдом Istio в рамках жизненного цикла кластера GKE. Если вам нужна самая новая версия Istio или больше контроля над конфигурацией панели управления Istio, установите опенсорс-версию вместо расширения Istio on GKE. Чтобы определиться с подходом, читайте статью Нужен ли мне Istio on GKE? [36].
Выберите вариант, изучите соответствующее руководство и следуйте инструкциям, чтобы установить Istio на кластере. Если вы хотите использовать Istio с только что развернутым приложением, включите внедрение sidecar’ов [37] для пространства имен default.
Чтобы с аккаунта Google Cloud Platform не списывалась плата за ресурсы, которые вы использовали в этом руководстве, удалите кластер контейнера, когда установите Istio и наиграетесь с примером приложения. При этом будут удалены все ресурсы кластера, например вычислительные экземпляры, диски и сетевые ресурсы.
Изучите следующие технологии:
Изучите следующие инструменты:
Изучите понятия Kubernetes:
Автор: nAbdullin
Источник [51]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/google/331643
Ссылки в тексте:
[1] Установка Istio на Google Kubernetes Engine (GKE): https://cloud.google.com/kubernetes-engine/docs/tutorials/installing-istio
[2] Istio on GKE: https://cloud.google.com/istio/docs/istio-on-gke/installing
[3] страницу Kubernetes Engine: https://console.cloud.google.com/projectselector/kubernetes?_ga=2.1975991.-786062113.1569439170
[4] Узнайте, как включить выставление счетов: https://cloud.google.com/billing/docs/how-to/modify-project
[5] g1-small в Google Compute Engine: https://cloud.google.com/compute/docs/machine-types
[6] текстовых редакторов: https://cloud.google.com/shell/docs/features#tools
[7] Редактор кода: https://cloud.google.com/shell/docs/features#code_editor
[8] Cloud Shell: https://cloud.google.com/shell/docs
[9] консоли GCP: https://console.cloud.google.com/?_ga=2.6228405.-786062113.1569439170
[10] среду разработки Python 3 и Python 2: https://cloud.google.com/python/setup
[11] Установите Cloud SDK: https://cloud.google.com/sdk/docs/quickstarts
[12] Kubernetes: https://kubernetes.io/docs/home/
[13] Docker Community Edition (CE): https://docs.docker.com/engine/installation/
[14] контроля версий Git: https://git-scm.com/downloads
[15] REST: https://wikipedia.org/wiki/Representational_state_transfer
[16] контейнеры: https://cloud.google.com/containers/
[17] образ Docker.: https://docs.docker.com/get-started/
[18] Container Registry: https://cloud.google.com/container-registry/docs/
[19] образ Python 3: https://hub.docker.com/_/python
[20] предоставляет порты: https://docs.docker.com/engine/reference/builder/#expose
[21] GKE: https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview
[22] n1-standard-2: https://cloud.google.com/compute/docs/machine-types#standard_machine_types
[23] сообщение: https://xpaste.pro/p/TgaxoDI3
[24] kubectl: https://kubernetes.io/docs/reference/kubectl/overview/
[25] прокси-сервер: https://wikipedia.org/wiki/Proxy_server
[26] pod’ов: https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview#pods
[27] сервис Kubernetes: https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview#services
[28] типов сервисов: https://cloud.google.com/kubernetes-engine/docs/concepts/service#types_of_services
[29] декларативную модель: https://cloud.google.com/kubernetes-engine/docs/how-to/deploying-workloads-overview#declarative_object_configuration
[30] YAML: https://wikipedia.org/wiki/YAML
[31] mTLS: https://wikipedia.org/wiki/Mutual_authentication
[32] Envoy: https://www.envoyproxy.io/
[33] имя порта: https://istio.io/docs/setup/kubernetes/additional-setup/requirements/
[34] включить расширение Istio on GKE: https://cloud.google.com/istio/docs/istio-on-gke/installing#adding_istio_on_gke_to_an_existing_cluster
[35] установить опенсорс-версию Istio: https://cloud.google.com/istio/docs/how-to/installing-oss#using_your_own_cluster
[36] Нужен ли мне Istio on GKE?: https://cloud.google.com/istio/docs/istio-on-gke/overview#should_i_use_istio_on_gke
[37] включите внедрение sidecar’ов: https://cloud.google.com/istio/docs/istio-on-gke/installing#enabling_sidecar_injection
[38] Kubernetes: https://kubernetes.io/
[39] GKE: https://cloud.google.com/kubernetes-engine/docs/
[40] Service mesh: https://cloud.google.com/blog/products/networking/welcome-to-the-service-mesh-era-introducing-a-new-istio-blog-post-series
[41] Istio: https://istio.io/
[42] Cloud SDK: https://cloud.google.com/sdk/docs/how-to
[43] Справочник по gcloud: https://cloud.google.com/sdk/gcloud/reference/
[44] kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
[45] docker: https://docs.docker.com/engine/reference/commandline/cli/
[46] Кластеры: https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture
[47] Узлы: https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture#nodes
[48] Pod’ы: https://cloud.google.com/kubernetes-engine/docs/concepts/pod
[49] Сервисы: https://cloud.google.com/kubernetes-engine/docs/concepts/service
[50] Развертывание: https://cloud.google.com/kubernetes-engine/docs/concepts/deployment
[51] Источник: https://habr.com/ru/post/469515/?utm_source=habrahabr&utm_medium=rss&utm_campaign=469515
Нажмите здесь для печати.