istio-1.6.13安装部署与使用
一、istio是什么
- 云平台令使用它们的公司受益匪浅。但不可否认的是,上云会给 DevOps 团队带来压力。为了可移植性,开发人员必须使用微服务来构建应用,同时运维人员也正在管理着极端庞大的混合云和多云的部署环境。 Istio 允许您连接、保护、控制和观察服务。
- 从较高的层面来说,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。它是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特性使您能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法
个人理解:越来越多的应用/服务,转向微服务化,当微服务达到一定规模后,微服务的治理与管控成为丞待解决的问题,istio正好提供这种微服务的治理能力,提供保护、连接和监控微服务的统一方法,降低这些部署的复杂性,并减轻开发团队的压力。
二、为什么使用 Istio?
通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理 Istio,这包括:
- 为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。
- 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
- 可插拔的策略层和配置 API,支持访问控制、速率限制和配额。
- 集群内(包括集群的入口和出口)所有流量的自动化度量、日志记录和追踪。
- 在具有强大的基于身份验证和授权的集群中实现安全的服务间通信。
Istio 为可扩展性而设计,可以满足不同的部署需求。
三、下载Istio
访问 Istio release页面下载与您操作系统对应的安装文件,我这里使用的是
istio-1.6.13-linux-amd64.tar.gz
四、安装Istio
1、准备安装环境
1)、环境信息
节点名称 | IP地址 |
---|---|
k8s-master1 | 192.168.227.131 |
k8s-node1 | 192.168.227.132 |
k8s-node2 | 192.168.227.133 |
2)、硬件环境信息
名称 | 描述 |
---|---|
办公电脑 | winxp10 |
虚拟机 | VMware® Workstation 15 Pro 15.5.1 build-15018445 |
操作系统 | CentOS Linux 7 (Core) |
linux内核 | CentOS Linux (5.4.123-1.el7.elrepo.x86_64) 7 (Core) |
CPU | 至少2核(此版本的k8s要求至少2核,否则kubeadm init会报错) |
内存 | 2G及其以上 |
3)、云原生k8s集群安装
- 关于k8s集群的安装,可以参考我的另一篇博客,傻瓜式操作,硬件准备好的情况下, 半个小时左右就可安装起来
链接: kubernetes(k8s)在centos7上快速安装指导.
2、安装部署istio
1)解压Istio安装文件
[root@k8s-master1 ~]# mkdir istioinstall
把Istio安装包上传到上面创建的安装目录istioinstall下面,并解压
[root@k8s-master1 istioinstall]# tar -zxvf istio-1.6.13-linux-amd64.tar.gz
1)配置Istio环境变量
[root@k8s-master1 istioinstall]# cd istio-1.6.13/bin/
[root@k8s-master1 bin]# pwd
/root/istioinstall/istio-1.6.13/bin
[root@k8s-master1 bin]# vi ~/.bashrc
添加如下内容后,保存退出
export PATH=/root/istioinstall/istio-1.6.13/bin:$PATH
执行如下命令,使环境变量生效
[root@k8s-master1 bin]# source ~/.bashrc
查看istio版本,测试下是否配置成功,出现如下信息,表示配置成功
[root@k8s-master1 bin]# istioctl version
client version: 1.6.13
control plane version: 1.6.13
data plane version: 1.6.13 (3 proxies)
2)开始安装Istio
- 执行如下命令,进行demo配置的安装:
istioctl manifest apply --set profile=demo
[root@k8s-master1 bin]# istioctl manifest apply --set profile=demo
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Addons installed
✔ Installation complete
- 验证安装成功
- 新增一个istio-system的namespace命名空间
[root@k8s-master1 manifests]# kubectl get ns
NAME STATUS AGE
default Active 11d
istio-system Active 8h
kube-node-lease Active 11d
kube-public Active 11d
kube-system Active 11d
prome-system Active 10d
- istio-system的namespace命名空间的Pod运行状态正常
[root@k8s-master1 manifests]# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-5dc4b4676c-d5l2r 1/1 Running 0 8h
istio-egressgateway-6c59c897b-5xzv5 1/1 Running 0 8h
istio-ingressgateway-69d64797d5-4s55m 1/1 Running 0 8h
istio-tracing-8584b4d7f9-b2dwb 1/1 Running 0 8h
istiod-67f5db7d47-k8mc6 1/1 Running 0 8h
kiali-6f457f5964-24b9w 1/1 Running 0 8h
prometheus-7c8bcc98c6-gtk27 2/2 Running 0 8h
五、Istio使用示例
1、Bookinfo示例应用介绍
Istio官方提供了Bookinfo的示例应用,
Bookinfo 应用分为四个单独的微服务:
- productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。
- details. 这个微服务中包含了书籍的信息。
- reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。
- ratings. 这个微服务中包含了由书籍评价组成的评级信息。
reviews 微服务有 3 个版本: - v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
- v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
Bookinfo的示例应用的架构如下图,
Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。
2、Istio如何管理Booinfo微服务的?
- Bookinfo示例应用,在 Istio 中运行,应用自身不需要做出任何改变。 只要简单的在 Istio 环境中,对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示:
3、安装部署Bookinfo示例应用
1)进入Istio安装目录
cd istio-1.6.13
2)创建Bookinfo示例应用运行的namespace命名空间
这一步非必须操作,也可以放到default的命名空间下运行,官方提供的安装方法是在default下面部署的。
kubectl create ns bookinfo
3)开启Istio自动注入Sidecar功能
在应用运行的namespace打上标签 istio-injection=enabled Istio 默认自动注入 Sidecar. 请为 default 命名空间打上标签 istio-injection=enabled
[root@k8s-master1 istio-1.6.13]# kubectl label namespace bookinfo istio-injection=enabled
3)安装bookinfo
[root@k8s-master1 istio-1.6.13]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
检查下是否部署成功
[root@k8s-master1 istio-1.6.13]# kubectl -n bookinfo get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
details-v1-5974b67c8-9r6dn 2/2 Running 0 5m54s 10.244.1.36 k8s-node1 <none> <none>
productpage-v1-64794f5db4-k8t2s 2/2 Running 0 5m53s 10.244.1.34 k8s-node1 <none> <none>
ratings-v1-c6cdf8d98-xgwqw 2/2 Running 0 5m53s 10.244.2.49 k8s-node2 <none> <none>
reviews-v1-7f6558b974-phbsk 2/2 Running 0 5m53s 10.244.2.47 k8s-node2 <none> <none>
reviews-v2-6cb6ccd848-zkn9w 2/2 Running 0 5m53s 10.244.2.48 k8s-node2 <none> <none>
reviews-v3-cc56b578-whcv6 2/2 Running 0 5m53s 10.244.1.35 k8s-node1 <none> <none>
创建 Ingress 网关,否则外部无法访问该服务,
[root@k8s-master1 istio-1.6.13]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
确认网关和访问地址,
[root@k8s-master1 istio-1.6.13]# kubectl get gateways.networking.istio.io -n bookinfo
NAME AGE
bookinfo-gateway 50s
[root@k8s-master1 istio-1.6.13]# kubectl get virtualservices.networking.istio.io -n bookinfo
NAME GATEWAYS HOSTS AGE
bookinfo [bookinfo-gateway] [*] 61s
[root@k8s-master1 istio-1.6.13]# kubectl get svc -n istio-system|grep istio-ingressgateway
istio-ingressgateway LoadBalancer 10.106.215.228 <pending> 15021:31689/TCP,80:32410/TCP,443:30289/TCP,31400:31641/TCP,15443:32757/TCP 3d4h
[root@k8s-master1 istio-1.6.13]#
按照官方文档的描述,当 istio-ingressgateway 服务的 EXTERNAL-IP 为 pending 时,需要通过如下方式获取访问地址和端口号,
[root@k8s-master1 istio-1.6.13]# kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}'
192.168.227.132
[root@k8s-master1 istio-1.6.13]# kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
32410
然后就可以使用浏览器访问应用页面了,
此时尝试多刷新几次页面,可以发现请求会被轮询到不同版本的 reviews 服务上,