Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bookinfo linda01232003 #236

Merged
merged 13 commits into from
May 7, 2020
52 changes: 36 additions & 16 deletions practice/bookinfo.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,33 +32,39 @@ Bookinfo 应用分为四个单独的微服务, 这些服务对 Istio 并无依

## 部署应用

想要将应用接入 Istio 服务网格,需要将应用所在的命名空间进行 yaml 配置,以打入对应可自动注入 Sidecar的标签,通过重启应用来完成自动加入网格的动作。最终加入到服务网格中的 Bookinfo 应用架构如下所示:

想要将应用接入 Istio 服务网格,需要将应用所在的命名空间进行 yaml 配置,以打入对应可自动注入 Sidecar的标签,通过重启应用来完成自动加入网格的动作。最终加入到服务网格中的 Bookinfo 应用架构如下所示:

![Bookinfo Application](../images/Bookinfo-Application.png)

所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面下发对应的 XDS 协议从而使 Envoy Sidecar 为应用提供服务路由、遥测数据收集以及策略实施等功能。

## 启动应用服务

- 进入 Istio 安装目录。

- Istio 默认自动注入 Sidecar. 请为 `default` 命名空间打上标签 `istio-injection=enabled`:
首先进入 Istio 安装目录。

Istio 默认自动注入 Sidecar,为 `default` 命名空间打上标签 `istio-injection=enabled`:
```bash
$ kubectl label namespace default istio-injection=enabled
```
- 使用 `kubectl` 部署应用:
使用 `kubectl` 部署应用:

```bash
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
```

如果您在安装过程中禁用了 Sidecar 自动注入功能而选择手动注入 Sidecar,请在部署应用之前使用 `istioctl kube-inject`命令修改 `bookinfo.yaml` 文件,该命令可以从 Istio ConfigMap中动态获取网格配置。


```bash
$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
```

在实际部署中,微服务版本的启动过程需要持续一段时间,并不是同时完成的,上面的命令会启动全部的四个服务,其中也包括了 reviews 服务的三个版本(v1、v2 以及 v3)。

- 确认所有的服务和 Pod 都已经正确的定义和启动:

确认所有的服务和 Pod 都已经正确的定义和启动:

```bash
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Expand All @@ -79,36 +85,46 @@ $ kubectl get pods
reviews-v3-1813607990-8ch52 2/2 Running 0 6m
```

- 要确认 Bookinfo 应用是否正在运行,请在某个 Pod 中用 `curl` 命令对应用发送请求,例如 `ratings`:

要确认 Bookinfo 应用是否正在运行,请在某个 Pod 中用 `curl` 命令对应用发送请求,例如 `ratings`:

```bash
$ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
```

## 确定 Ingress 的 IP 和端口

现在 Bookinfo 服务启动并运行中,您需要使应用程序可以从外部访问 Kubernetes 集群,可以使用浏览器通过访问 Istio Gateway 来访问应用,通过以下操作步骤来实现。

- 为应用程序定义 Ingress 网关:

为应用程序定义 Ingress 网关:

```bash
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
```

- 确认网关创建完成:

确认网关创建完成:

```bash
$ kubectl get gateway
NAME AGE
bookinfo-gateway 32s
```

- 设置访问网关的 `INGRESS_HOST` 和 `INGRESS_PORT` 变量,例如node port模式。即当前环境未使用外部负载均衡器,需要通过 node port 访问。执行如下命令

设置访问网关的 `INGRESS_HOST` 和 `INGRESS_PORT` 变量,例如node port模式。即当前环境未使用外部负载均衡器,需要通过 node port 访问。执行如下命令

```bash
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
$ export INGRESS_HOST=127.0.0.1
$ export INGRESS_HOST=127.0.0.1
```

- 设置 `GATEWAY_URL`:

设置 `GATEWAY_URL`:

```bash
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
```
Expand All @@ -125,12 +141,16 @@ $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

结束对 Bookinfo 示例应用的体验之后,就可以使用官方提供的脚本直接清理即可:

- 删除路由规则,并销毁应用的 Pod

删除路由规则,并销毁应用的 Pod。

```bash
$ samples/bookinfo/platform/kube/cleanup.sh
```

- 确认应用已经关停

确认应用已经关停。

```bash
$ kubectl get virtualservices #-- there should be no virtual services
$ kubectl get destinationrules #-- there should be no destination rules
Expand Down