Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Nova Service Mesh. Пример использования

В данном разделе приведены примеры использования и настройки кластера после установки модуля Service Mesh в Nova Container Platform.

1. Предварительные условия

  1. Произведена успешная установка Nova Service Mesh.

  2. Включен MTLS. Данный параметр устанавливается при загрузке манифеста во время установки. Режим mtls: (1)STRICT- все соединения должны использовать mTLS (2)PERMISSIVE - возможна работа с mTLS и без (3)DISABLE - mTLS отключен;

2. Установка тестового приложения

  1. Для установки тестового приложения установите манифест, который предложен ниже.

Манифест
---
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: {}
---
  1. Установите приложение через kubectl или Nova Console.

    Установка с помощью kubectl
    1. Сохраните один из представленных выше манифестов в файл, например, istio-test.yaml.

    2. Установите манифест в кластер Kubernetes, выполнив команду: kubectl apply -f istio-test.yaml

    Установка с помощью Nova Console
    1. Скопируйте один манифест выше.

    2. Выполните вход в Nova Console.

    3. Используйте опцию импорта нового объекта и вставьте в форму ранее скопированный манифест.

3. Проверка работоспособности Nova Service Mesh

Для проверки работоспособности выполните следующие шаги:

  1. Для проверки доступности приложения извне кластера выполните запрос:

    curl -v `http://worker01.test.nova/productpage`

    worker01.test.nova - нода, которая принимает трафик для меша.

    В результате выполнения команды ожидаем успешный ответ.

  2. Для проверки корректности работы 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
  3. Перейдите в 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 включен, а в поде нет сертификата.

  4. Перейдите в Kiali и проверьте схему трафика в кластере. На схеме будет наглядно показана сетевая топология трафика в кластере в рамках установленного приложения.

    kiali

4. Удаление тестового приложения

Для удаления тествого приложения выполните команду:

kubectl delete namespace istio-test