部署Bookinfo示例程序详细过程和步骤(基于Kubernetes+Istio v1.14.3)
本示例部署一个名称为bookinfo的应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序用于显示书籍有关的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书评。该应用程序是由多种多语言编写的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖于Istio。
Bookinfo应用程序分为四个单独的微服务:
- productpage:productpage微服务调用details和reviews微服务来填充页面。
- details:details微服务包含图书的详细信息。
- reviews:reviews微服务包含书评,它还调用ratings微服务。
- ratings:ratings微服务包含书的排名信息。
其中,reviews微服务提供了3个版本:
- 版本v1不调用ratings服务。
- 版本v2调用ratings服务,并将每个等级显示为1到5个黑星。
- 版本v3调用ratings服务,并将每个等级显示为1到5个红色星号。
该应用程序的端到端体系结构如下所示
1.在k8s中部署istio网格服务
1.1 下载安装istio
curl -L https://istio.io/downloadIstio | TARGET_ARCH=x86_64 sh -
1.2 istio配置与组件
1. 配置命令及自动补全
[root@master ~]# vim /etc/profile
source <(istioctl completion bash)
[root@master istio]# cp istio-1.14.3/bin/istioctl /usr/bin/
[root@master ~]# istioctl profile list
Istio configuration profiles:
default # 默认配置档
demo
empty
external
minimal
openshift
preview
remote
1.3 安装istio
1. 使用默认配置档
[root@master istio]# istioctl install -y
2. 查看各服务状态
[root@master istio]# kubectl get all -n istio-system
NAME READY STATUS RESTARTS AGE
pod/istio-ingressgateway-744bc4f55d-4kppr 1/1 Running 0 23h
pod/istiod-846cffdbc8-jwrl5 1/1 Running 0 23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-ingressgateway LoadBalancer 10.106.77.180 <pending> 15021:32345/TCP,80:30135/TCP,443:30679/TCP 23h
service/istiod ClusterIP 10.106.78.20 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 23h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/istio-ingressgateway 1/1 1 1 23h
deployment.apps/istiod 1/1 1 1 23h
NAME DESIRED CURRENT READY AGE
replicaset.apps/istio-ingressgateway-744bc4f55d 1 1 1 23h
replicaset.apps/istiod-846cffdbc8 1 1 1 23h
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/istio-ingressgateway Deployment/istio-ingressgateway 3%/80% 1 5 1 23h
horizontalpodautoscaler.autoscaling/istiod Deployment/istiod 0%/80% 1 5 1 23h
istio-ingressgateway的service资源通过loadblancer暴露了一组端口,我们可以通过这些端口访问到istio中的应用程序,loadblancer需要依靠公有云的负载均衡器,我们没有因此处于pending状态,但是该service资源也是可用的,loadblancer不存在公有云负载均衡器默认就会使用nodeport类型进行端口映射
# istio配置信息导入yaml文件,方便重启服务
[root@master istio]# istioctl manifest generate > istio-generate.yaml
[root@master istio]# kubectl delete -f istio-generate.yaml
2. 应用部署
使用Istio运行bookinfo application示例时,无需更改应用程序本身的任何内容。这里只需要在启用Istio的环境中进行配置和运行服务,并为每个服务注入Envoy Proxy辅助工具。所有微服务都将与Envoy sidecar打包在一起,该Envoy sidecar用于拦截对服务的入站和出站。基于Istio部署的bookinfo application结构如下:
2.1 部署示例应用
创建Bookinfo微服务部署在K8S集群的命名空间并启动Sidecar自动注入。
1. 创建命名空间
[root@master bookinfo]# kubectl create ns bookinfo
namespace/bookinfo created
2. 自动注入
# 默认情况,在Istio上部署安装应用使用自动Sidecar 注入。使用以下命令将托管应用程序的名称空间的标记为 istio-injection=enabled
[root@master bookinfo]# kubectl label namespace bookinfo istio-injection=enabled
namespace/bookinfo labeled
3. 部署Bookinfo微服务项目
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
4. 查看部署的资源
[root@master istio-1.14.3]# kubectl get pod,deploy,svc -n bookinfo
NAME READY STATUS RESTARTS AGE
pod/details-v1-7f4669bdd9-zv8d5 2/2 Running 0 23h
pod/productpage-v1-5586c4d4ff-tz7q8 2/2 Running 0 23h
pod/ratings-v1-6cf6bc7c85-k48tf 2/2 Running 0 23h
pod/reviews-v1-7598cc9867-n7nlh 2/2 Running 0 23h
pod/reviews-v2-6bdd859457-4n87q 2/2 Running 0 23h
pod/reviews-v3-6c98f9d7d7-9sfwd 2/2 Running 0 23h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/details-v1 1/1 1 1 23h
deployment.apps/productpage-v1 1/1 1 1 23h
deployment.apps/ratings-v1 1/1 1 1 23h
deployment.apps/reviews-v1 1/1 1 1 23h
deployment.apps/reviews-v2 1/1 1 1 23h
deployment.apps/reviews-v3 1/1 1 1 23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/details ClusterIP 10.108.198.109 <none> 9080/TCP 23h
service/productpage ClusterIP 10.96.248.88 <none> 9080/TCP 23h
service/ratings ClusterIP 10.103.127.188 <none> 9080/TCP 23h
service/reviews ClusterIP 10.104.217.167 <none> 9080/TCP 23h
2.2 创建
现在Bookinfo服务已启动并正在运行,还需要使该应用程序可以从Kubernetes集群外部访问。
1. 创建所需的Gateway和VirtualService
[root@master istio-1.14.3]# cat samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway #控制器类型为Gateway
metadata:
name: bookinfo-gateway #定义控制器的名称
spec:
selector:
istio: ingressgateway #关联istio的ingressgateway,将代理配置信息配置在ingressgateway中
servers: #定义服务使用的端口号
- port:
number: 80 #使用80端口,名称为http,协议为http
name: http
protocol: HTTP
hosts: #允许访问的主机
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService #控制器的类型为VirtualService
metadata:
name: bookinfo #定义控制器的名称
spec:
hosts: #定义流量转发的机器
- "*"
gateways: #关联Gateway资源
- bookinfo-gateway
http: #定义路由规则
- match:
- uri: #url表示根据url做路由转发规则
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route: #定义路由转发规则
- destination:
host: productpage #将指定的5个url路径全部转发到productpage的service资源上
port:
number: 9080 #service资源的端口号
[root@master istio-1.14.3]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
2. 查看部署的资源
[root@master istio-1.14.3]# kubectl get gateways,virtualservices -n bookinfo
NAME GATEWAYS HOSTS AGE
virtualservice.networking.istio.io/bookinfo ["bookinfo-gateway"] ["*"] 106m
virtualservice.networking.istio.io/reviews ["reviews"] 104m
2.3 测试访问
访问地址为ip:istio-ingressgateway指定的对应映射端口
[root@master istio-1.14.3]# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.106.77.180 <pending> 15021:32345/TCP,80:30135/TCP,443:30679/TCP 24h
istiod ClusterIP 10.106.78.20 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 24h
80:30135/TCP。访问地址 ip:30135/productpage