Service Mesh服务网格技术探究---VMWare+k8s集群+Istio系列:Istio示例应用Bookinfo的部署

  一、简介

  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示例部署完成,接下来继续进一步的研究。

  ~~~未完待续

 

posted @ 2021-09-29 14:54  人生就是一场修行  阅读(533)  评论(0编辑  收藏  举报