一、Istio介绍
云平台令使用它们的公司受益匪浅。但不可否认的是,上云会给 DevOps 团队带来压力。为了可移植性,开发人员必须使用微服务来构建应用,同时运维人员也正在管理着极端庞大的混合云和多云的部署环境。 Istio 允许您连接、保护、控制和观察服务。
从较高的层面来说,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。它是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特性使您能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。
以上介绍转载自Istio官网文档:https://istio.io/latest/zh/docs/concepts/what-is-istio/
二、下载安装
环境说明:K8s 1.31、Istio 1.24.0
文章更新时间:2024-11-11
1、官方命令下载
#下载最新版本,下载过程需要根据你的网络情况,需要一定的时间(有可能一直拒绝连接)
curl -L https://istio.io/downloadIstio | sh -
#下载指定的版本,例如:要下载用于x86_64体系结构的Istio 1.6.8
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh –
2、二进制包方式
- GitHub地址:https://github.com/istio/istio
[root@k8s-master1 ~]# ISTIOVER="1.24.0"
[root@k8s-master1 ~]# wget https://github.com/istio/istio/releases/download/${ISTIOVER}/istio-${ISTIOVER}-linux-amd64.tar.gz
# 解压istio二进制安装包
[root@k8s-master1 ~]# tar -zxvf istio-${ISTIOVER}-linux-amd64.tar.gz -C /usr/local/
[root@k8s-master1 ~]# cd /usr/local/
[root@k8s-master1 local]# mv istio-${ISTIOVER} istio
[root@k8s-master1 istio]# ls -al
![Kubernetes环境下Istio部署与实践指南[更新]第1张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-01.png)
bin 目录:
- 作用: 这个目录通常包含可执行的二进制文件。在 Istio 的安装包中,bin 目录一般包含 istioctl 命令行工具。
- 详情: istioctl 是 Istio 的命令行客户端,用于安装、管理和调试 Istio。您可以使用它来部署 Istio 到集群,检查配置,诊断问题等。
manifest.yaml 文件:
- 作用: 这是一个 YAML 格式的清单文件,包含了 Istio 的安装配置。
- 详情: 该文件定义了 Istio 各组件的安装选项和参数,可以用于自定义安装 Istio。例如,您可以修改该文件来启用或禁用特定的 Istio 功能。
manifests 目录:
- 作用: 该目录包含了 Istio 的 Kubernetes 资源清单文件。
- 详情: 这些清单文件(YAML 格式)用于部
文章来源(Source):浅时光博客 署 Istio 的各个组件,如 Pilot、Mixer、Ingress Gateway 等。您可以根据需要编辑这些文件,以自定义 Istio 在集群中的部署方式。
samples 目录:
- 作用: 提供示例应用程序和配置,帮助用户学习和测试 Istio 的功能。
- 详情: 该目录包含各种示例,如 Bookinfo 应用程序,这是一个用于演示 Istio 功能的微服务应用程序。通过运行这些示例,您可以了解 Istio 的流量管理、安全、观察等特性。
tools 目录:
- 作用: 包含辅助脚本和工具,帮助用户进行安装、升级或其他运维任务。
- 详情: 例如,tools 目录可能包含用于生成证书的脚本、性能测试工具、日志收集脚本等。这些工具有助于简化 Istio
文章来源(Source):浅时光博客 的管理和操作。
# 将istioctl添加到用户可执行文件目录下
[root@k8s-master1 istio]# cp bin/istioctl /usr/local/bin/
[root@k8s-master1 istio]# istioctl version
![Kubernetes环境下Istio部署与实践指南[更新]第2张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-02.png)
3、环境准备说明
- 服务器规格:
- 建议使用内存大小为
8192 MB和拥有CPU数量为 4 的机器
- 建议使用内存大小为
![Kubernetes环境下Istio部署与实践指南[更新]第3张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-03.png)
4、开始安装部署
- 这里我们使用
demo的配置档案,它涵盖了所有的组件,方便我们进行学习。不使用任何网关
[root@k8s-master1 ~]# cd /usr/local/istio/
[root@k8s-master1 istio]# istioctl install --set profile=demo -y
![Kubernetes环境下Istio部署与实践指南[更新]第4张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-04.png)
如果出现了错误可以重新执行一次,失败的原因大概率就是Pod未准备就绪
- 通过以下命令检查istio资源是否都准备就绪
[root@k8s-master1 ~]# kubectl get all -n istio-system
![Kubernetes环境下Istio部署与实践指南[更新]第5张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-05.png)
注意:如果出现STATUS为RUNNING而Pod是未就绪状态,那么有可能是你服务器内存和CPU不足导致Pod无法启动
- 检查istio的
CRD和API资源
[root@k8s-master1 ~]# kubectl get crd |grep istio
[root@k8s-master1 ~]# kubectl api-resources |grep istio
![Kubernetes环境下Istio部署与实践指南[更新]第6张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-06.png)
5、Istio所需端口
- Istio边车代理(Envoy)所使用到的端口和协议
| 端口 | 协议 | 描述 | 是否仅限Pod内部 |
| 15000 | TCP | 管理端口(命令/诊断) | YES |
| 15001 | TCP | 出站 | NO |
| 15006 | TCP | 入站 | NO |
| 15008 | TCP | 隧道端口(入站) | NO |
| 15020 | HTTP | Istio代理端口,Envoy和应用程序合并的Prometheus遥测 | NO |
| 15021 | HTTP | 健康检查 | NO |
| 15090 | HTTP | Prometheus遥测 | NO |
- Istio控制平面(istiod)使用的端口和协议
| 端口 | 协议 | 描述 | 仅本机 |
| 15010 | GRPC | XDS和CA服务(纯文本) | NO |
| 15012 | GRPC | XDS和CA服务(TLS,建议生产环境使用) | NO |
| 8080 | HTTP | 调试接口(已弃用) | NO |
| 443 | HTTPS | 网络挂钩 | NO |
| 15014 | HTTP | 控制平面监控 | NO |
注意:为避免端口冲突,应用程序请勿与Enovy使用的端口冲突!
三、部署Kiali面板
- Istio与几种不同的遥测应用程序集成在一起。这些可以帮助您了解服务网格的结构,显示网格的拓扑结构以及分析网格的运行状况。
- 按照以下说明部署Kiali仪表板以及Prometheus,Grafana和Jaeger。
1、创建secret
[root@k8s-master1 ~]# KIALI_USERNAME=$(read -p 'Kiali Username: ' uval && echo -n $uval | base64)
Kiali Username: admin # 输入 Kiali 用户名
[root@k8s-master1 ~]# KIALI_PASSPHRASE=$(read -sp 'Kiali Passphrase: ' pval && echo -n $pval | base64)
Kiali Passphrase: # 输入 Kiali 用户名
- 运行以下命令创建
secret:
[root@k8s-master1 ~]# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: $NAMESPACE
labels:
app: kiali
type: Opaque
data:
username: $KIALI_USERNAME
passphrase: $KIALI_PASSPHRASE
EOF
2、安装Kiali
- kiali和Jaeger的服务暴露用的是
LoadBalancer,我用的是本地的环境没有公网SLB使用,所以要修改为NodePort模式 - 注意端口范围:
30000-32767
[root@k8s-master1 ~]# cd /usr/local/istio/samples/addons/
[root@k8s-master1 addons]# vim kiali.yaml
![Kubernetes环境下Istio部署与实践指南[更新]第7张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-07.png)
[root@k8s-master1 addons]# vim jaeger.yaml
![Kubernetes环境下Istio部署与实践指南[更新]第8张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-08.png)
[root@k8s-master1 addons]# kubectl apply -f /usr/local/istio/samples/addons -n istio-system
# 查看Pod创建情况
[root@k8s-master1 addons]# kubectl get po -n istio-system
- 将
istio-ingressgateway改为NodePort方式
[root@k8s-master1 ~]# kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
![Kubernetes环境下Istio部署与实践指南[更新]第9张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-09.png)
2、访问Kiali
- 浏览器输入K8S服务节点IP+NodePort端口号
- 例如我这里:http://192.168.66.62:32001
![Kubernetes环境下Istio部署与实践指南[更新]第10张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-010.png)
3、访问Jaeger
- 例如我这里:http://192.168.66.62:32002
![Kubernetes环境下Istio部署与实践指南[更新]第11张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-011.png)
四、部署示例程序
1、部署Bookinfo示例应用程序
Bookinfo包括的独立服务如下:
- Ratings (评分服务)
- Details(详情服务)
- Reviews (评论服务,依赖Ratings,同时提供评论和评分)
- Productpage(产品页面,展示产品详情,评论和评分)
1.1:创建名称空间
[root@k8s-master1 ~]# kubectl create namespace istio-demo
1.2:自动注入sidecar
添加一个名称空间标签,以指示Istio在以后部署应用程序时自动注入Envoy sidecar代理,下面是针对于istio-demo这个名称空间下部署的程序会自动注入Envoy sidecar
[root@k8s-master1 ~]# kubectl label namespace istio-demo istio-injection=enabled
1.3:安装应用程序
[root@k8s-master1 ~]# cd /usr/local/istio
[root@k8s-master1 istio]# kubectl apply -n istio-demo -f samples/bookinfo/platform/kube/bookinfo.yaml
2、检查应用程序相关资源状态
- 该应用程序启动,当每个吊舱准备就绪时,Istio边车将随之部署。
[root@k8s-master1 istio]# kubectl get svc,po -n istio-demo
![Kubernetes环境下Istio部署与实践指南[更新]第12张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-012.png)
- 等到所有Pod均报告
READY 2/2和STATUS Running后,再进行下一步。这可能需要几分钟,具体取决于平台配置和网络。
3、检查所有资源都已准备就绪
- 通过检查响应中的页面标题,运行以下命令以查看应用程序是否正在集群中运行并提供HTML页面
[root@k8s-master1 istio]# kubectl exec ratings-v1-65f797b499-jfss8 -c ratings -n istio-demo -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
![Kubernetes环境下Istio部署与实践指南[更新]第13张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-013.png)
(1)程序与网关进行关联
Bookinfo应用程序已部署,但无法从外部访问。为了使其可访问,需要创建一个Istio Ingress Gateway,该网关将路径映射到网格边缘处的路线。
[root@k8s-master1 istio]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 确保网关创建完成
[root@k8s-master1 istio]# kubectl get gateway -n istio-demo
NAME AGE
bookinfo-gateway 2m13s
# 检查网关资源信息
[root@k8s-master1 istio]# kubectl get service istio-ingressgateway -n istio-system
(2)确保配置没有问题
[root@k8s-master1 istio-1.11.3]# istioctl analyze -n istio-demo
✔ No validation issues found when analyzing namespace: istio-demo.
(3)通过面板查看服务关系
- 在左侧导航菜单中,选择图形,然后在名称空间下拉列表中,选择
istio-demo。 - Kiali仪表板显示了网格的概述以及
Bookinfo示例应用程序中服务之间的关系。它还提供了过滤器以可视化交通流。
![Kubernetes环境下Istio部署与实践指南[更新]第14张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-014.png)
5、验证外部访问
- 通过使用浏览器查看Bookinfo产品页面,确认可以从外部访问Bookinfo应用程序
(1)设置Ingress端口
[root@k8s-master1 istio]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
[root@k8s-master1 istio]# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
[root@k8s-master1 istio]# export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')
[root@k8s-master1 istio]# export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
# 可以得到INGRESS端口和地址如下:
[root@k8s-master1 istio]# echo $INGRESS_HOST
192.168.66.65
[root@k8s-master1 istio]# echo $INGRESS_PORT
30670
(2)配置GATWAY_URL
[root@k8s-master1 istio-1.11.3]# export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
(3)获取程序外部地址
[root@k8s-master1 istio-1.11.3]# echo "http://$GATEWAY_URL/productpage"
http://192.168.66.65:30670/productpage
(4)通过浏览器访问
![Kubernetes环境下Istio部署与实践指南[更新]第15张-浅时光博客](https://www.dqzboy.com/wp-content/uploads/2021/11/istio-015.png)
六、Istio卸载操作
- 卸载addons
$ cd /usr/local/istio
$ kubectl delete -f samples/addons
- 卸载Bookinfo
$ cd /usr/local/istio
$ kubectl delete -n istio-demo -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl delete -n istio-demo -f samples/bookinfo/networking/bookinfo-gateway.yaml
- 卸载Istio
$ istioctl manifest generate --set profile=demo | kubectl delete --ignore-not-found=true -f -
- 删除namespace istio-system
$ kubectl delete namespace istio-system
- 取消对istio-demo进行Istio自动注入
$ kubectl label namespace istio-demo istio-injection-
- 删除namespace istio-demo
$ kubectl delete namespace istio-demo

必须 注册 为本站用户, 登录 后才可以发表评论!