Этот урок был добавлен Istio 系列:https://istio.whuanle.cn
В этой главе мы официально приступаем к изучению Istio первый шаг. потому что Istio Система знаний относительно велика, поэтому мы можем быстро понять, как ее использовать,с помощью вводного руководства в этой главе. Istio развертыватьнабормикросервисы,а также Istio Узнайте, как использовать основные функции Istio Какие проблемы можно решить для микросервисов.
в этой главе,нас Волянаучусь, какразвертыватьнабормикросервисы、какиспользовать Istio Предоставление услуг за пределами кластера и способы использования компонентов наблюдения для мониторинга трафика и системных показателей.
В следующих главах автор объяснит каждый компонент Istio отдельно, но в этой главе нам нужно иметь только общее представление о том, как его использовать.
В примерах учебников в этой главе используется официальный набор микросервисов Istio. Этот набор микросервисов представляет собой книжный интернет-магазин. Открыв страницу, вы увидите категорию, информацию о книге и обзоры книг. Содержимое страницы предоставлено разными компаниями. субуслуги.
Микросервисы книжного магазина разделены на четыре отдельные части, которые на рисунке выше нарисованы в красной рамке. Четыре микросервиса:
productpage
: Соберите все данные Служитьиз и создайте страницу просмотра.details
:Книги хранятсяизинформация,как описано、автор、Издательство и др.reviews
:Книги хранятся相关из Комментарий,но Не включает рейтинговые звезды.ratings
:存储Комментарийсерединаиз Оцените и поставьте звезду。В этом микросервисе страница продукта Услуги, предоставляемые извне Web Посетите страницу,А остальные три Служить доступны только внутри кластера.。четыре Служитьпринял разныеизразвитие языка,Productpage Объедините информацию из трех других служб для создания страницы.
При разработке микросервиса мы не хотим, чтобы каждый подсервис открывал свой порт за пределами кластера. Нам следует централизовать данные через некоторые приложения и отображать их снаружи. Мы можем использовать API Gateway для проксирования части интерфейса подсервиса, а затем реализовать аутентификацию на основе клиентских или сторонних вызовов в API Gateway.
Страница продукта, подробные сведения и рейтинги имеют только одну версию v1, а обзоры — три версии.
Рейтинги отвечают за предоставление данных о рейтинге пользователя, например одной звезды или двух звезд. Три версии обзоров выполняют следующую обработку данных рейтингов соответственно:
[Источник изображения istio Официальный сайт 】
Граф зависимости сервисов выглядит следующим образом:
Далее мы будем использовать Kuubernetes Deployment развертывать Эти Служить,Это рутина Kubernetes развертыватьникакой разницы。
Создайте пространство имен для этих примеров служб.
kubectl create namespace bookinfo
Добавить в пространство имен Istio этикетки,инструкции Istio существоватьразвертыватьприложение(只对 Pod При вступлении в силу), автоматически вводить Envoy Sidecar Proxy контейнер:
kubectl label namespace bookinfo istio-injection=enabled
давать возможность Istio инъекция Sidecar Есть много способов, один из которых - установить метку для пространства имен, развернуть в этом пространстве имен. Pod, будет автоматически инъекция Sidecar 。
Вы можете узнать из этой серии руководств git 仓库середина找到Эти Пример,расположение файла:https://github.com/whuanle/istio_book/tree/main/3。
Откройте склад после того, как вытащите его. 3
Каталог, выполните команду для развертывания:
kubectl -n bookinfo apply -f details_deploy.yaml
kubectl -n bookinfo apply -f details_svc.yaml
kubectl -n bookinfo apply -f details_sa.yaml
kubectl -n bookinfo apply -f ratings_deploy.yaml
kubectl -n bookinfo apply -f ratings_svc.yaml
kubectl -n bookinfo apply -f ratings_sa.yaml
kubectl -n bookinfo apply -f reviews_v1_deploy.yaml
kubectl -n bookinfo apply -f reviews_v2_deploy.yaml
kubectl -n bookinfo apply -f reviews_v3_deploy.yaml
kubectl -n bookinfo apply -f reviews_svc.yaml
kubectl -n bookinfo apply -f reviews_sa.yaml
kubectl -n bookinfo apply -f productpage_deploy.yaml
kubectl -n bookinfo apply -f productpage_svc.yaml
kubectl -n bookinfo apply -f productpage_sa.yaml
Или вы можете обратиться к четырем подразделам ниже, приведенным в руководстве по развертыванию приложения, чтобы понять, как определяется каждое приложение.
Приложение, хранящее информацию о книгах.
развертывать Заказ:
kubectl -n bookinfo apply -f details_deploy.yaml
kubectl -n bookinfo apply -f details_svc.yaml
kubectl -n bookinfo apply -f details_sa.yaml
использовать Deployment развертывать подробное заявление。
details_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
securityContext:
runAsUser: 1000
развертывать details。
kubectl -n bookinfo apply -f details_deploy.yaml
Настройте службу Kubernetes для службы сведений.
details_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
kubectl -n bookinfo apply -f details_svc.yaml
Затем создайте ServiceAccount для службы подробностей.
Istio Обеспечивает связь между сервисами на основе двусторонней TLS сертификат, который выдается каждому ServiceAccount создательсертификат реализует из, может использовать ServiceAccount Подтверждайте личность друг друга, разные приложения могут использовать один и тот же ServiceAccount,но для каждого Deployment использоватьодиниз ServiceAccount Конфигурации безопасности можно лучше организовать и управлять ими.
details_sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
kubectl -n bookinfo apply -f details_sa.yaml
Предоставьте данные о звездном рейтинге для каждого отзыва.
развертывать Заказ:
kubectl -n bookinfo apply -f ratings_deploy.yaml
kubectl -n bookinfo apply -f ratings_svc.yaml
kubectl -n bookinfo apply -f ratings_sa.yaml
ratings_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: docker.io/istio/examples-bookinfo-ratings-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
securityContext:
runAsUser: 1000
ratings_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
ratings_sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
Предоставьте обзорную информацию о книгах.
развертывать Заказ:
kubectl -n bookinfo apply -f reviews_v1_deploy.yaml
kubectl -n bookinfo apply -f reviews_v2_deploy.yaml
kubectl -n bookinfo apply -f reviews_v3_deploy.yaml
kubectl -n bookinfo apply -f reviews_svc.yaml
kubectl -n bookinfo apply -f reviews_sa.yaml
Создайте три развертывания для трех версий отзывов.
reviews_v1_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v1:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
reviews_v2_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v2:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
reviews_v3_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
labels:
app: reviews
version: v3
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v3
template:
metadata:
labels:
app: reviews
version: v3
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v3:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
Создайте службу для трех развертываний. Три разные версии одного и того же приложения используют одну и ту же службу.
reviews_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
reviews_sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
Служба агрегирования страниц, позволяющая пользователям просматривать информацию о книге.
развертывать Заказ:
kubectl -n bookinfo apply -f productpage_deploy.yaml
kubectl -n bookinfo apply -f productpage_svc.yaml
kubectl -n bookinfo apply -f productpage_sa.yaml
productpage_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
runAsUser: 1000
volumes:
- name: tmp
emptyDir: {}
productpage_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
productpage_sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
После выполнения команды просмотрите модули в пространстве имен bookinfo.
kubectl get pods -n bookinfo
Как видно, каждый Pod из READY Все атрибуты есть 2/2
, что означает, что Pod В каталоге есть два контейнера, и два контейнера в настоящее время готовы.
Если мы посмотрим на один из Pod из структуры композиции вы обнаружите, что существуют Pod был запихнут в istio-proxy контейнер.
если Kubernetes не установлен в Dashbooard , то вы можете использовать
kubectl -n bookinfo describe pod {Pod ID}
Посмотреть структуру композиции.
затемиспользовать kubectl -n bookinfo get svc
Проверять Сервис, зарегистрировано четыре микросервиса Service。
Затем мы посещаем productpage Переписка CLUSTER-IP:
curl 10.233.37.130:9080
по умолчанию Istio Режим двусторонней аутентификации с нулевым доверием включен не будет, поэтому вы сможете получить доступ к приложению самостоятельно внутри кластера. mTLS Режим двусторонней аутентификации, вы можете только Pod Посетите приложение в.
Вы можете видеть, что куча html,说明насизразвертыватьэто нормальноиз。
затемдля Понятно Проверять Эффект страницы,нассуществовать暂未использовать Istio-ingressgateway Прежде чем временно создать Service незащищенный productpage изстраница。
productpage_tmpsvc.yaml
apiVersion: v1
kind: Service
metadata:
name: productpagetmp
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
type: NodePort
kubectl -n bookinfo apply -f productpage_tmpsvc.yaml
Проверятьвсе Service:
root@k8smain:/data/learn/book# kubectl -n bookinfo get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.233.63.247 <none> 9080/TCP 40m
productpage ClusterIP 10.233.37.130 <none> 9080/TCP 23m
productpagetmp NodePort 10.233.47.14 <none> 9080:30258/TCP 77s
ratings ClusterIP 10.233.7.6 <none> 9080/TCP 36m
reviews ClusterIP 10.233.58.219 <none> 9080/TCP 23m
Затем зайдите на страницу 30258 порт (Все люди разные, следуйте своим правилам).
Затем откройте http://192.168.3.150:30258/productpage?u=normal
。
потому чтодлятекущийиспользовать Service обязательность Pod,Таким образом, балансировка нагрузки будет достигаться посредством опроса,Вы можете обновить несколько раз http://192.168.3.150:30258/productpage?u=normal
,Вы обнаружите, что звездочки рейтинга с правой стороны изменились.
Istio по По умолчанию используется метод циклической балансировки нагрузки.
Правила отображения комментариев в правой части страницы: нет звезд => черные звезды => красные звезды.
Наконец пришел испытать Istio со временем в этом разделе мы Воля будем для productpage создавать Istio Шлюз обеспечивает доступ к внешней веб-странице.
В главе 2 мы уже развертывали istio-ingressgateway, этот компонент играет роль, аналогичную nginx、apisix из-за эффекта,Обеспечить внешний доступ к порту,Затем воля трафик перенаправляется во внутренний Служитьсередина.
но istio-ingressgateway Трафик не может быть перенаправлен непосредственно на Pod, он также требует некоторой настройки. мы хотим productpage создатель сайта,обязательность Перепискадоменное имя,этот样外部访问 istio-ingressgateway изпорт,istio-ingressgateway Только тогда вы знаете, кому перенаправить трафик. существовать Istio середина,Определите это отношение обязательности для ресурса под названием Gateway.。
Это будет подробно объяснено в следующих главах, но общее понимание вы можете получить здесь.
Шлюз похож Nginx требует обязательности конфигурации доменного имени, когда вам нужен обратный прокси-сервер.
создать шлюз, обязательность входа в доменное имя.
ingress_gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
hosts
Указывает, что путь доступа открыт внешнему миру, можно обязательно наличие доменного имени, IP ждать。этот里использовать*
, указывая, что любой доступ может войти в этот шлюз.
kubectl -n bookinfo apply -f ingress_gateway.yaml
Этот шаг похож на nginx из Конфигурация прослушивания:
server {
listen 80;
server_name example.org www.example.org;
#...
}
Когда мы создаем Istio Gateway После этого isio-ingressgateway для Мы отслеживаем трафик и определяем, какому издоменному имени или порту принадлежит Istio Gateway 。
Хотя создать Istio Шлюз, но мы не можем напрямую получить доступ к фронту развертываниямикросервисов через шлюз, нам также нужен создатель Istio VirtualService Воля Istio Gateway и Переписка Kubernetes Service обязательность вверх, и тогда трафик может официально поступать на Pod。
Обратите внимание, что трафик на самом деле не проходит через Service середина,но VirtualService нужно пройти Service Приходите и откройте для себя Pod。
Вот похожий nginx настроить обратный прокси,После настройки прослушивания,Также необходимо указать, на какой адрес привязан запрос Воля.
server {
listen 80;
server_name example.org www.example.org;
#...
}
location /some/path/ {
proxy_pass http://A:9080;
}
для Что не директ Воля Gateway и Service обязательность, но добавьте VirtualService Шерстяная ткань? Есть поговорка, что все проблемы в компьютерной сфере могут быть решены. пройти Добавить слой для решения.
Основная цель VirtualService — предоставить стабильный входной адрес и контролировать поток трафика внутри сети путем настройки ряда правил маршрутизации.
В качестве примера рассмотрим простейшую конфигурацию маршрута: Kubernetes. Service Правила маршрутизации не поддерживаются, и Istio Вы можете указать суффикс маршрута; Анализ трафика не поддерживается, а балансировка нагрузки включает только опрос. и Istio использовать Service Приходите и откройте для себя Pod, а затем напрямую перенаправить трафик на Pod , могут быть реализованы различные функции.
VirtualService можно использовать для реализации следующих функций:
Маршрутизация запросов: запросы Воля направляются на конкретную из Служить или версию.,Например Воля просит раздачу на разные версии и з Служить,Чтобы добиться выпуска оттенков серого или канареечного выпуска.
Повтор запроса: в случае сбоя из-за политики повтора конфигурации запроса для улучшения доступности Служитьиз.
Тайм-аут запроса: установите тайм-аут запроса, чтобы прервать запрос, если ответ не получен в течение определенного времени.
Запросить зеркало: Воля просит отправить копию из другому Служить,Для тестирования новых версий из Служить,Не влияя на фактический производственный поток.
Сегментация трафика: трафик Воли распределяется по различным источникам или версиям в соответствии с конкретными пропорциями для достижения контроля трафика.
productpage_vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
kubectl -n bookinfo apply -f productpage_vs.yaml
о VistualService Различные конфигурации и функции в 4.1 Оно будет представлено в этой главе.
здесь из YAML Разделена на две части, первая часть http.match
,выражатьнезащищенный Понятно哪些 API Адреса, доступ к этим адресам возможен только при внешнем доступе.
может пройти http.match
Ограничить доступ к этому адресу извне кластераиспользоватьиз URL。
тогда пройди http.route
обязательность Kubernetes Service ,проходить Service серединаиз Служить Обнаружить,Воля Трафик перенаправляется на Переписка Pod середина.
host Здесь из-за VirtualService и Service/Pod в том же пространстве имен, поэтому просто настройте Service достаточно имени. Если вы хотите получить доступ к различным пространствам имен, вам необходимо добавить полное имя пространства имен.
В этой главе мы предоставим предварительное уведомление DestinationRule, следующая глава будет использоваться DestinationRule, здесь мы знаем, что есть еще DestinationRule Этого достаточно.
Istio VistualService Вы можете ограничить внешний доступ к адресу маршрутизации и DestinationRule Вы можете настроить доступ из Pod Стратегия. может быть Istio VistualService обязательность一个 Istio DestinationRule,проходить DestinationRule Мы также можем определить подмножества версий и т. д., чтобы обогатить политику пересылки трафика.
Поскольку адресов всего пять, внешний прямой доступ
/
, страница не может быть открыта.
Чтобы убедиться, что со шлюзом нет проблем, нам нужно выполнить Istio Заказ Проверятьбревно:
istioctl analyze
Тогда наша страница проверки для продукта создаст шлюз.
root@k8smain:/data/learn/book# kubectl get gw -A
NAMESPACE NAME AGE
bookinfo bookinfo-gateway 26m
Kubernetes Есть также один Шлюз, поэтому нельзя использовать
kubectl get gateway
получить Istio из Шлюз, но аббревиатура использоватьgw
。
Затем Проверять VistualService。
root@k8smain:/data/learn/book# kubectl get vs -A
NAMESPACE NAME GATEWAYS HOSTS AGE
bookinfo bookinfo ["bookinfo-gateway"] ["*"] 79m
В главе 2 мы проходим Helm развертывать Понятно istio-ingressgateway, его порт доступа следующий:
существовать本节развертывать bookinfo-gateway из времени мы используем порт 80, поэтому дополнительная настройка не требуется. , непосредственно через istio-ingressgateway из 32309 Просто войдите в порт.
Вы должны принести его при посещении
/productpage
, ведь мы не отпускали/
。
еслинужно заменить порт,Можно изменить istio-ingressgateway из службы.,Добавлено новое отображение экспорта.
kubectl edit svc istio-ingressgateway -n istio-system
Затем измените переднюю часть ingress_gateway.yaml
,Воляпорт из 80 Изменить на 666 。
Доступ к этому микросервису можно получить через порт 32666.