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