×

作为网络管理员,部署入口和出口网关的首选方法是使用带有网关注入的Deployment资源。

关于网关迁移

在 Red Hat OpenShift Service Mesh 2.x 中,Service Mesh Operator 默认在控制平面命名空间中创建入口和出口网关。您可以在ServiceMeshControlPlane资源中定义其他网关。

使用带有网关注入的Deployment资源部署入口和出口网关提供了更大的灵活性和控制。这种部署方法是一种最佳实践,因为它允许您与相应的应用程序一起管理网关,而不是在控制平面资源中管理。因此,您应该禁用默认网关,远离 Service Mesh Control Plane声明,并开始使用网关注入。

从 SMCP 定义的网关迁移到网关注入

此过程说明如何从在ServiceMeshControlPlane资源中定义的网关零停机迁移到使用网关注入管理的网关。此迁移是通过使用现有的网关Service对象来定位使用网关注入创建的新网关部署来实现的。

先决条件
  • 您已以cluster-admin身份登录到 OpenShift Container Platform Web 控制台。

  • 必须安装 Red Hat OpenShift Service Mesh Operator。

  • 必须部署ServiceMeshControlPlane资源,并且配置中存在入口网关。

步骤
  1. 创建一个配置为使用网关注入的新入口网关。

    此过程将从ServiceMeshControlPlane资源中定义的默认入口网关部署迁移到网关注入。可以修改此过程以从在 SMCP 中配置的其他入口网关迁移。

    带有网关注入的入口网关资源示例
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway-canary
      namespace: istio-system (1)
    spec:
      selector:
        matchLabels:
          app: istio-ingressgateway
          istio: ingressgateway
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway
          labels: (2)
            app: istio-ingressgateway
            istio: ingressgateway
            sidecar.istio.io/inject: "true"
        spec:
          containers:
            - name: istio-proxy
              image: auto
          serviceAccountName: istio-ingressgateway
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: istio-ingressgateway
      namespace: istio-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: secret-reader
      namespace: istio-system
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: istio-ingressgateway-secret-reader
      namespace: istio-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: secret-reader
    subjects:
      - kind: ServiceAccount
        name: istio-ingressgateway
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy (3)
    metadata:
      name: gatewayingress
      namespace: istio-system
    spec:
      podSelector:
        matchLabels:
          istio: ingressgateway
      ingress:
        - {}
      policyTypes:
        - Ingress
    1 网关注入部署和所有支持资源应部署在与 SMCP 定义的网关相同的命名空间中。
    2 确保 pod 模板中指定的标签包含与现有 SMCP 定义的网关关联的Service对象中指定的全部标签选择器。
    3 授予从集群外部访问新网关的权限。每当ServiceMeshControlPlane资源的spec.security.manageNetworkPolicy设置为true(默认设置)时,都需要此访问权限。
  2. 验证新网关部署是否成功处理请求。

    如果在ServiceMeshControlPlane资源中配置了访问日志记录,请查看新网关部署的访问日志以确认行为。

  3. 缩减旧部署的规模并扩大新部署的规模。

    通过执行以下步骤,逐步将流量从旧网关部署转移到新网关部署

    1. 通过运行以下命令增加新网关部署的副本数量

      $ oc scale -n istio-system deployment/<new_gateway_deployment> --replicas <new_number_of_replicas>
    2. 通过运行以下命令减少旧网关部署的副本数量

      $ oc scale -n istio-system deployment/<old_gateway_deployment> --replicas <new_number_of_replicas>
    3. 重复运行前两条命令。每次都增加新网关部署的副本数量,并减少旧网关部署的副本数量。继续重复,直到新网关部署处理到网关Service对象的所有流量。

  4. 通过运行以下命令从网关Service对象中删除app.kubernetes.io/managed-by标签

    $ oc label service -n istio-system istio-ingressgateway app.kubernetes.io/managed-by-

    删除该标签可防止在网关在ServiceMeshControlPlane资源中被禁用时删除该服务。

  5. 通过运行以下命令从网关Service对象中删除ownerReferences对象

    $ oc patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "remove", "path": "/metadata/ownerReferences"}]'

    删除此对象可以防止在删除ServiceMeshControlPlane资源时垃圾收集该服务。

  6. 通过运行以下命令禁用由ServiceMeshControlPlane资源管理的旧网关部署

    $ oc patch smcp -n istio-system <smcp_name> --type='json' -p='[{"op": "replace", "path": "/spec/gateways/ingress/enabled", "value": false}]'

    禁用旧的 Ingress 网关Service对象时,不会将其删除。您可以将此Service对象保存到文件中,并与新的网关注入资源一起管理。