安装Istio
安装IstioIstio学习重点Isito安装方法1: helm安装istio部署istio-ingressgateway把Ingress网关的服务类型从LoadBalancer改成NodePort卸载清空IstioIsito安装方法2: istioctl安装Istio安装插件将kiali的端口进行暴露列出Istio的配置文件列表卸载 Istio部署网格服务示例注入Sidecar方法1: 启用自动注入 Sidecar---推荐方法2: 手动注入Sidecar查看注入的边车容器apply部署bookinfo服务的yaml资源清单查看pod中注入的Sidecar验证bookinfo正常访问istio的ingress-gateway开放外部访问查看这个gateway资源清单文件应用ingressgateway规则查看svc/istio-ingressgateway的NodePort测试访问服务页面观察流量Istio学习重点服务网格主要是学容器网络管理和容器观察。服务网格就是使用“边车”在pod中增加了网络代理接管pod对外网络通信。Isito安装方法1: helm安装istiohttps://istio.whuanle.cn/2.deploy.html# 在 Helm 中 添加 Istio 的仓库helm repoaddistio https://istio-release.storage.googleapis.com/charts# 刷新repohelm repo update# 查看repo列表helm repo list# 为 Istio 组件创建命名空间 istio-systemkubectl create namespace istio-system# 安装 Istio CRDhelminstallistio-base istio/base-nistio-system#helm status istio-base helm get all istio-base# 验证 Istio CRD 的安装情况helmls-nistio-system# 在 Helm 中添加 Istiod 仓库。helminstallistiod istio/istiod-nistio-system--wait# 验证 Istiod 的安装情况helmls-nistio-system部署istio-ingressgatewayistio-ingressgateway Istio Ingress Gateway 类似 Kubernetes 的 Ingress 是 Istio 控制外部流量进入 Kubernetes 的入口组件istio-ingressgateway 作为一个入口点允许从服务网格外部访问服务网格内部的服务起到了类似 nginx、apisix 等入口网关的作用。Istio Ingress Gateway 的主要包括以下作用接收集群外部的流量并根据 Istio 的配置将请求路由到适当的内部服务起到网关的作用。提供负载均衡和流量控制功能包括请求路由、重试、超时、熔断等流量治理。支持 TLS 配置以便在流量进入服务网格之前进行加密给域名配置证书。支持双向 TLS 身份验证以提高服务网格的安全性服务间通讯。提供 Metrics、Tracing 和 Logging 收集以便更好地观察和监控流量需要自己安装对应的组件。# 安装 istio-ingressgatewayhelminstallistio-ingressgateway istio/gateway-nistio-system实际上 istio-ingressgateway 是作为一个 Kubernetes Service 对外提供访问服务。把Ingress网关的服务类型从LoadBalancer改成NodePort由于 Istio-ingressgateway 默认使用的是LoadBalancer需要公有云平台支撑不然会一直处于pending因此我们需要修改Service将istio-ingressway的网络类型从LoadBalancer改成NodePort以便直接通过服务器的 IP 访问。# 修改 Service 将 istio-ingressway 的网络类型从 LoadBalancer 改成 NodePortkubectl edit svc istio-ingressgateway-nistio-system找到type: LoadBalancer修改为type: NodePort。因为LoadBalancer包含了NodePort其实不修改也行。卸载清空Istio# 清空部署的 Istio 应用helm delete istio-ingressgateway-nistio-system helm delete istiod-nistio-system helm delete istio-base-nistio-system# 删除istio的nskubectl delete namespace istio-systemIsito安装方法2: istioctl安装Istio# 下载 Istiocurl-Lhttps://istio.io/downloadistio|ISTIO_VERSION1.11.2TARGET_ARCHX86_64wgethttps://github.com/istio/istio/releases/download/1.11.2/istio-1.11.2-linux.tar.gz# 解压文件tarzxvf istio-1.11.2-linux.tar.gz# 进入解压后的目录cdistio-1.11.2# 将istioctl添加到/usr/bin或则配置PATH变量,使其可以直接使用istioctl命令mvbin/istioctl /usr/bin# 安装 Istio 到 Kubernetes 集群## 使用 istioctl 工具将 Istio 安装到 Kubernetes 集群中--set profiledemo 指定使用 demo 配置文件。istioctl manifest apply--setprofiledemo# 查看 istio-system 命名空间中 Istio 的 Pod 状态kubectl get pods-nistio-system# 查看 istio-system 命名空间中 Istio 的服务kubectl get svc-nistio-system安装插件插件包含了:grafana—监控仪表盘kiali—服务网格的监控和可视化工具Prometheus—监控数据库jaeger—用于微服务架构中的请求追踪帮助识别性能瓶颈和故障点。kubectl apply-fsamples/addons将kiali的端口进行暴露暴露kiali的端口为NodePort,方便后续查看kiali的控制面板.# 使用 kubectl 命令对 Istio 系统中的 Kiali 服务进行动态修改kubectl-nistio-system patch svc kiali-p{spec:{type:NodePort,ports:[{port:2001,protocol:TCP,targetPort:2001,nodePort:3001}]}}# 参数解释kubectl-nistio-system patch svc kiali-p{ spec: { type: NodePort, # 将服务类型修改为 NodePort使服务可以通过节点的 IP 和端口访问 ports: [{ port: 2001, # 定义服务的端口为 2001 protocol: TCP, # 使用 TCP 协议 targetPort: 2001, # 将流量转发到容器的 2001 端口 nodePort: 3001 # 指定节点暴露的端口为 3001 }] } }# 查看插件是否就绪kubectl get all-nistio-system列出Istio的配置文件列表# 列出Istio的配置文件列表istioctl profile list配置文件名称功能描述minimal只安装Istio的核心组件如Pilot和Citadel。适用于快速安装和测试不包含额外的组件。remote用于在远程集群上安装Istio通常与Citadel一起使用。适用于多集群环境。sds启用安全密钥管理Secret Discovery Service用于在Istio中管理证书和密钥。适用于需要高级安全功能的环境。defaultIstio的默认配置文件包含所有核心组件如Pilot、Citadel、Ingress Gateway等。适用于大多数生产环境。demo包含所有默认组件以及额外的组件如Grafana、Kiali、Prometheus和Jaeger用于监控和可视化。适用于演示和测试。卸载 Istio# 使用 istioctl 工具生成 Istio 的配置文件并通过 kubectl 删除这些资源从而卸载 Istio。istioctl manifest generate--setprofiledemo|kubectl delete-f-部署网格服务示例注入Sidecar方法1: 启用自动注入 Sidecar—推荐为命名空间打istio-injectionenabled标签, 之后这个命名空间下部署的服务都会自动注入istio的代理服务# 创建bookinfo命名空间kubectl create ns bookinfo# 给 default 命名空间打标签启用自动注入Sidecarkubectl label ns bookinfo istio-injectionenabled方法2: 手动注入Sidecar# 手动注入 Sidecar# 使用 istioctl kube-inject 命令将 Sidecar 注入到 httpbin-nodeport.yaml 文件中然后应用到 Kubernetes 集群kubectl apply-f(istioctl kube-inject-fhttpbin-nodeport.yaml)# 或者istioctl kube-inject-fhttpbin-nodeport.yaml|kubectl apply-f-查看注入的边车容器# 查看注入的边车容器istioctl kube-inject-fhttpbin-nodeport.yaml|lessapply部署bookinfo服务的yaml资源清单# 部署bookinfo服务kubectl apply-fsamples/bookinfo/platform/kube/bookinfo.yaml-nbookinfo# 查看服务是否部署成功kubectl get all-n-nbookinfo# 查看podkubectl get pod-nbookinfo查看pod中注入的Sidecar# 查看pod中注入的 边车容器kubectl get pod details-v1-xxxx-oymal|lessannotations(注解)里发现注入了istio-init和istio-proxy两个initContainers(初始化容器)docker.io/istio/proxyv2:1.11.2是istio往pod中自动注入的边车容器验证bookinfo正常访问# 在ratings pod中的ratings容器 中执行 curl命令## -c 指定容器名kubectlexec$(kubectl get pod-lappratings-ojsonpath{.items[0].metedata.name})-cratings--curl-sproductpage:9080/productpage|grep-otitle.*/title访问业务地址NodePort访问 应用地址:istio的ingress-gateway开放外部访问查看这个gateway资源清单文件apiVersion:networking.istio.io/v1alpha3# 定义 API 版本# Gateway 定义了负载均衡器的配置用于暴露应用程序的入口。和ingress 类似,ateway 更加灵活和强大支持多种协议和更复杂的路由规则# 它主要负责处理网络层面的配置例如监听的端口、协议HTTP/HTTPS/TCP 等以及允许的主机名。kind:Gateway# 定义资源类型为 Gatewaymetadata:name:bookinfo-gateway# 定义 Gateway 的名称spec:selector:istio:ingressgateway# 使用 Istio 默认的入口网关控制器servers:# 定义服务器配置-port:number:80# 定义端口号为 80name:http# 定义端口名称为 httpprotocol:HTTP# 定义协议为 HTTPhosts:-*# 定义允许的主机名* 表示所有主机---apiVersion:networking.istio.io/v1alpha3# 定义 API 版本# VirtualService 定义了如何将流量路由到具体的服务实例。# 和nginx的localtion 类似VirtualService 定义了路由规则和负载均衡策略。kind:VirtualService# 定义资源类型为 VirtualServicemetadata:name:bookinfo# 定义 VirtualService 的名称spec:hosts:-*# 定义允许的主机名* 表示所有主机gateways:-bookinfo-gateway# 绑定到名为 bookinfo-gateway 的 Gatewayhttp:# 定义 HTTP 路由规则-match:# 定义匹配规则-uri:exact:/productpage# 精确匹配 /productpage-uri:prefix:/static# 前缀匹配 /static-uri:exact:/login# 精确匹配 /login-uri:exact:/logout# 精确匹配 /logout-uri:prefix:/api/v1/products# 前缀匹配 /api/v1/productsroute:# 定义路由目标-destination:# 路由到名为 productpage 的 svchost:productpageport:# 路由到svc的 9080 端口number:9080应用ingressgateway规则# 应用istio-insgressgateway规则kubectl apply-fsamples/bookinfo/networking/bookingo-gateway.yaml-nbookinfo查看svc/istio-ingressgateway的NodePortistio-ingressgateway和ingress一样是个svc;istio-ingressgateway的作用和ingress一样,只是比ingress规则更强大和灵活,是istio的配套网关入口.裸金属部署的istio是没有LoadBalancer的, 访问istio-ingressgateway这个svc的NodePort,也是可以完成访问的.也可以手工修改NodePort为80和443端口# 查看svc/istio-ingressgateway的NodePort端口kubectl-nistio-system get svc istio-ingressgateway# 获取名为 http2 的svc的nodePort值kubectl-nistio-system getserviceistio-ingressgateway-ojsonpath{.spec.ports[?(.namehttp2)].nodePort}测试访问服务页面# 测试应用的服务页面能否访问curlhttp://nodeIP:NodePort/productpage观察流量Istio部署完成后如何运用会在本地启动一个代理并打开浏览器访问相应的界面。打开kiali控制台,观察业务流量.