#istio
Вопрос:
У меня есть контейнер nginx, который обрабатывает html-контент и маршрутизацию трафика через виртуальный сервис.
У меня есть отдельный контейнер nginx для обслуживания, который я хочу отобразить (когда я выполняю обслуживание), и в этом случае я хочу, чтобы весь трафик направлялся в этот контейнер обслуживания, а не в обычный, указанный в первом абзаце. Я действительно не хочу настраивать/исправлять исходные маршруты трафика, поэтому ищу способ переопределить какое-либо правило маршрутизации трафика.
Из того, что я прочитал, порядок правил основан на дате создания, так что это мне не очень помогло.
Поэтому, если у кого-нибудь есть какие-либо идеи, как я могу заставить весь трафик перенаправляться на конкретную службу «обслуживания», я был бы очень признателен за ваши мысли.
Комментарии:
1. Какую версию Kubernetes и Istio вы использовали и как вы настроили кластер? Вы использовали установку с голым металлом или какой-то облачный провайдер?
Ответ №1:
Я бы рекомендовал установить метку версии и работать с ней.
Сначала создайте a DestinationRule
, чтобы определить ваши различные версии и то, как они идентифицируются (по меткам).
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: nginx-versions
spec:
host: nginx.default.svc.cluster.local
subsets:
- name: maintenance
labels:
version: maintenance
- name: v1
labels:
version: v1
Затем настройте свой маршрут в поле VirtualService
указать v1
.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nginx-route
spec:
hosts:
- example.com
gateways:
- mygateway
http:
- name: nginx-route
match:
- uri:
prefix: "/nginx"
route:
- destination:
host: nginx.default.svc.cluster.local
subset: v1
Теперь вам нужен один Service
и два Deployment
s.
Селектор в службе должен соответствовать обоим развертываниям. При обычной настройке kubernetes это означало бы, что трафик будет перенаправляться между всеми рабочими нагрузками обоих развертываний. Но из-за istio и настройки версии трафик будет отправляться только в текущую настроенную версию.
Развертывание с версией обслуживания version: maintenance
должно быть помечено, и фактическая версия должна быть помечена version: v1
.
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-maintenance
spec:
replicas: 2
template:
metadata:
labels:
app: nginx
version: maintenance
spec:
containers:
- image: nginx-maintenance
[...]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
spec:
replicas: 5
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- image: nginx-v1
[...]
Если вы хотите, чтобы трафик направлялся в версию обслуживания, просто измените инструкцию subset в VirtalService
и примените ее повторно.
Если вы хотите, чтобы по какой-то причине трафик внутри кластера всегда отправлялся в вашу v1
версию, вам нужен другой VirtualService
, который использовал mesh
шлюз. В противном случае внутренний трафик кластера будет разделен между всей рабочей нагрузкой (v1 и обслуживанием). В качестве альтернативы вы можете добавить сетевой шлюз и хост в виртуальную службу сверху, но внутренний трафик кластера всегда будет вести себя как внешний трафик.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nginx-route-in-cluster
spec:
hosts:
- nginx.default.svc.cluster.local
gateways:
- mesh
http:
- name: nginx-route
match:
- uri:
prefix: "/nginx"
route:
- destination:
host: nginx.default.svc.cluster.local
subset: v1
Кроме того, вы даже можете использовать больше версий и тестировать обновления, отправляя только часть своего трафика в новую версию.
Чтобы лучше понять и получить дополнительные идеи об управлении версиями с помощью istio, пожалуйста, обратитесь к этой статье (на самом деле она довольно старая, но концепция все еще актуальна).