部署定制 Istio 网关
创建 IstioOperator
(IOP) 定制资源,为 Istio 管理的应用程序流量定义您自己的入口和出口网关。
缺省情况下,将在集群的 istio-system
名称空间中创建一个 istio-ingressgateway
部署。 此部署公开为具有外部可访问 IP 地址的公共负载均衡器服务。 然后,您可以在 Gateway
资源中为Istio管理的应用程序定义端口,该资源将配置 istio-ingressgateway
负载均衡器以侦听这些端口的入站 HTTP /TCP流量。 此外,缺省情况下会创建一个
istio-egressgateway
,并将其公开为负载均衡器服务,以管理来自 Istio 管理的应用程序的出站流量。
但是,您可能想要在这些缺省网关之外创建其他入口或出口网关部署。 例如,出于以下原因,您可以创建其他网关以与缺省网关一起运行,或者运行以代替缺省网关:
- 某些工作负载或名称空间之间的单独流量流
- 为专用网络流量创建入口网关
- 使用定制来修改网关,例如,网关 pod 节点亲缘关系,最小副本数和特定于区域的负载均衡器
- 独立于针对受管 Istio 附加组件的所有组件推出的自动版本更新的控制网关版本更新
注意事项
开始之前,请查看有关使用定制网关的以下注意事项。
- 受管 Istio 附加组件不会管理或协调您创建的任何定制网关。 您负责创建,管理和维护这些资源。
- 部署定制网关后,请通过运行
kubectl logs -n ibm-operators -l name=addon-istio-operator
来检查 Istio 操作程序 pod 日志中是否存在语法错误。 Istio 操作程序验证并协调您所做的任何定制IstioOperator
(IOP) 更改。 如果您注意到协调循环 (由日志中的info installer Reconciling IstioOperator
重复项指示),请执行步骤 以查找配置中导致循环错误的行。 - 此外,请确保
managed-istio-custom
ConfigMap 中的istio-global-proxy-accessLogFile
选项设置为"/dev/stdout"
。 特使代理将访问信息打印到其标准输出,您可以通过对 Envoy 容器运行kubectl logs
命令来查看这些输出。
为公共流量创建定制入口网关
使用 IstioOperator
(IOP) 在 custom-gateways
名称空间中创建定制入口网关部署和公共负载均衡器服务。
-
为定制入口网关创建名称空间。
kubectl create namespace custom-gateways
-
为
IstioOperator
(IOP) 资源创建名为custom-ingress-iop.yaml
的 YAML 文件。 要强制定制网关 pod 运行特定版本的受管 Istio,请在tag
字段中指定版本。 有关更多信息,请参阅 控制定制网关更新和版本。apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.23.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
-
在集群中创建
IstioOperator
(IOP) 资源。ibm-operators
名称空间中的受管 Istio 操作程序使用 IOP 资源通过公共负载均衡器服务在custom-gateways
名称空间中部署和公开入口网关。kubectl apply -f ./custom-ingress-iop.yaml
-
验证是否在
custom-gateways
名称空间中创建了入口网关部署和服务。kubectl get deploy,svc -n custom-gateways
示例输出
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s
-
在
service/custom-ingressgateway
负载均衡器的输出中,记下EXTERNAL-IP
列中的 IP 地址 (经典集群) 或主机名 (VPC 集群)。
现在,您可以在用于定义 Istio 管理的应用程序的端口的 Gateway
资源中指定此入口网关负载均衡器的名称 custom-ingressgateway
。 然后,可以在定义服务网格中的微服务路径的 VirtualService
资源中指定 Gateway
的名称。 有关将 Gateway
和 VirtualService
与定制网关负载均衡器配合使用的示例,请尝试 BookInfo 样本应用程序。
设置 BookInfo 样本
部署 用于 Istio 的 BookInfo 样本应用程序 以测试对定制入口网关负载均衡器的访问权。
- 创建
bookinfo
名称空间并为 自动 Sidecar 注入标注名称空间。kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled
- 部署 BookInfo 示例应用程序。 将
<version>
替换为受管 Istio 附加组件运行的 major.minor 版本,您可以通过运行ibmcloud ks cluster addon ls -c <cluster_name_or_ID>
来找到该版本。kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
- 确保已部署 BookInfo 微服务及其相应的 pod。
kubectl get svc -n bookinfo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2m
kubectl get pods -n bookinfo
NAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m
- 创建名为
bookinfo-custom-gateway.yaml
的 YAML 文件以定义Gateway
和VirtualService
资源。 请注意,Gateway
资源指定custom-ingressgateway
作为先前创建的定制入口负载均衡器的名称,而VirtualService
资源指定bookinfo-gateway
作为Gateway
资源的名称。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - 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
- 在集群中创建
Gateway
和VirtualService
资源。kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
- 使用先前部分中针对
service/custom-ingressgateway
负载均衡器找到的 IP 地址 (经典) 或主机名 (VPC),在浏览器中打开 BookInfo 应用程序的产品页面。http://<IP_OR_HOSTNAME>/productpage
定制入口网关负载均衡器现在使用 Gateway
资源中的端口和 VirtualService
资源中的微服务路径将流量路由到 BookInfo 应用程序。 接下来,您可以选择 为定制网关负载均衡器创建 DNS 记录。
使用 IBM 提供的子域并通过TLS协议暴露 BookInfo
创建 IBM提供的子域以向 DNS 记录注册定制网关负载均衡器的 IP 地址 (经典) 或主机名 (VPC)。 为子域生成的 TLS 证书允许 HTTPS 与 BookInfo 应用建立连接。
-
通过创建 DNS 子域来注册定制网关负载均衡器的 IP 地址或主机名。 指定 TLS 私钥的
custom-gateway
名称空间。- 经典集群
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
- VPC 集群
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
- 经典集群
-
验证子域是否已创建。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
经典仪表盘输出示例
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPC集群的输出示例
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
-
获取子域的私钥名称。
kubectl get secret -n custom-gateways
示例输出
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m
-
在上一部分创建的
bookinfo-custom-gateway.yaml
中,修改bookinfo-gateway
Gateway
资源,添加一个 HTTPS 端口443和一个TLS部分,指定子域名的密码。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ...
-
在集群中创建已修改的
Gateway
资源。kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
-
在 Web 浏览器中,打开 BookInfo 产品页面。 请确保您在步骤2中找到的子域使用的是 HTTPS。
https://<subdomain>/productpage
为专用网络流量创建定制入口网关
要创建定制入口网关部署并使用专用负载均衡器服务公开该部署,请遵循 为公共流量创建定制入口网关 中的步骤。 在步骤 3 中创建 IOP 时,请指定 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
注释,而不是 public
。
请关注以下注意事项:
- 如果经典集群仅连接到专用 VLAN,或者如果 VPC 集群仅启用了专用云服务端点,那么在应用 IOP 时,缺省情况下会创建专用负载均衡器。
- 仅对于经典集群,无法使用
ibmcloud ks nlb-dns create classic
为定制网关负载均衡器的 IP 地址创建 DNS 记录和 IBM提供的子域。
控制定制网关更新和版本
手动更新和控制定制入口网关的受管 Istio 版本。
IBM Cloud 通过自动将补丁更新推送到 支持的Istio最新版本,使您的所有Istio组件保持最新状态。IBM Cloud Kubernetes Service 例如,当补丁版本 1.23.5 发布时,所有入口网关容器都会自动更新到此最新补丁版本。 补丁版本通过使用滚动更新策略来完成,以避免应用程序的停机时间。 但是,您可能希望阻止自动更新定制网关 pod,例如,如果要测试使用最新补丁版本的任何潜在回归。
要管理定制入口网关的更新,您可以使用以下转出策略:
- 创建定制入口网关 IOP。 在
tag
字段中,指定与控制平面版本相同或更低的补丁版本。 您可以通过运行istioctl version
来查找控制平面版本。 - 当针对受管 Istio 附加组件发布新的 补丁版本 时,请编辑一个定制网关的 IOP YAML 文件以使用最新的补丁版本,然后在集群中重新应用该 IOP。
- 将定制网关的 pod 更新为最新补丁后,请测试对定制网关的任何更改。
- 当您对更改感到满意时,请修改其余定制网关的配置以将其更新为最新补丁。
请勿将标记设置为高于 Istio 附加组件的控制平面版本的版本。
在发布版本后尽快更新定制网关 pod。 运行较早版本的定制网关可能会暴露在安全漏洞中。
其他网关定制
可以使用其他定制来配置定制入口网关,包括将网关负载均衡器部署到特定区域,指定最小网关 pod 副本数,将定制网关 pod 调度到 边缘节点,添加 preStop
生命周期挂钩以实现正常关闭,以及指定反亲缘关系和工作程序节点亲缘关系。
在以下 IOP YAML 文件中查看这些附加定制的示例。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
创建定制出口网关
在受管 Istio 附加组件的 V 1.8 和更高版本中,可以创建定制出口网关。 出口网关充当从服务网格中的应用程序到外部目标的所有出站流量的出口点。
例如,要创建定制出口网关,可以对集群中的 IOP 应用以下 YAML 文件。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.23.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
有关配置和使用定制出口网关的更多信息,请参阅 Istio 开放式源代码文档。
禁用缺省网关
如果在创建定制网关后不需要缺省 istio-ingressgateway
或 istio-egressgateway
部署,那么可以选择将其禁用。
如果您希望应用程序可供客户机访问,请确保至少启用并配置一个网关负载均衡器以将流量路由到应用程序。 如果在所有专区中禁用缺省网关负载均衡器,那么应用程序将不再公开并且无法在外部访问。
-
编辑
managed-istio-custom
ConfigMap 资源。kubectl edit cm managed-istio-custom -n ibm-operators
-
通过将
istio-ingressgateway-public-1|2|3-enabled
字段设置为"false"
来禁用缺省入口网关。istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false"
-
要禁用缺省出口网关,请添加
istio-egressgateway-public-1-enabled: "false"
字段。istio-egressgateway-public-1-enabled: "false"
-
保存并关闭配置文件。
-
确认默认网关服务已被删除。
kubectl get svc -n istio-system