云原生 / 网关GATWAY

Kubernetes环境下Istio部署与实践指南[更新]

浅时光博客 · 11月15日 · 2021年 · 7.7w 次已读

一、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、二进制包方式

[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

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

3、环境准备说明

  • 服务器规格:
    • 建议使用内存大小为 8192 MB 和拥有 CPU 数量为 4 的机器

4、开始安装部署

  • 这里我们使用demo的配置档案,它涵盖了所有的组件,方便我们进行学习。不使用任何网关
[root@k8s-master1 ~]# cd /usr/local/istio/
[root@k8s-master1 istio]# istioctl install --set profile=demo -y

如果出现了错误可以重新执行一次,失败的原因大概率就是Pod未准备就绪

  • 通过以下命令检查istio资源是否都准备就绪
[root@k8s-master1 ~]# kubectl get all -n istio-system

注意:如果出现STATUS为RUNNING而Pod是未就绪状态,那么有可能是你服务器内存和CPU不足导致Pod无法启动

  • 检查istio的CRDAPI资源
[root@k8s-master1 ~]# kubectl get crd |grep istio
[root@k8s-master1 ~]# kubectl api-resources |grep istio

5、Istio所需端口

  • Istio边车代理(Envoy)所使用到的端口和协议
端口协议描述是否仅限Pod内部
15000TCP管理端口(命令/诊断)YES
15001TCP出站NO
15006TCP入站NO
15008TCP隧道端口(入站)NO
15020HTTPIstio代理端口,Envoy和应用程序合并的Prometheus遥测NO
15021HTTP健康检查NO
15090HTTPPrometheus遥测NO
  • Istio控制平面(istiod)使用的端口和协议
端口协议描述仅本机
15010GRPCXDS和CA服务(纯文本)NO
15012GRPCXDS和CA服务(TLS,建议生产环境使用)NO
8080HTTP调试接口(已弃用)NO
443HTTPS网络挂钩NO
15014HTTP控制平面监控NO

注意:为避免端口冲突,应用程序请勿与Enovy使用的端口冲突!

三、部署Kiali面板


  1. Istio与几种不同的遥测应用程序集成在一起。这些可以帮助您了解服务网格的结构,显示网格的拓扑结构以及分析网格的运行状况。
  2. 按照以下说明部署Kiali仪表板以及PrometheusGrafanaJaeger

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
[root@k8s-master1 addons]# vim jaeger.yaml
[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"}}'

2、访问Kiali

  • 浏览器输入K8S服务节点IP+NodePort端口号
  • 例如我这里:http://192.168.66.62:32001

3、访问Jaeger

  • 例如我这里:http://192.168.66.62:32002

四、部署示例程序


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
  • 等到所有Pod均报告READY 2/2STATUS 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>"

(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示例应用程序中服务之间的关系。它还提供了过滤器以可视化交通流。

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)通过浏览器访问

六、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

本文作者:浅时光博客
原文链接:https://www.dqzboy.com/9166.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

0 条回应

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