导语 本次采用的是 Kubernetes v1.15.0 版集群环境,Helm 版本为 v2.14.3,安装的 Istio 版本为 v1.4,官方文档说明中指出只在 K8S 的 v1.13、v1.14、v1.15 做过测试,请暂时不要将 K8S 升级至 v1.16 版
Ps:Kubernetes安装指引,请查看文档==>传送门
一、部署helm
- 安装helm客户端
从github下载helm(https://github.com/helm/helm/releases)
wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
解包,只需要包中的一个命令
tar zxf helm-v2.14.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/ &&
chmod +x /usr/local/bin/helm
设置命令自动补全
echo 'source <(helm completion bash)' >> /etc/profile
. /etc/profile
#重载环境变量
- 安装Tiller server(需要创建授权用户)
tiller-rbac.yaml #创建授权用户
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
kubectl apply -f tiller-rbac.yaml
#执行yaml文件
helm init --service-account=tiller
#Tiller server的环境初始化
helm init -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url http://mirror.azure.cn/kubernetes/charts/ --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -
检查安装
kubectl get pods -n kube-system | grep tiller
helm version
二、安装Istio
- 添加 Istio 到 Helm 仓库
helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.4.0/charts/
- 下载Istio
wget https://github.com/istio/istio/releases/download/1.4.0/istio-1.4.0-linux.tar.gz
tar -zxvf istio-1.4.0-linux.tar.gz
mv istio-1.4.0 istio
cd istio
- 创建命名空间
kubectl create namespace istio-system
- 安装 CRDs (Custom Resource Definitions)
helm template install/kubernetes/helm/istio-ini t --name istio-init --namespace istio-system | kubectl apply -f -
等待 CRDs 创建完成
kubectl -n istio-system wait --for=condition=complete job --all
输出如下
job.batch/istio-init-crd-10-1.4.0 condition met
job.batch/istio-init-crd-11-1.4.0 condition met
job.batch/istio-init-crd-14-1.4.0 condition met
- 部署 Istio 到集群
helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
kubectl get pods -n istio-system
- 为default添加istio注入(可选)
kubectl label namespace default istio-injection=enable
三、部署测试应用bookinfo
bookinfo示例部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成。 这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
- bookinfo应用的架构
-
Bookinfo 应用分为四个单独的微服务
- productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面
- details. 这个微服务中包含了书籍的详细信息。
- reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务
- ratings. 这个微服务中包含了由书籍评价组成的评级信息。
-
reviews微服务有三个版本
- v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
- v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
-
bookinfo的编排文件bookinfo.yaml(目录samples/bookinfo/platform/kube)
-
创建命名空间用以部署
kubectl create ns bookinfo-application
-
为这个命名空间大上 istio-injection=enabled 标签
kubectl label namespace bookinfo-application istio-injection=enabled
-
部署 bookinfo application
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo-application
-
暴露服务入口
如果没有外部负载均衡可以将名为 istio-ingressgateway 的 service 类型由LoadBalancer修改为 NodePort 类型,随后通过 istio-ingressgateway 所在的服务器IP地址+端口的形式访问服务。
istio 的 Gateway 允许外部流量进入 Istio 服务网,与 K8S 的 ingress 直接指定路由不同,istio 的路由规则不在 gateway 中指定,需要通过 VirtualService 单独配置。执行下面命令创建 gateway 和 virtualservice。kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo-application
-
访问页面并不断刷新
可以在浏览器打开 http://NodeIp:NodePort/productpage以浏览 Bookinfo Application 页面,如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。
http://192.168.68.150:31380/productpage
- 最终应用部署的示意图
要在 Istio 中运行这一应用,无需对应用自身做出任何改变。 您只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示(注意前面步骤中对bookinfo-application命名空间打了标签)
所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。
-