Установка шлюза с помощью gateway injection

В этой процедуре описывается, как установить шлюз с использованием gateway injection.

INFO

Следующая процедура применима как для развертывания ingress, так и egress шлюзов.

Содержание

Предварительные требования

Процедура

  1. Создайте namespace для шлюза:

    kubectl create namespace <gateway_namespace>
    NOTE

    Устанавливайте шлюз и контрольную плоскость Istio в разных пространствах имён.

    Вы можете установить шлюз в отдельном namespace для шлюза. Такой подход позволяет использовать шлюз совместно многими приложениями, работающими в разных namespace. В качестве альтернативы, вы можете установить шлюз в namespace приложения. В этом случае шлюз будет выступать в роли выделенного шлюза для приложения в этом namespace.

  2. Создайте YAML-файл с именем secret-reader.yaml, который определяет service account, роль и role binding для развертывания шлюза. Эти настройки позволяют шлюзу читать секреты, что необходимо для получения TLS-учётных данных.

    secret-reader.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: secret-reader
      namespace: <gateway_namespace>
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name:  secret-reader
      namespace: <gateway_namespace>
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: secret-reader
    subjects:
      - kind: ServiceAccount
        name:  secret-reader
  3. Примените YAML-файл, выполнив следующую команду:

    kubectl apply -f secret-reader.yaml
  4. Создайте YAML-файл с именем gateway-deployment.yaml, который определяет объект Kubernetes Deployment для шлюза.

    gateway-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      selector:
        matchLabels:
          istio: <gateway_name>
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway
          labels:
            istio: <gateway_name>
            sidecar.istio.io/inject: "true"
        spec:
          containers:
            - name: istio-proxy
              image: auto
              securityContext:
                capabilities:
                  drop:
                    - ALL
                allowPrivilegeEscalation: false
                privileged: false
                readOnlyRootFilesystem: true
                runAsNonRoot: true
              ports:
                - containerPort: 15090
                  protocol: TCP
                  name: http-envoy-prom
              resources:
                limits:
                  cpu: 2000m
                  memory: 1024Mi
                requests:
                  cpu: 100m
                  memory: 128Mi
          serviceAccountName: secret-reader
    1. Указывает, что контрольная плоскость Istio использует шаблон gateway injection вместо шаблона sidecar по умолчанию.
    2. Убедитесь, что для развертывания шлюза установлен уникальный label. Уникальный label необходим, чтобы ресурсы Istio Gateway могли выбирать рабочие нагрузки шлюза.
    3. Включает gateway injection, устанавливая label sidecar.istio.io/inject в значение true. Если имя ресурса Istio не является default, необходимо использовать label istio.io/rev: <istio_revision>, где revision — активная ревизия ресурса Istio.
    4. Устанавливает поле image в значение auto, чтобы образ автоматически обновлялся при каждом запуске pod.
    5. Устанавливает serviceAccountName в имя ранее созданного ServiceAccount.
  5. Примените YAML-файл, выполнив следующую команду:

    kubectl apply -f gateway-deployment.yaml
  6. Проверьте успешность развертывания Deployment шлюза, выполнив следующую команду:

    kubectl rollout status deployment/<gateway_name> -n <gateway_namespace>

    Вы должны увидеть вывод, похожий на следующий:

    Пример вывода

    Waiting for deployment "<gateway_name>" rollout to finish: 0 of 1 updated replicas are available...
    deployment "<gateway_name>" successfully rolled out
  7. Создайте YAML-файл с именем gateway-service.yaml, который содержит объект Kubernetes Service для шлюза.

    gateway-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      type: ClusterIP
      selector:
        istio: <gateway_name>
      ports:
        - name: status-port
          port: 15021
          protocol: TCP
          targetPort: 15021
        - name: http2
          port: 80
          protocol: TCP
          targetPort: 80
        - name: https
          port: 443
          protocol: TCP
          targetPort: 443
    1. При установке spec.type в ClusterIP объект Service шлюза доступен только внутри кластера. Если шлюз должен обрабатывать входящий трафик извне кластера, установите spec.type в LoadBalancer.
    2. Установите selector в уникальный label или набор label, указанных в шаблоне pod развертывания шлюза, созданного ранее.
  8. Примените YAML-файл, выполнив следующую команду:

    kubectl apply -f gateway-service.yaml
  9. Проверьте, что сервис шлюза нацелен на endpoint-ы pod-ов шлюза, выполнив следующую команду:

    kubectl get endpoints <gateway_name> -n <gateway_namespace>

Вы должны увидеть вывод, похожий на следующий пример:

Пример вывода

NAME              ENDPOINTS                                             AGE
<gateway_name>    10.131.0.181:15021,10.131.0.181:80,10.131.0.181:443   1m
  1. Опционально: Создайте YAML-файл с именем gateway-hpa.yaml, который определяет горизонтальный автоскейлер pod-ов для шлюза. В следующем примере минимальное количество реплик установлено в 2, максимальное — в 5, а масштабирование вверх происходит при средней загрузке CPU выше 80% от лимита ресурсов CPU. Этот лимит указан в шаблоне pod развертывания шлюза.

    gateway-hpa.yaml
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minReplicas: 2
      maxReplicas: 5
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <gateway_name>
    1. Установите spec.scaleTargetRef.name в имя ранее созданного развертывания шлюза.
  2. Опционально: Примените YAML-файл, выполнив следующую команду:

    kubectl apply -f gateway-hpa.yaml
  3. Опционально: Создайте YAML-файл с именем gateway-pdb.yaml, который определяет Pod Disruption Budget для шлюза. В следующем примере pod-ы шлюза могут быть эвакуированы только если после эвакуации в кластере останется как минимум 1 здоровый pod шлюза.

    gateway-pdb.yaml
    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: <gateway_name>
    1. Установите spec.selector.matchLabels в уникальный label или набор label, указанных в шаблоне pod развертывания шлюза, созданного ранее.
  4. Опционально: Примените YAML-файл, выполнив следующую команду:

    kubectl apply -f gateway-pdb.yaml