在服务网格中管理和展示应用程序
在集群中安装 Istio 附加组件后,可以通过设置 Envoy 代理侧柜注入并使用子域公开应用程序,将应用程序部署到 Istio 服务网中。
了解 BookInfo 示例应用
BookInfo 的Istio示例应用程序包括基本演示设置和默认目标规则,以便您可以立即试用Istio的功能。
在 Istio V1.4 和更高版本中,BookInfo 不作为受管附加组件提供,必须单独安装。 要安装 BookInfo,请参阅设置 BookInfo 样本应用程序。
4 个 BookInfo 微服务包括:
productpage
- 调用details
和reviews
微服务来填充页面。details
- 包含书籍信息。ratings
- 包含伴随书籍评论的书籍排名信息。reviews
- 包含书籍评论并调用ratings
微服务。reviews
微服务具有多个版本:v1
不调用ratings
微服务。v2
调用ratings
微服务,并将评级显示为黑色的 1 到 5 颗星。v3
调用ratings
微服务,并将评级显示为红色的 1 到 5 颗星。
其中每个微服务的部署 YAML 都已修改,以便在部署之前将 Envoy 侧柜代理作为容器预注入到微服务的 pod 中。 有关手动侧喷的更多信息,请参阅 Istio文档。 此外,BookInfo 应用程序已由 Istio 网关在公共 IP 地址上公开。 虽然 BookInfo 应用程序可以帮助您入门,但该应用程序并不适合用于生产目的。
设置 BookInfo 样本应用程序
- 在集群中安装 BookInfo。 下载适用于您的操作系统的最新 Istio 包,其中包含 BookInfo 应用程序的配置文件。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.5 sh -
- 导航至 Istio 包目录。
cd istio-1.23.5
- 标注
default
名称空间以用于自动侧柜注入。kubectl label namespace default istio-injection=enabled
- 部署 BookInfo 应用程序、网关和目标规则。
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
- 确保已部署 BookInfo 微服务及其相应的 pod。
kubectl get svc kubectl get pods
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 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
获取公开 BookInfo的 istio-ingressgateway
负载均衡器的公共地址。
在经典仪表盘上创建一个 URL 入口
- 设置 Istio Ingress 主机。
export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
- 设置 Istio Ingress 端口。
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
- 创建使用 Istio Ingress 主机和端口的
GATEWAY_URL
环境变量。export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
- 对
GATEWAY_URL
变量运行 curl,以检查 BookInfo 应用程序是否正在运行。200
响应表示 BookInfo 应用程序使用 Istio 正常运行。curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
- 尝试多次刷新该页面。 不同版本的评论部分会以红色星星、黑色星星和无星星进行循环。
在VPC集群中创建网关 URL
- 创建一个使用 Istio 入口主机名的
GATEWAY_URL
环境变量。export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
- 对
GATEWAY_URL
变量运行 curl,以检查 BookInfo 应用程序是否正在运行。200
响应表示 BookInfo 应用程序使用 Istio 正常运行。curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
在浏览器中查看 BookInfo 网页
根据您的操作运行以下命令以在浏览器中查看 BookInfo 应用程序。
Mac OS 或者 Linux
open http://$GATEWAY_URL/productpage
Windows
start http://$GATEWAY_URL/productpage
尝试多次刷新该页面。 不同版本的评论部分会以红色星星、黑色星星和无星星进行循环。
使用 IBM 提供的子域暴露 BookInfo,不使用TLS
在集群中启用 BookInfo 附加组件时,会创建 Istio 网关 bookinfo-gateway
。 该网关使用 Istio 虚拟服务和目标规则来配置负载均衡器 istio-ingressgateway
,用于通过公共方式公开 BookInfo 应用程序。 在以下步骤中,将为 istio-ingressgateway
负载均衡器 IP 地址创建子域(在经典集群中)或主机名(在 VPC 集群中),经由此子域或主机名可以通过公共方式访问
BookInfo。
- 通过创建 DNS 子域来注册
istio-ingressgateway
负载均衡器的 IP 地址(在经典集群中)或主机名(在 VPC 集群中)。- 经典:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
- 经典:
- 验证是否已创建子域并复制子域。
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>
在 Web 浏览器中,打开 BookInfo 产品页面。 由于未配置 TLS,请确保使用 HTTP。
http://<subdomain>/productpage
尝试多次刷新该页面。 发送至 http://<subdomain>/productpage
的请求由Istio网关负载均衡器接收。 由于是 Istio 网关来管理微服务的虚拟服务和目标路由规则,因此仍会随机返回 reviews
微服务的不同版本。
使用 IBM 提供的子域并通过TLS协议暴露 BookInfo
在集群中启用 BookInfo 附加组件时,会创建 Istio 网关 bookinfo-gateway
。 该网关使用 Istio 虚拟服务和目标规则来配置负载均衡器 istio-ingressgateway
,用于通过公共方式公开 BookInfo 应用程序。 在以下步骤中,将为 istio-ingressgateway
负载均衡器 IP 地址创建子域(在经典集群中)或主机名(在 VPC 集群中),经由此子域或主机名可以通过公共方式访问
BookInfo。 您还可以使用SSL证书来启用 HTTPS 与 BookInfo 应用程序的连接。
-
通过创建 DNS 子域来注册
istio-ingressgateway
负载均衡器的 IP 地址(在经典集群中)或主机名(在 VPC 集群中)。- 经典:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
- 经典:
-
验证子域是否已创建,并记下 SSL Cert Secret Name 字段中的 SSL 私钥名称。
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>
配置 bookinfo-gateway 以使用 TLS 终止
完成以下步骤以设置 bookinfo-gateway
的 TLS 终止。
- 删除未配置为处理 TLS 连接的现有
bookinfo-gateway
。kubectl delete gateway bookinfo-gateway
- 创建使用 TLS 终止的新
bookinfo-gateway
配置文件。 将以下 YAML 文件另存为bookinfo-gateway.yaml
。 将<secret_name>
替换为先前找到的 SSL 密钥的名称。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: <secret_name> hosts: - "*"
- 在集群中创建新的
bookinfo-gateway
。kubectl apply -f bookinfo-gateway.yaml
- 在 Web 浏览器中,打开 BookInfo 产品页面。 请确保您在步骤2中找到的子域使用的是 HTTPS。
https://<subdomain>/productpage
- 尝试多次刷新该页面。 发送至
https://<subdomain>/productpage
的请求由Istio网关负载均衡器接收。 由于是 Istio 网关来管理微服务的虚拟服务和目标路由规则,因此仍会随机返回reviews
微服务的不同版本。
了解具体情况
BookInfo 样本演示了 Istio 的三个流量管理组件如何一起使用,将入口流量路由到应用程序。
Gateway
bookinfo-gateway
网关描述了一个负载均衡器,即istio-ingressgateway
服务,位于istio-system
命名空间中,充当 HTTP /TCP流量进入 BookInfo 的入口。 Istio 将该负载均衡器配置为在网关配置文件中定义的端口上侦听对 Istio 管理的应用程序的入局请求。 要查看 BookInfo 网关的配置文件,请运行以下命令。
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
bookinfo
VirtualService 定义了微服务为destinations
,从而定义了服务网格中请求路由的规则。 在bookinfo
虚拟服务中,请求的/productpage
URI 会路由到端口productpage
上的9080
主机。 通过这种方式,对 BookInfo 应用程序的所有请求都会首先路由到productpage
微服务,然后再调用 BookInfo 的其他微服务。 要查看虚拟服务规则,请运行以下命令。
kubectl get virtualservice bookinfo -o yaml
DestinationRule
- 网关根据虚拟服务规则处理请求后,
details
、productpage
、ratings
和reviews
DestinationRules 当请求到达微服务时,定义应用于该请求的策略。 例如,刷新 BookInfo 产品页面时,您看到的更改是productpage
微服务随机调用v1
微服务的不同版本(v2
、v3
和reviews
)的结果。 版本是随机选择的,因为reviews
目标规则对微服务的各subsets
或指定的版本授予同等权重。 流量路由到服务的特定版本时,虚拟服务规则将使用这些子集。 要查看适用于 BookInfo, 的目的地规则,请运行以下命令。
kubectl describe destinationrules
通过设置侧柜注入以在 Istio 服务网中包含应用程序
准备好使用 Istio 来管理您自己的应用程序了吗? 部署应用程序之前,必须先决定希望如何将 Envoy 代理侧柜注入到应用程序 pod 中。
每个应用容器都必须运行一个Envoy代理Sidecar,以便微服务能够进入服务网格。 您可以确保侧柜以自动或手动方式注入到每个应用程序 pod 中。 有关侧喷的更多信息,请参阅 Istio文档。
启用自动侧柜注入
启用自动侧柜注入时,名称空间会侦听任何新的部署,并自动修改 pod 模板规范,以便创建使用 Envoy 代理侧柜容器的应用程序 pod。 在计划将要与 Istio 集成的多个应用程序部署到名称空间中时,对该名称空间启用自动侧柜注入。 缺省情况下,在 Istio 受管附加组件中,未对任何名称空间启用自动侧柜注入。
请勿对 kube-system
,ibm-system,
或 ibm-operators
名称空间启用侧柜注入。
要对名称空间启用自动侧柜注入,请执行以下操作:
-
获取要将 Istio 管理的应用程序部署到的名称空间的名称。
kubectl get namespaces
-
将名称空间标记为
istio-injection=enabled
。kubectl label namespace <namespace> istio-injection=enabled
-
将应用程序部署到已标记的名称空间中,或者重新部署已在该名称空间中的应用程序。
kubectl apply <myapp>.yaml --namespace <namespace>
-
可选要在该命名空间中重新部署应用程序,请删除应用程序容器,以便在注入侧车时重新部署。
kubectl delete pod -l app=<myapp>
-
如果您没有创建服务来推广您的应用程序,请创建一个 Kubernetes 服务。 应用程序必须由 Kubernetes 服务公开,才能包含为 Istio 服务网中的微服务。 请确保您遵循 Istio 对 Pod 和服务的要求。
-
为应用程序定义服务。
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on
-
在集群中创建服务。 确保服务部署到应用程序所在的名称空间中。
kubectl apply -f myappservice.yaml -n <namespace>
现在,应用程序 pod 已集成到 Istio 服务网中,因为这些 pod 将 Istio 侧柜容器与应用程序容器一起运行。
手动注入侧柜
如果您不想为某个命名空间启用自动侧车注入,可以手动将侧车注入部署 YAML。 当应用程序在命名空间中与其他部署一起运行时,如果您不希望自动注入侧边栏,请手动注入侧边栏。
请勿对 kube-system
,ibm-system,
或 ibm-operators
名称空间启用侧柜注入。
- 下载
istioctl
客户机。curl -L https://istio.io/downloadIstio | sh -
- 导航至 Istio 包目录。
cd istio-1.23.5
要将侧柜手动注入到部署中,请执行以下操作:
-
将 Envoy 侧柜注入到应用程序部署 YAML 中。
istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
-
部署应用程序。
kubectl apply <myapp>.yaml
-
如果您没有创建服务来推广您的应用程序,请创建一个 Kubernetes 服务。 应用程序必须由 Kubernetes 服务公开,才能包含为 Istio 服务网中的微服务。 请确保您遵循 Istio 对 Pod 和服务的要求。
-
为应用程序定义服务。
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on.
-
在集群中创建服务。 确保服务部署到应用程序所在的名称空间中。
kubectl apply -f myappservice.yaml -n <namespace>
现在,应用程序 pod 已集成到 Istio 服务网中,因为这些 pod 将 Istio 侧柜容器与应用程序容器一起运行。
启用或禁用公共 Istio 负载均衡器
缺省情况下,在集群中启用了一个公共 Istio 负载均衡器 istio-ingressgateway
,以将入局请求从因特网负载均衡到 Istio 管理的应用程序。 您可以通过在集群的每个专区中启用 Istio 负载均衡器来实现更高的可用性。
-
编辑
managed-istio-custom
ConfigMap 资源。kubectl edit cm managed-istio-custom -n ibm-operators
-
验证所有集群区域都位于
istio-ingressgateway-zone
字段中。达拉斯的典型多专区集群示例:
istio-ingressgateway-zone-1: "dal10" istio-ingressgateway-zone-2: "dal12" istio-ingressgateway-zone-3: "dal13"
-
通过将
istio-ingressgateway-public-1|2|3-enabled
字段设置为"true"
或"false"
,在每个专区中启用或禁用 Istio 负载均衡器。如果您希望应用程序可供客户机访问,请确保至少启用一个负载均衡器,或者 创建定制网关负载均衡器。 如果禁用所有区域中的所有负载均衡器,那么应用程序将不再公开并且无法在外部访问。
在每个专区中启用公共网关的示例:
istio-ingressgateway-public-1-enabled: "true" istio-ingressgateway-public-2-enabled: "true" istio-ingressgateway-public-3-enabled: "true"
-
保存并关闭配置文件。
-
验证是否已创建新的
istio-ingressgateway
负载均衡器服务。kubectl get svc -n istio-system
要使用 istio-ingressgateway
负载均衡器服务公开 Istio 管理的应用程序,请在 Gateway
资源中指定 istio: ingressgateway
选择器。 有关更多信息,请参阅 公开 Istio 管理的应用程序。
使用 DNS 公开 Istio 入口网关
通过为 istio-ingressgateway
负载均衡器创建 DNS 条目,并配置该负载均衡器以将流量转发到应用程序,以公共方式公开 Istio 管理的应用程序。
在以下步骤中,将设置子域,用户可以创建以下资源通过该子域来访问应用程序:
- 名为
my-gateway
的网关。 此网关充当应用程序的公共入口点,并使用现有istio-ingressgateway
负载均衡器服务来公开应用程序。 可以选择配置网关以使用 TLS 终止。 - 一个名为
my-virtual-service
的虚拟服务。my-gateway
使用您在my-virtual-service
中定义的规则将流量路由到您的应用程序。 istio-ingressgateway
负载均衡器的子域。 对该子域的所有用户请求都将根据my-virtual-service
路由规则转发到应用程序。
在没有 TLS 终止的情况下使用 DNS 公开 Istio 入口网关
- 在集群中安装
istio
受管附加组件。 - 安装
istioctl
CLI。 - 为您的应用微服务设置侧车注入,将应用微服务部署到命名空间中,并为应用微服务创建 Kubernetes 服务,以便它们位于Istio服务网格中。
要公开应用程序,请执行以下操作:
-
创建一个网关,使用公共
istio-ingressgateway
负载均衡器服务为 HTTP 暴露端口80。 请将<namespace>
替换为部署 Istio 管理的微服务的命名空间。 有关网关YAML组件的更多信息,请参阅 Istio参考文档。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway spec: selector: app: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
-
在部署了 Istio 管理的微服务的名称空间中应用网关。
kubectl apply -f my-gateway.yaml -n <namespace>
-
创建虚拟服务,此虚拟服务使用
my-gateway
网关,并为应用程序微服务定义路由规则。 如果微服务侦听的是80
之外的端口,请添加该端口。 有关虚拟服务YAML组件的更多信息,请参阅 Istio参考文档。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 80 # If your microservice listens on a different port, replace `80` with the port.
-
在部署了 Istio 管理的微服务的名称空间中应用虚拟服务规则。
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
获取
istio-ingressgateway
公共负载均衡器的外部IP地址 (经典集群)或主机名(VPC集群)。 如果 在集群的每个专区中启用了 Istio 负载均衡器,请获取每个专区中负载均衡器服务的 IP 地址或主机名。kubectl get svc -n istio-system
# Example output for classic clusters istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
通过创建DNS子域来注册负载均衡器IP或主机名。 有关在 IBM Cloud Kubernetes Service 中注册 DNS 子域的更多信息,请参阅 经典:注册 NLB 子域,或有关使用 VPC ALB 或 VPC NLB 的 DNS 子域注册 VPC 负载平衡器主机名的信息。
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
VPC集群的示例命令。
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
-
验证子域是否已创建。 在输出中,在 SSL 证书密钥名称 字段中复制 SSL 密钥的名称。
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>
-
通过输入应用微服务的 URL,验证流量是否路由到 Istio 管理的微服务。
http://<host_name>/<service_path>
在寻找对路由进行更细颗粒度控制的方法吗? 为了创建负载均衡器将流量路由到每个微服务后应用的规则,例如将流量发送到同一微服务的不同版本的规则,您可以创建并应用 DestinationRules
。
需要调试入口或出口设置吗? 确保 managed-istio-custom
ConfigMap 中的 istio-global-proxy-accessLogFile
选项设置为 "/dev/stdout"
。 特使代理将访问信息打印到其标准输出,您可以通过对
Envoy 容器运行 kubectl logs
命令来查看这些输出。 如果您注意到网关的 ibm-cloud-provider-ip
pod 卡在 pending
中,请参阅 此故障诊断主题。
通过 TLS 终止向 DNS 公开 Istio 入口网关
- 在集群中安装
istio
受管附加组件。 - 安装
istioctl
CLI。 - 为您的应用微服务设置侧车注入,将应用微服务部署到命名空间中,并为应用微服务创建 Kubernetes 服务,以便它们位于Istio服务网格中。
要公开应用程序,请执行以下操作:
-
通过创建DNS子域来注册负载均衡器IP或主机名。 有关在 IBM Cloud Kubernetes Service中注册 DNS 子域的更多信息,请参阅 经典: 注册 NLB 子域 或 向 DNS 子域注册 VPC 负载均衡器主机名。
- 经典集群:
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
- VPC 集群:
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
- 经典集群:
-
验证子域是否已创建。 在输出中,在 SSL 证书密钥名称 字段中复制 SSL 密钥的名称。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
# Example output for classic clusters: 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>
# Example output for VPC clusters: 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>
-
创建一个网关,使用公共
istio-ingressgateway
负载均衡器服务为 HTTP 暴露端口80。 请将<namespace>
替换为部署 Istio 管理的微服务的命名空间。 有关网关YAML组件的更多信息,请参阅 Istio参考文档。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway namespace: <namespace> spec: selector: istio: ingressgateway servers: - port: name: https protocol: HTTPS number: 443 tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key hosts: - "*"
-
在部署了 Istio 管理的微服务的名称空间中应用网关。
kubectl apply -f my-gateway.yaml -n <namespace>
-
创建虚拟服务,此虚拟服务使用
my-gateway
网关,并为应用程序微服务定义路由规则。 有关虚拟服务YAML组件的更多信息,请参阅 Istio参考文档。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 443 # If your microservice listens on a different port, replace 443 with the port.
-
在部署了 Istio 管理的微服务的名称空间中应用虚拟服务规则。
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
获取
istio-ingressgateway
公共负载均衡器的外部IP地址 (经典集群)或主机名(VPC集群)。 如果 在集群的每个专区中启用了 Istio 负载均衡器,请获取每个专区中负载均衡器服务的 IP 地址或主机名。kubectl get svc -n istio-system
# Example output for classic clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
通过输入应用微服务的 URL,验证流量是否路由到 Istio 管理的微服务。
https://<host_name>/<service_path>
NLB DNS 主机私钥的证书每 90 天到期一次。 缺省名称空间中的私钥在到期的 37 天之前会由 IBM Cloud Kubernetes Service 自动更新,但每次更新私钥后,必须手动将私钥复制到 istio-system
名称空间。 使用脚本可自动执行此过程。
在寻找对路由进行更细颗粒度控制的方法吗? 为了创建负载均衡器将流量路由到每个微服务后应用的规则,例如将流量发送到同一微服务的不同版本的规则,您可以创建并应用 DestinationRules
。
需要调试入口或出口设置吗? 确保 managed-istio-custom
ConfigMap 中的 istio-global-proxy-accessLogFile
选项设置为 "/dev/stdout"
。 特使代理将访问信息打印到其标准输出,您可以通过对
Envoy 容器运行 kubectl logs
命令来查看这些输出。 如果您注意到网关的 ibm-cloud-provider-ip
pod 卡在 pending
中,请参阅 此故障诊断主题。
通过启用 mTLS 来保护集群内流量
对名称空间中的工作负载启用加密,以在集群内实现相互 TLS (mTLS)。 在集群中 pod 之间由 Envoy 路由的流量会使用 TLS 进行加密。 mTLS 的证书管理由 Istio 进行处理。 更多信息,请参阅 Istio mTLS 文档。
- 创建名为
default.yaml
的认证策略文件。 该策略在命名空间范围内,并配置服务网格中的工作负载,使其仅接受使用 TLS 加密的请求。 请注意,此处未列出任何targets
规范,因为该政策适用于此命名空间中网格中的所有服务。apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" spec: mtls: mode: STRICT
- 将认证策略应用于名称空间。
kubectl apply -f default.yaml -n <namespace>
- 创建一个名为
destination-mtls.yaml
的目的地规则文件。 此策略在名称空间中配置服务网格工作负载,以使用 TLS 发送流量。 请注意,host: *.local
通配符会将此目标规则应用于网中的所有服务。apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "destination-mtls" spec: host: "*.local" trafficPolicy: tls: mode: ISTIO_MUTUAL
- 应用目标规则。
kubectl apply -f destination-mtls.yaml -n <namespace>
- 如果要为其他名称空间中的服务网格工作负载实现 mTLS,请对每个名称空间重复这些步骤。
此外,出于非认证原因(例如,将流量路由到不同版本的服务),也会使用目标规则。 为服务创建的任何目标规则还必须包含设置为 mode: ISTIO_MUTUAL
的相同 TLS 块。 此块会阻止规则覆盖在此部分中配置的网范围的 mTLS 设置。