云上部署ChatGPT 云上部署bookinfo_istio

云上部署ChatGPT 云上部署bookinfo_istio_02

部署Bookinfo示例程序详细过程和步骤(基于Kubernetes+Istio v1.14.3)

本示例部署一个名称为bookinfo的应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序用于显示书籍有关的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书评。该应用程序是由多种多语言编写的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖于Istio。

Bookinfo应用程序分为四个单独的微服务:

  1. productpage:productpage微服务调用details和reviews微服务来填充页面。
  2. details:details微服务包含图书的详细信息。
  3. reviews:reviews微服务包含书评,它还调用ratings微服务。
  4. ratings:ratings微服务包含书的排名信息。

其中,reviews微服务提供了3个版本:

  1. 版本v1不调用ratings服务。
  2. 版本v2调用ratings服务,并将每个等级显示为1到5个黑星。
  3. 版本v3调用ratings服务,并将每个等级显示为1到5个红色星号。

该应用程序的端到端体系结构如下所示

云上部署ChatGPT 云上部署bookinfo_TCP_03

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

云上部署ChatGPT 云上部署bookinfo_运维_04

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结构如下:

云上部署ChatGPT 云上部署bookinfo_TCP_05

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

云上部署ChatGPT 云上部署bookinfo_istio_06