Nova Service Mesh. Пример использования
В данном разделе приведены примеры использования и настройки кластера после установки модуля Service Mesh в Nova Container Platform.
1. Предварительные условия
-
Произведена успешная установка Nova Service Mesh.
-
Включен MTLS. Данный параметр устанавливается при загрузке манифеста во время установки. Режим mtls: (1)
STRICT- все соединения должны использовать mTLS (2)PERMISSIVE- возможна работа с mTLS и без (3)DISABLE- mTLS отключен;
2. Установка тестового приложения
-
Для установки тестового приложения установите манифест, который предложен ниже.
Манифест
---
kind: Namespace
apiVersion: v1
metadata:
name: istio-test
labels:
istio-injection: enabled
kubernetes.io/metadata.name: istio-test
nova-platform.io/cluster-monitoring: 'true'
nova-platform.io/trusted-ca-bundle: enabled
pod-security.kubernetes.io/enforce-version: latest
---
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: bookinfo-gateway
namespace: istio-test
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: bookinfo
namespace: istio-test
spec:
hosts:
- "*"
gateways:
- istio-test/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
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
namespace: istio-test
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews-dest-rules
namespace: istio-test
spec:
host: reviews
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
---
apiVersion: v1
kind: Service
metadata:
name: details
namespace: istio-test
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
namespace: istio-test
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
namespace: istio-test
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.20.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
apiVersion: v1
kind: Service
metadata:
name: ratings
namespace: istio-test
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
namespace: istio-test
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
namespace: istio-test
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.20.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
apiVersion: v1
kind: Service
metadata:
name: reviews
namespace: istio-test
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
namespace: istio-test
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
namespace: istio-test
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.20.2
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
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
namespace: istio-test
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.20.2
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
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
namespace: istio-test
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.20.2
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
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: productpage
namespace: istio-test
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
namespace: istio-test
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
namespace: istio-test
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.20.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
-
Установите приложение через kubectl или Nova Console.
Установка с помощью kubectl
-
Сохраните один из представленных выше манифестов в файл, например,
istio-test.yaml. -
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f istio-test.yaml
Установка с помощью Nova Console
-
Скопируйте один манифест выше.
-
Выполните вход в Nova Console.
-
Используйте опцию импорта нового объекта и вставьте в форму ранее скопированный манифест.
-
3. Проверка работоспособности Nova Service Mesh
Для проверки работоспособности выполните следующие шаги:
-
Для проверки доступности приложения извне кластера выполните запрос:
curl -v `http://worker01.test.nova/productpage`worker01.test.nova- нода, которая принимает трафик для меша.В результате выполнения команды ожидаем успешный ответ.
-
Для проверки корректности работы istio и использования нужного правила маршрутизации, указанного при установке тестового приложения, выполните запросы командой ниже:
for i in $(seq 1 10); do curl -s http://worker01.test.nova/productpage | grep reviews-v.-; doneВ результате выполнения команды ожидаем успешный ответ.
Пример вывода:v1 - reviews-v1 reviews-v1-7bf46957c6-tjtvp -
Перейдите в Nova Console. Зайдите в Ресурсы→Pods и найдите с помощью поиска pod
nova-ingress-public-controller. Выполните проверку включенного mtls соединения для между микросервами с помощью команды:curl -v http://productpage.istio-test.svc.cluster.local:9080/productpageЕсли в результате получен ответ с ошибкой, все корректно.
Пример вывода:curl: (56) Recv failure: Connection reset by peerВ данном случае доступ запрещен, поскольку mTLS включен, а в поде нет сертификата.
-
Перейдите в Kiali и проверьте схему трафика в кластере. На схеме будет наглядно показана сетевая топология трафика в кластере в рамках установленного приложения.