Istio — удобный инструмент для подключения, защиты и мониторинга распределенных приложений.
Istio использует различные технологии для запуска программного обеспечения и управления им в любом масштабе, включая контейнеры для упаковки кода приложения и зависимостей для развертывания, а также Kubernetes для управления этими контейнерами.
Поэтому для работы с Istio необходимо знать, как работает приложение с несколькими сервисами на основе этих технологий.
без Истио.
Если эти инструменты и концепции вам уже знакомы, смело пропустите этот урок и сразу перейдите к разделу.
Установка Istio в Google Kubernetes Engine (GKE) или установка расширения Istio на GKE .
Это пошаговое руководство, в котором мы пройдем весь процесс от исходного кода до контейнера GKE, чтобы на примере дать вам базовое представление об этих технологиях.
Вы также увидите, как Istio использует возможности этих технологий.
Предполагается, что вы ничего не знаете о контейнерах, Kubernetes, сервисных сетях или Istio.
Задания
В этом уроке вы выполните следующие задачи:- Изучение простого приложения hello world с несколькими сервисами.
- Запустите приложение из исходного кода.
- Упаковка приложения в контейнеры.
- Создание кластера Kubernetes.
- Развертывание контейнеров в кластер.
Прежде чем ты начнешь
Следуйте инструкциям, чтобы включить API Kubernetes Engine:- Идти к Страница движка Kubernetes в консоли Google Cloud Platform.
- Создайте или выберите проект.
- Подождите, пока API и связанные службы будут включены.
Это может занять несколько минут.
- Убедитесь, что для вашего проекта Google Cloud Platform настроена оплата.
Узнайте, как включить оплату .
g1-small в Google Compute Engine с Linux на базе Debian или компьютером с Linux или macOS.
Вариант А.
Использование Cloud Shell Преимущества использования Cloud Shell:
- Среды разработки Python 2 и Python 3 (включая виртуальное окружение ) полностью настроены.
- Инструменты командной строки gcloud , докер , мерзавец И кубектл , которые мы будем использовать, уже установлены.
- У вас есть несколько на выбор текстовые редакторы :
- Редактор кода , который открывается значком редактирования в верхней части окна Cloud Shell.
- Emacs, Vim или Nano, которые открываются из командной строки в Cloud Shell.
- Перейдите в консоль GCP.
- Нажмите кнопку Активировать Cloud Shell (Активировать Cloud Shell) в верхней части окна консоли GCP.
В нижней части Консоль GCP Сеанс Cloud Shell с командной строкой откроется в новом окне.
Вариант Б.
Локальное использование инструментов командной строки Если вы будете работать на компьютере под управлением Linux или macOS, вам потребуется настроить и установить следующие компоненты:
- Настраивать Среда разработки Python 3 и Python 2 .
- Установить облачный SDK с помощью инструмента командной строки gcloud .
- Установить кубектл - инструмент командной строки для работы с Кубернетес .
gcloud components install kubectl
- Установить Docker Community Edition (CE) .
Вы будете использовать инструмент командной строки докер для создания образов контейнеров для примера приложения.
- Установите инструмент Контроль версий Git чтобы получить образец приложения с GitHub.
Скачать пример кода
- Загрузите исходный код приветсервер :
git clone https://github.com/GoogleCloudPlatform/istio-samples
- Перейдите в каталог кода примера:
cd istio-samples/sample-apps/helloserver
Исследование приложения с несколькими службами
Пример приложения написан на Python и состоит из двух компонентов, которые взаимодействуют с помощью ОТДЫХ :- сервер : простой сервер с одной конечной точкой ПОЛУЧАТЬ, / , который выводит на консоль «привет, мир».
- нагрузка : скрипт, который отправляет трафик на сервер , с настраиваемым количеством запросов в секунду.
Запуск приложения из исходного кода
Чтобы изучить пример приложения, запустите его в Cloud Shell или на своем компьютере.
1) В каталоге istio-samples/примеры-приложения/helloserver бегать сервер : python3 server/server.py
На старте сервер отображается следующее: INFO:root:Starting server.
2) Откройте другое окно терминала для отправки запросов сервер .
Если вы используете Cloud Shell, щелкните значок добавления, чтобы открыть другой сеанс.
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: */*
С точки зрения сети все приложение работает на одном хосте (локальном компьютере или виртуальной машине Cloud Shell).
Поэтому вы можете использовать локальный хост отправлять запросы на сервер .
10) Остановиться нагрузка И сервер , входить Ctrl-c в каждом окне терминала.
11) В окне терминала нагрузка деактивировать виртуальную среду: deactivate
Упаковка приложения в контейнеры
Чтобы запустить приложение в GKE, вам необходимо упаковать пример приложения — сервер И нагрузка - В контейнеры .Контейнер — это способ упаковать приложение, чтобы изолировать его от окружающей среды.
Чтобы упаковать приложение в контейнер, вам необходимо Докерфайл .
Докерфайл это текстовый файл, который определяет команды для сборки исходного кода приложения и его зависимостей в Докер-образ.
После создания вы загружаете образ в реестр контейнеров, например Docker Hub или Реестр контейнеров .
Пример уже есть Докерфайл Для сервер И нагрузка со всеми необходимыми командами для сбора изображений.
Ниже - Докерфайл Для сервер : 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" ]
- Команда ОТ Python: 3-slim в качестве основы сообщает Docker использовать последнюю версию Изображение Python 3 в качестве базы.
- Команда КОПИРОВАТЬ.
.
py
) в файловую систему контейнера. - ВХОДНАЯ ТОЧКА определяет команду, которая используется для запуска контейнера.
В нашем случае эта команда почти такая же, как та, которую вы использовали сервер.
py из исходного кода.
- Команда РАЗОБЛАЧАТЬ указывает на то, что сервер ждет данных через порт 8080 .
Ээта команда не предоставляет порты .
Это какая-то документация, которая нужна для открытия порта 8080 при запуске контейнера.
Подготовка к контейнеризации вашего приложения
1) Установите следующие переменные среды.
Заменять ПРОЕКТ_ИД к идентификатору вашего проекта GCP. export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Использование значений ПРОЕКТ_ИД И ГКР_РЕПО вы помечаете образ Docker при его сборке и отправляете его в частный реестр контейнеров.
2) Установите проект GCP по умолчанию для инструмента командной строки.
gcloud .
gcloud config set project $PROJECT_ID
3) Установите зону по умолчанию для инструмента командной строки.
gcloud .
gcloud config set compute/zone us-central1-b
4) Убедитесь, что служба реестра контейнеров включена в проекте GCP. gcloud services enable containerregistry.googleapis.com
Сервер контейнеризации
- Перейдите в каталог, где находится пример.
сервер :
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/
- Соберите изображение, используя Докерфайл и переменные среды, которые вы определили ранее:
docker build -t gcr.io/$PROJECT_ID/$GCR_REPO/helloserver:v0.0.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
Создание кластера GKE.
Эти контейнеры можно запустить на виртуальной машине Cloud Shell или на компьютере с помощью команды запуск докера .Но в производственной среде вам нужен способ централизованного управления контейнерами.
Например, вам нужна система, которая гарантирует постоянную работу контейнеров, и вам нужен способ масштабирования и развертывания дополнительных экземпляров контейнеров в случае увеличения трафика.
Для запуска контейнерных приложений вы можете использовать Г.
К.
?.
.
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 узла и виртуальную машину.
Команда создает кластер за несколько минут. Когда кластер готов, команда выводит что-то вроде этого сообщение .
2) Введите учетные данные в инструменте командной строки.
кубектл чтобы использовать его для управления кластером: gcloud container clusters get-credentials istioready
3) Теперь вы можете общаться с Kubernetes через кубектл .
Например, следующая команда может узнать состояние узлов: 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
Ключевые понятия Kubernetes
На схеме показано приложение GKE:Прежде чем развертывать контейнеры в GKE, изучите ключевые концепции Kubernetes. В самом конце есть ссылки, если вы хотите узнать больше.
- Узлы и кластеры .
В GKE узел — это виртуальная машина.
На других платформах Kubernetes узлом может быть компьютер или виртуальная машина.
Кластер — это набор узлов, которые можно рассматривать как единую единицу, в которой вы развертываете контейнерное приложение.
- Стручки .
В Kubernetes контейнеры запускаются в модулях.
Под в Kubernetes — неделимая единица.
Под содержит один или несколько контейнеров.
Вы развертываете серверные контейнеры и нагрузка в отдельных капсулах.
Если в поде несколько контейнеров (например, сервер приложений и Прокси сервер ), контейнеры управляются как единое целое и совместно используют ресурсы модуля.
- Развертывания .
В Kubernetes развертывание — это объект, представляющий собой набор идентичных модулей.
При развертывании запускается несколько реплик модулей, распределенных по узлам кластера.
При развертывании автоматически заменяются модули, которые вышли из строя или не отвечают.
- Служба Кубернетес .
При запуске кода приложения в GKE соединение между нагрузка И сервер .
Когда вы запускали службы на виртуальной машине или рабочем столе Cloud Shell, вы отправляли запросы на сервер по адресу локальный хост: 8080 .
После развертывания в GKE модули выполняются на доступных узлах.
По умолчанию вы не можете контролировать, на каком узле работает модуль, поэтому вы стручки нет постоянных IP-адресов.
Чтобы получить IP-адрес для сервер вам необходимо определить сетевую абстракцию поверх модулей.
это и есть Служба Кубернетес .
Служба Kubernetes предоставляет постоянную конечную точку для набора модулей.
Есть несколько виды услуг .
сервер использует Балансировщик нагрузки , который предоставляет внешний IP-адрес для связи сервер из-за пределов кластера.
Kubernetes также имеет встроенную систему DNS, которая назначает DNS-имена (например, helloserver.default.cluster.local ) услуги.
Благодаря этому поды внутри кластера взаимодействуют с другими подами в кластере по постоянному адресу.
DNS-имя нельзя использовать за пределами кластера, например в Cloud Shell или на компьютере.
Кубернетес манифестирует
Когда вы запускали приложение из исходного кода, вы использовали императивную команду python3 сервер.py
Императив подразумевает глагол: «сделать это».Кубернетес использует декларативная модель .
Это означает, что мы не говорим Kubernetes, что именно делать, а скорее описываем желаемое состояние.
Например, Kubernetes запускает и останавливает модули по мере необходимости, чтобы гарантировать, что фактическое состояние системы соответствует желаемому состоянию.
Вы указываете желаемое состояние в манифестах или файлах ЯМЛ .
Файл YAML содержит спецификации для одного или нескольких объектов Kubernetes. В примере содержится файл YAML для сервер И нагрузка .
Каждый файл 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
- Балансировщик нагрузки : Клиенты отправляют запросы на IP-адрес балансировщика нагрузки, который имеет постоянный IP-адрес и доступен извне кластера.
- целевой порт : как вы помните, команда ВЫСТАВКА 8080 В Докерфайл не предоставил порты.
Вы предоставляете порт 8080 чтобы вы могли связаться с контейнером сервер за пределами кластера.
В нашем случае hellosvc.default.cluster.local:80 (короткое имя: привет ) соответствует порту 8080 IP-адреса модулей приветсервер .
- порт : это номер порта, через который другие службы кластера будут отправлять запросы.
Разница в том, что объект развертывания содержит раздел окружение .
Он определяет переменные среды, которые необходимы нагрузка и который вы установили при запуске приложения из исходного кода.
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
Один раз нагрузка не принимает входящие запросы, для поля тип указано КластерIP .
Этот тип предоставляет постоянный IP-адрес, который могут использовать службы в кластере, но этот IP-адрес не доступен внешним клиентам.
apiVersion: v1
kind: Service
metadata:
name: loadgensvc
spec:
type: ClusterIP
selector:
app: loadgenerator
ports:
- name: http
port: 80
targetPort: 8080
Развертывание контейнеров в GKE
1) Перейдите в каталог, где находится пример.
сервер : cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/server/
2) Открыть server.yaml в текстовом редакторе.
3) Замените имя в поле изображение к имени вашего образа Docker. image: gcr.io/PROJECT_ID/preparing-istio/helloserver:v0.0.1
Заменять ПРОЕКТ_ИД к идентификатору вашего проекта GCP.
4) Сохранить и закрыть server.yaml .
5) Разверните файл YAML в Kubernetes: kubectl apply -f server.yaml
После успешного завершения команда выдает следующий код: deployment.apps/helloserver created
service/hellosvc created
6) Перейдите в каталог, где находится нагрузка : cd .
/loadgen
7) Открыть loadgen.yaml в текстовом редакторе.
8) Замените имя в поле изображение к имени вашего образа Docker. image: gcr.io/PROJECT_ID/preparing-istio/loadgenv0.0.1
Заменять ПРОЕКТ_ИД к идентификатору вашего проекта 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) Извлеките журналы приложений из модуля.
нагрузка .
Заменять POD_ID к идентификатору из предыдущего ответа.
kubectl logs loadgenerator-POD_ID
13) Получить внешние IP-адреса привет : 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) Отправьте запрос на привет : заменять EXTERNAL_IP на внешний IP-адрес приветсвк .
curl http://EXTERNAL_IP
Давайте возьмем Истио
У вас уже есть приложение, развернутое в GKE. нагрузка можно использовать Kubernetes DNS ( приветсвк:80 ) для отправки запросов на сервер и вы можете отправлять запросы на сервер по внешнему IP-адресу.Хотя Kubernetes имеет множество функций, некоторая информация о сервисах отсутствует:
- Как взаимодействуют сервисы? Каковы взаимоотношения между службами? Как передается трафик между сервисами? Знаете ли вы, что нагрузка отправляет запросы на сервер , но представьте, что вы ничего не знаете о приложении.
Чтобы ответить на эти вопросы, давайте посмотрим на список запущенных модулей в GKE.
- Метрики .
Сколько сервер отвечает на входящий запрос? Сколько запросов в секунду принимает сервер? Выдает ли он сообщения об ошибках?
- Информация о безопасности .
Трафик между нагрузка И сервер просто проходит через HTTP или через мТЛС ?
Для этого Istio размещает дополнительный прокси-сервер.
посланник в каждом капсуле.
Прокси-сервер Envoy перехватывает весь входящий и исходящий трафик к контейнерам приложений.
Это означает, что сервер И нагрузка получать через боковой прокси-сервер Envoy, и весь трафик от нагрузка К сервер проходит через прокси-сервер Envoy. Соединения между прокси-серверами Envoy образуют сервисную сеть.
Архитектура Service Mesh обеспечивает уровень управления поверх Kubernetes.
Поскольку прокси-серверы Envoy работают в собственных контейнерах, Istio можно установить поверх кластера GKE практически без изменений в коде приложения.
Но вы проделали некоторую работу, чтобы подготовить свое приложение к управлению Istio:
- Услуги для всех контейнеров.
К развертываниям сервер И нагрузка привязан к сервису Kubernetes. Даже нагрузка , который не принимает входящие запросы, есть сервис.
- Порты в сервисах должны иметь имена.
Хотя сервисные порты в GKE можно оставить безымянными, Istio требует, чтобы вы указали имя порта согласно его протоколу.
В файле YAML указан порт для сервер называется http потому что сервер использует протокол HTTP .
Если услуга использовал gRPC , вы бы назвали порт грпк .
- Развертывания помечены.
Таким образом, вы можете использовать функции управления трафиком Istio, такие как разделение трафика между версиями одного и того же сервиса.
Установка Истио
Существует два способа установки Istio. Может включить Istio в расширении GKE или установите версию Istio с открытым исходным кодом на кластере.С Istio на GKE вы можете легко управлять установкой и обновлениями.
Теги: #Google #Системное администрирование #Администрирование серверов #DevOps #k8s #istio #gke #gcp #manual
-
Можете Ли Вы Пополнить Камень?
19 Oct, 24 -
Где Трамвай? И Вот Где
19 Oct, 24 -
Кто Должен Быть Менеджером?
19 Oct, 24