一、简介
Bookinfo是Istio官方提供的一个示例应用,主要模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。以下内容在官网都有介绍,详细信息请点击这里。
Bookinfo 应用分为四个单独的微服务:
- productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
- details. 这个微服务中包含了书籍的信息。
- reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
- ratings. 这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本:
- v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
- v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。
二、安装部署Bookinfo
安装Bookinfo
[root@k8s-master istio-1.11.3]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created
应用很快会启动起来。当每个 Pod 准备就绪时,Istio 边车代理将伴随它们一起部署。
[root@k8s-master istio-1.11.3]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.10.153.101 <none> 9080/TCP 14s kubernetes ClusterIP 10.10.0.1 <none> 443/TCP 123m productpage ClusterIP 10.10.96.177 <none> 9080/TCP 14s ratings ClusterIP 10.10.48.175 <none> 9080/TCP 14s reviews ClusterIP 10.10.178.197 <none> 9080/TCP 14s
过几分钟后查看pod状态,按照官方的说法,要等待并确保所有的 Pod 达到此状态: 就绪状态(READY)的值为 2/2
、状态(STATUS)的值为 Running
。 这个操作过程可能会花费几分钟的时间。
[root@k8s-master istio-1.11.3]# kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-79f774bdb9-nqvx6 2/2 Running 0 12m productpage-v1-6b746f74dc-wktpj 2/2 Running 0 12m ratings-v1-b6994bb9-pfr8h 2/2 Running 0 12m reviews-v1-545db77b95-vgpzt 2/2 Running 0 12m reviews-v2-7bf8c9648f-twlcz 2/2 Running 0 12m reviews-v3-84779c7bbc-ggvpw 2/2 Running 0 12m
全部状态都为Running后,也可以登录k8s dashboard查看pods状态。
确认状态都正常之后,运行下面命令,通过检查返回的页面标题,来验证应用是否已在集群中运行,并已提供网页服务:
[root@k8s-master istio-1.11.3]# kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title> [root@k8s-master istio-1.11.3]#
检查istio的CRD和API资源
[root@k8s-master istio-1.11.3]# kubectl get crd |grep istio authorizationpolicies.security.istio.io 2021-09-28T10:09:42Z destinationrules.networking.istio.io 2021-09-28T10:09:42Z envoyfilters.networking.istio.io 2021-09-28T10:09:42Z gateways.networking.istio.io 2021-09-28T10:09:42Z istiooperators.install.istio.io 2021-09-28T10:09:42Z peerauthentications.security.istio.io 2021-09-28T10:09:42Z requestauthentications.security.istio.io 2021-09-28T10:09:42Z serviceentries.networking.istio.io 2021-09-28T10:09:42Z sidecars.networking.istio.io 2021-09-28T10:09:42Z telemetries.telemetry.istio.io 2021-09-28T10:09:42Z virtualservices.networking.istio.io 2021-09-28T10:09:42Z workloadentries.networking.istio.io 2021-09-28T10:09:42Z workloadgroups.networking.istio.io 2021-09-28T10:09:42Z [root@k8s-master istio-1.11.3]# ^C [root@k8s-master istio-1.11.3]# kubectl api-resources |grep istio istiooperators iop,io install.istio.io/v1alpha1 true IstioOperator destinationrules dr networking.istio.io/v1beta1 true DestinationRule envoyfilters networking.istio.io/v1alpha3 true EnvoyFilter gateways gw networking.istio.io/v1beta1 true Gateway serviceentries se networking.istio.io/v1beta1 true ServiceEntry sidecars networking.istio.io/v1beta1 true Sidecar virtualservices vs networking.istio.io/v1beta1 true VirtualService workloadentries we networking.istio.io/v1beta1 true WorkloadEntry workloadgroups wg networking.istio.io/v1alpha3 true WorkloadGroup authorizationpolicies security.istio.io/v1beta1 true AuthorizationPolicy peerauthentications pa security.istio.io/v1beta1 true PeerAuthentication requestauthentications ra security.istio.io/v1beta1 true RequestAuthentication telemetries telemetry telemetry.istio.io/v1alpha1 true Telemetry
三、组件安装
1.安装 dashboard 插件
[root@k8s-master istio-1.11.3]# kubectl apply -f samples/addons/ -n istio-system serviceaccount/grafana unchanged configmap/grafana unchanged service/grafana unchanged deployment.apps/grafana configured configmap/istio-grafana-dashboards configured configmap/istio-services-grafana-dashboards configured deployment.apps/jaeger unchanged service/tracing unchanged service/zipkin unchanged service/jaeger-collector unchanged serviceaccount/kiali unchanged configmap/kiali unchanged clusterrole.rbac.authorization.k8s.io/kiali-viewer unchanged clusterrole.rbac.authorization.k8s.io/kiali unchanged clusterrolebinding.rbac.authorization.k8s.io/kiali unchanged role.rbac.authorization.k8s.io/kiali-controlplane unchanged rolebinding.rbac.authorization.k8s.io/kiali-controlplane unchanged service/kiali unchanged deployment.apps/kiali unchanged serviceaccount/prometheus unchanged configmap/prometheus unchanged clusterrole.rbac.authorization.k8s.io/prometheus unchanged clusterrolebinding.rbac.authorization.k8s.io/prometheus unchanged service/prometheus unchanged deployment.apps/prometheus configured
将istio-ingressgateway改为NodePort方式,方便访问
[root@k8s-master istio-1.11.3]# kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}' service/istio-ingressgateway patched [root@k8s-master istio-1.11.3]#
查看kiali pod和service
[root@k8s-master istio-1.11.3]# kubectl get pods -n istio-system|grep kiali kiali-fd9f88575-spk4m 1/1 Running 1 (84m ago) 18h [root@k8s-master istio-1.11.3]# kubectl get svc -n istio-system|grep kiali kiali ClusterIP 10.10.218.189 <none> 20001/TCP,9090/TCP 18h [root@k8s-master istio-1.11.3]#
将 service 的服务类型设置为 nodeport
[root@k8s-master istio-1.11.3]# kubectl patch svc -n istio-system kiali -p '{"spec": {"type": "NodePort"}}' service/kiali patched [root@k8s-master istio-1.11.3]#
再次查看service
[root@k8s-master istio-1.11.3]# kubectl get svc -n istio-system|grep kiali kiali NodePort 10.10.218.189 <none> 20001:30668/TCP,9090:30094/TCP 18h [root@k8s-master istio-1.11.3]#
可以看到20001对应的端口是30668,通过浏览器访问http://192.168.186.132:30668/,如下图:
默认用户名密码: admin/admin,由于是第一次访问,默认是以anonymous用户登录,无需输入用户名和密码。
2、对外开放应用程序
前面虽然已经部署了BookInfo ,但还不能被外界访问。 要开放访问,还需要创建 Istio 入站网关(Ingress Gateway), 它会在网格边缘把一个路径映射到路由。步骤如下:
把应用关联到 Istio 网关:
[root@k8s-master istio-1.11.3]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
确保配置文件没有问题
[root@k8s-master istio-1.11.3]# istioctl analyze ✔ No validation issues found when analyzing namespace: default.
确定入站 IP 和端口
执行下面命令以判断你的 Kubernetes 集群环境是否支持外部负载均衡: 如果EXTERNAL-IP 的值为 <none> (或者一直是 <pending> 状态), 则说明环境则没有提供可作为入站流量网关的外部负载均衡。 在这个情况下可以用服务(Service)的 节点端口访问网关。如果是已经设置了外部负载均衡,请参考官网的设置。
[root@k8s-master istio-1.11.3]# kubectl get svc istio-ingressgateway -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.10.137.204 <pending> 15021:30786/TCP,80:31575/TCP,443:31297/TCP,31400:30450/TCP,15443:304
这里环境中没有外部负载均衡,那就选择一个节点端口来代替.
设置入站的端口:
[root@k8s-master istio-1.11.3]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') [root@k8s-master istio-1.11.3]# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
创建一个防火墙规则,放行发往 ingressgateway 的 TCP 流量。
运行下面的命令,单独放行发往 HTTP 端口或 HTTPS 端口的流量,或者都放行。
[root@k8s-master istio-1.11.3]# export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
设置环境变量 GATEWAY_URL
[root@k8s-master istio-1.11.3]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
确保 IP 地址和端口均成功的赋值给了环境变量
[root@k8s-master istio-1.11.3]# echo "$GATEWAY_URL" 192.168.186.130:31575
运行下面的命令,获取Bookinfo应用的外部访问地址
[root@k8s-master istio-1.11.3]# echo "http://$GATEWAY_URL/productpage" http://192.168.186.130:31575/productpage
把上面命令的输出地址复制粘贴到浏览器并访问,确认 Bookinfo 应用的产品页面是否可以打开,如果一切正常如下图:
如果多刷新几次页面,还会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。
Bookinfo示例部署完成,接下来继续进一步的研究。
~~~未完待续