第 1 章 关于网关


网关是一个独立的 Envoy 代理部署,以及在服务网格边缘运行的关联的 Kubernetes 服务。您可以配置网关,以对进入或离开网格的流量提供精细的控制。在 Red Hat OpenShift Service Mesh 中,您可以使用网关注入安装网关。

1.1. 关于网关注入

网关注入依赖于与 sidecar 注入相同的机制,以将 Envoy 代理注入网关 pod。要使用网关注入安装网关,您可以在一个命名空间中创建一个 Kubernetes Deployment 对象和一个关联的 Kubernetes Service 对象,这些对象对 Istio control plane 可见。在创建 Deployment 对象并注解它时,Istio control plane 会注入代理,代理被配置为网关。安装网关后,您可以将其配置为使用 Istio 网关和 VirtualService 资源控制入口和出口流量。

1.1.1. 使用网关注入安装网关

此流程解释了如何使用网关注入来安装网关。

注意

您可以使用此流程创建入口或出口网关。

先决条件

  • 已安装 OpenShift Service Mesh Operator 版本 3.0 或更高版本。
  • 您已创建了 Istio control plane。
  • 您已创建了 IstioCNI 资源。

流程

  1. 创建用于安装网关的命名空间。

    $ oc create namespace <gateway_namespace>
    注意

    在不同的命名空间中安装网关和 Istio control plane。

    您可以在专用网关命名空间中安装网关。这种方法允许许多应用程序在不同命名空间中运行的共享网关。或者,您可以在应用程序命名空间中安装网关。在这种方法中,网关充当该命名空间中应用的专用网关。

  2. 创建名为 secret-reader.yml 的 YAML 文件,该文件为网关部署定义服务帐户、角色和角色绑定。这些设置可让网关读取获取 TLS 凭证所需的 secret。

    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 文件:

    $ oc apply -f secret-reader.yml
  4. 创建名为 gateway-deployment.yml 的 YAML 文件,该文件为网关定义 Kubernetes Deployment 对象。

    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 1
          labels:
            istio: <gateway_name> 2
            sidecar.istio.io/inject: "true" 3
        spec:
          containers:
            - name: istio-proxy
              image: auto 4
              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
          securityContext:
            sysctls:
            - name: net.ipv4.ip_unprivileged_port_start
              value: "0"
          serviceAccountName: secret-reader 5
    1
    表示 Istio control plane 使用网关注入模板,而不是默认的 sidecar 模板。
    2
    确保为网关部署设置了唯一的标签。需要一个唯一标签,以便 Istio 网关资源 可以选择网关工作负载。
    3
    通过将 sidecar.istio.io/inject 标签设置为 true 来启用网关注入。如果 Istio 资源的名称不是 默认的,则必须使用 istio.io/rev: <istio_revision& gt; 标签,其中修订版本代表 Istio 资源的活跃修订版本。
    4
    将 image 字段设置为 auto,以便镜像在每次 pod 启动时自动更新。
    5
    serviceAccountName 设置为之前创建的 ServiceAccount 的名称。
  5. 运行以下命令来应用 YAML 文件:

    $ oc apply -f gateway-deployment.yml
  6. 运行以下命令验证 网关部署 推出部署是否成功:

    $ oc 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. 创建名为 gateway-service.yml 的 YAML 文件,其中包含网关的 Kubernetes Service 对象。

    apiVersion: v1
    kind: Service
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      type: ClusterIP 1
      selector:
        istio: <gateway_name> 2
      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。或者,您可以使用 OpenShift 路由。
    2
    选择器 设置为之前创建的网关部署的 pod 模板中指定的唯一标签或一组标签。
  8. 运行以下命令来应用 YAML 文件:

    $ oc apply -f gateway-service.yml
  9. 运行以下命令,验证网关服务是否在网关 pod 的端点为目标:

    $ oc get endpoints <gateway_name> -n <gateway_namespace>

    您应该看到类似以下示例的输出:

    输出示例

    NAME              ENDPOINTS                             AGE
    <gateway_name>    10.131.0.181:8080,10.131.0.181:8443   1m

  10. 可选:创建一个名为 gateway-hpa.yml 的 YAML 文件,该文件为网关定义 pod 横向自动扩展。以下示例将最小副本设置为 2,最大副本设置为 5,并在平均 CPU 使用率超过 CPU 资源限值时扩展副本。此限制在网关部署的 pod 模板中指定。

    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
    1
    spec.scaleTargetRef.name 设置为之前创建的网关部署的名称。
  11. 可选:运行以下命令来应用 YAML 文件:

    $ oc apply -f gateway-hpa.yml
  12. 可选:创建一个名为 gateway-pdb.yml 的 YAML 文件,该文件为网关定义 pod 中断预算。以下示例只有在驱除后至少有 1 个健康网关 pod 将保留在集群中时,才会被驱除网关 pod。

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: <gateway_name>
      namespace: <gateway_namespace>
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: <gateway_name> 1
    1
    spec.selector.matchLabels 设置为前面创建的网关部署的 pod 模板中指定的唯一标签或一组标签。
  13. 可选:运行以下命令来应用 YAML 文件:

    $ oc apply -f gateway-pdb.yml
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.