第 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
资源。
流程
创建用于安装网关的命名空间。
$ oc create namespace <gateway_namespace>
注意在不同的命名空间中安装网关和 Istio control plane。
您可以在专用网关命名空间中安装网关。这种方法允许许多应用程序在不同命名空间中运行的共享网关。或者,您可以在应用程序命名空间中安装网关。在这种方法中,网关充当该命名空间中应用的专用网关。
创建名为
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
运行以下命令来应用 YAML 文件:
$ oc apply -f secret-reader.yml
创建名为
gateway-deployment.yml
的 YAML 文件,该文件为网关定义 KubernetesDeployment
对象。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
的名称。
运行以下命令来应用 YAML 文件:
$ oc apply -f gateway-deployment.yml
运行以下命令验证
网关部署
推出部署是否成功:$ 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
创建名为
gateway-service.yml
的 YAML 文件,其中包含网关的 KubernetesService
对象。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
运行以下命令来应用 YAML 文件:
$ oc apply -f gateway-service.yml
运行以下命令,验证网关服务是否在网关 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
可选:创建一个名为
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
设置为之前创建的网关部署的名称。
可选:运行以下命令来应用 YAML 文件:
$ oc apply -f gateway-hpa.yml
可选:创建一个名为
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 模板中指定的唯一标签或一组标签。
可选:运行以下命令来应用 YAML 文件:
$ oc apply -f gateway-pdb.yml