说明
- istio版本号
1.4.2
- k8s集群版本
v1.14.8
- istio在
1.4
提供了基于istioctl命令直接部署的功能,这里使用istioctl部署istio。- 自带配置校验、和丰富的自定义配置选项
- API版本号还在Alpha阶段,
install.istio.io/v1alpha2
,请自行判断是否适用 - 部署要求
- 至少得有Kubernetes集群
- Istio-1.4版本在
1.13
、1.14
、1.15
的k8s集群上是做过测试通过的 - 最新的
1.16
没在官方文档里注明,应该也是可以用的。官方说明在此
- 这里通过官方示例熟悉一下istio的ServiceMesh特性
下载Istio项目文件
在Github上下载
在Github项目地址可以在release页面找到对应版本的部署文件下载
1 | wget -O - https://github.com/istio/istio/releases/download/1.4.2/istio-1.4.2-linux.tar.gz | tar xz |
通过Shell脚本安装
1 | curl -L https://istio.io/downloadIstio | sh - |
切换工作目录
1 | cd istio-1.4.2 |
目录内容
1 | tree ~/istio-1.4.2 -L 1 |
项目目录:
install/kubernetes
包含了部署在Kubernetes集群的YAML文件samples
包含了测试样例bin
包含了istioctl
二进制文件tools
包含了命令补全和一些其他用途的脚本
拷贝二进制文件
这里把
istioctl
拷贝到/usr/local/bin
目录
1 | cp bin/istioctl /usr/local/bin/ |
设置命令补全
- 支持bash和zsh的命令补全,官方文档在这里
- 这里只做bash的
1 | cp tools/istioctl.bash /etc/bash_completion.d/istioctl |
部署istio
istioctl
提供了内建的多个profile
用于部署istio
查看内建的profile
1 | istioctl profile list |
输出示例
1 | Istio configuration profiles: |
查看Profile的默认值
Profile对应的YAML文件存放在install/kubernetes/operator/profiles
1 | install/kubernetes/operator/profiles |
Profile之间的区别
这里直接照搬了官方文档的说明
default: enables components according to the default settings of the
IstioControlPlane
API (recommend for production deployments). You can display the default setting by running the commandistioctl profile dump
.demo: configuration designed to showcase Istio functionality with modest resource requirements. It is suitable to run the Bookinfo application and associated tasks. This is the configuration that is installed with the quick start instructions, but you can later customize the configuration to enable additional features if you wish to explore more advanced tasks.
This profile enables high levels of tracing and access logging so it is not suitable for performance tests.
minimal: the minimal set of components necessary to use Istio’s traffic management features.
sds: similar to the default profile, but also enables Istio’s SDS (secret discovery service). This profile comes with additional authentication features enabled by default (Strict Mutual TLS).
remote: used for configuring remote clusters of a multicluster mesh with a shared control plane configuration.
default | demo | minimal | sds | remote | |
---|---|---|---|---|---|
Core components | |||||
istio-citadel | X | X | X | X | |
istio-egressgateway | X | ||||
istio-galley | X | X | X | ||
istio-ingressgateway | X | X | X | ||
istio-nodeagent | X | ||||
istio-pilot | X | X | X | X | |
istio-policy | X | X | X | ||
istio-sidecar-injector | X | X | X | X | |
istio-telemetry | X | X | X | ||
Addons | |||||
grafana | X | ||||
istio-tracing | X | ||||
kiali | X | ||||
prometheus | X | X | X |
QuickStart
使用内建的profile部署
这里用demo
作为演示
1 | istioctl manifest apply --set profile=demo |
部署时指定参数
注意下!istioctl部署支持两种API,分别是
IstioControlPlane API
和Helm API
- 使用
demo
作为部署默认参数- 开启
CNI
插件,并且把CNI
插件部署到kube-system
命名空间- 修改镜像源地址为
dockerhub.azk8s.cn
istio-ingressgateway
的Service
类型设置为NodePort
- 开启控制平面安全功能
- 关闭
全局mTLS
1 | istioctl manifest apply \ |
验证istio安装情况
1 | kubectl get svc -n istio-system |
输出示例
1 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
获取Istio-IngressGateway访问方式
NodePort
1 | export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}') |
LoadBalancer
1 | export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') |
基于IstioControlPlane API部署
Istio提供的部署选项非常多,想在部署的时候做深度定制,最好基于IstioControlPlane API来实现。
官方示例模板
官方文档有点坑!不带
apiVersion
和kind
,格式也有点不对。这里根据官方部署文件里面的Profile补齐了
apiVersion
和kind
,并且魔改了一下
- 使用istio默认值部署
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用minimal Profile默认值部署
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio默认值部署,关闭telemetry功能
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio默认值部署,每个功能和安全组件安装在单独的namespace
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio默认值部署,并且配置k8s相关配置
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio默认值部署,使用values.yaml来自定义proxy组件
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio默认值部署,自定义gallery容器的配置
1 | apiVersion: install.istio.io/v1alpha2 |
- 使用istio内建的Profile来生成
这里用demo作为演示,dump出来的文件不带
apiVerion
和kind
所以没法直接用!
1 | istioctl profile dump demo |
修正版如下,快700行了,好长!
可以根据生成的模板文件来修改所需配置!
1 | apiVersion: install.istio.io/v1alpha2 |
部署istio
编辑模板文件
1 | vim istio-template.yaml |
1 | apiVersion: install.istio.io/v1alpha2 |
直接使用模板文件部署
1 | istioctl manifest deploy -f istio-template.yaml |
将模板文件转成部署文件再部署
1 | istioctl manifest generate --set profile=demo \ |
验证istio安装情况
1 | kubectl get svc -n istio-system |
体验Istio功能特性
这里跟随官方文档的Task来探索Istio的功能特性
演示使用demo默认设置部署istio
samples目录
说明
- samples目录存放istio的官方示例
目录结构
1 | tree samples/ -L 3 --dirsfirst |
1 | samples/ |
部署bookinfo
说明
- 该应用程序由四个单独的微服务组成
- productpage:productpage微服务调用details和reviews微服务来填充页面。
- details:details微服务包含图书的详细信息。
- reviews:reviews微服务包含书评,它还调用ratings微服务。
- ratings:ratings微服务包含书的排名信息。
- 其中,reviews微服务提供了3个版本
- 版本v1不调用ratings服务,因此没有五角星。
- 版本v2调用ratings服务,并将每个等级显示为1到5个黑星。
- 版本v3调用ratings服务,并将每个等级显示为1到5个红色星号。
- 服务架构图如下
- 在部署了Istio之后,服务架构图会变成这样
部署到k8s
- 切换到
istio
的项目目录 - 给命名空间
default
打label
开启istio-inject
功能【不是必须的】
1 | kubectl label namespace default istio-injection=enabled |
- 部署bookinfo
开启了自动inject功能可以直接部署
1 | kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml |
没有在第2步开启自动inject功能,可以通过istioctl命令部署
1 | kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml) |
- 确认
Pod
和Service
状态
查看Pod
1 | kubectl -n default get pod |
输出示例
1 | NAME READY STATUS RESTARTS AGE |
查看Service
1 | kubectl -n default get svc |
示例代码
1 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
5.为了确定bookinfo启动完成,使用curl命令访问bookinfo
1 | kubectl -n default exec -it $(kubectl -n default get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage |
可以看到有网页内容,网页title为
Simple Bookstore App
1 | <!DOCTYPE html> |
- 部署bookinfo-gateway
1 | kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml |
文件内容如下
1 | apiVersion: networking.istio.io/v1alpha3 |
- 检查gateway CRD
1 | kubectl -n default get gateways.networking.istio.io |
输出示例
1 | NAME AGE |
- 部署DestinationRule
- 未开启
mutual TLS
1 | kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml |
文件内容如下
1 | apiVersion: networking.istio.io/v1alpha3 |
- 开启了
mutual TLS
1 | kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml |
文件内容如下
1 | apiVersion: networking.istio.io/v1alpha3 |
通过istio-gateway访问bookinfo
- 声明环境变量
这里部署Istio时IngressGateway的Service类型为NodePort,所以直接用NodePort访问
1 | export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}') |
- 访问bookinfo
1 | curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>" |
输出示例
1 | <title>Simple Bookstore App</title> |
通过浏览器访问
http://${GATEWAY_URL}/productpage
根据
destination-rule-all.yaml
的定义,可以通过反复刷新页面访问到reviewers
的三个版本,分别是
reviewers-v1
:没五角星reviewers-v2
:黑五角星reviewers-v3
:红五角星
部署TCP-echo
说明
- 通过TCP连接访问
TCP-echo
访问获取echo数据
部署到k8s
- 切换到
istio
项目目录 - 部署YAML文件
1 | kubectl apply -f samples/tcp-echo/tcp-echo.yaml |
- 创建Pod
1 | kubectl run -i --rm --restart=Never busybox --image=busybox:1.28 -- /bin/sh |
- 测试
TCP-echo
1 | echo abcdefg | nc tcp-echo 9000 |
输出示例
1 | hello abcdefg |
- 清理现场
1 | kubectl delete -f samples/tcp-echo/tcp-echo.yaml |