听说过 istio 但是一直没有怎么使用过。
Istio 的核心理念是提供一个服务网格平台,用于连接、保护、控制和观测微服务应用程序。通过在现有的分布式微服务架构上增加一个透明层,Istio 旨在实现以下目标:
- 连接:简化服务之间的网络通信,同时提供负载均衡、故障恢复和端到端身份验证功能。
- 保护:提供安全通信,可以自动为服务间通信提供双向 TLS 加密认证,确保数据在传输过程中的安全性。
- 控制:通过强大的流量管理,实现灵活的路由规则、重试、故障注入以及故障切换功能,便于应对各种运维场景。
- 观测:提供有关服务间通信的详细指标、日志和追踪数据,帮助监控和诊断分布式系统的问题。
这些核心理念使得 Istio 成为一个可扩展且易于集成的服务网格解决方案,帮助开发者和运维人员更好地管理和维护复杂的微服务应用。
注入 Envoy 代理
为 Pod 注入 Istio Sidecar,您需要遵循以下步骤:
安装并部署 Istio:首先,请确保您已在 Kubernetes 集群中安装和部署了 Istio。您可以参照 Istio 的官方文档来完成这个过程:https://istio.io/latest/docs/setup/install/
打开自动 Sidecar 注入:为特定的命名空间启用自动 Sidecar 注入。运行以下命令将为您的命名空间添加
istio-injection=enabled标签(将<NAMESPACE>替换为目标命名空间):kubectl label namespace <NAMESPACE> istio-injection=enabled部署应用:现在,在启用 Sidecar 注入的命名空间中部署您的 Kubernetes 应用。Istio 会在每个 Pod 中自动注入一个 Sidecar 代理(Envoy 容器)。 例如,使用以下命令部署示例应用:
kubectl apply -f <YOUR_APPLICATION_YAML> -n <NAMESPACE>验证 Sidecar 注入:检查已部署的 Pod,以确认 Sidecar 已成功注入。运行以下命令(将
<NAMESPACE>替换为目标命名空间):kubectl get pods -n <NAMESPACE>输出结果中,如果每个 Pod 后面的数字为 “2/2” 或其他大于 1 的数字,表明 Sidecar 已成功注入。
注意:如果您需要手动注入 Sidecar,可以使用 istioctl kube-inject 命令。在部署应用之前,请运行以下命令(将 <YOUR_APPLICATION_YAML> 替换为您的应用 YAML 文件;<OUTPUT_YAML> 替换为带有注入 Sidecar 的输出 YAML 文件):
istioctl kube-inject -f <YOUR_APPLICATION_YAML> > <OUTPUT_YAML>
然后,使用 kubectl apply 部署输出 YAML 文件:
kubectl apply -f <OUTPUT_YAML> -n <NAMESPACE>
istio 的几种资源类型
Istio 提供了多种自定义资源类型 (Custom Resource Definitions, CRDs) 以实现其功能。这些资源类型分为以下几类:流量管理、安全性、策略、遥测等。下面列举了一些主要的 Istio 资源类型以及相应示例:
VirtualService(虚拟服务):用于配置流量路由规则,可以将流量导向不同的服务或子集。
示例:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-virtual-service spec: hosts: - "example.com" http: - route: - destination: host: example-service subset: v1DestinationRule(目标规则):定义访问某服务时应用的负载均衡策略、连接池设置和异常检测。
示例:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: example-service subsets: - name: v1 labels: version: v1 trafficPolicy: loadBalancer: simple: LEAST_CONNGateway(网关):配置 Ingress 和 Egress 流量的入口点,开放特定的端口、协议和主机名。
示例:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "example.com"PeerAuthentication(对等认证):配置服务间通信的双向 TLS 认证设置。
示例:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default spec: mtls: mode: STRICTAuthorizationPolicy(授权策略):定义基于特定条件的访问授权策略。
示例:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: my-authz-policy spec: selector: matchLabels: app: example-service action: ALLOW rules: - from: - source: namespaces: ["trusted-namespace"]
以上仅为 Istio 资源类型的几个示例,您可以通过查阅官方文档了解更多资源类型及用途:https://istio.io/latest/docs/reference/config/
流量走向
- 客户端发起请求,将流量导向到某个服务。
- 流量首先会被 Istio Gateway 捕获(如果请求来自外部)。Gateway 作为 Ingress 控制点,根据配置的规则,允许或拒绝特定的主机、端口和协议。
- 通过 Gateway 后,流量进入到 Ingress Envoy Sidecar。Envoy Sidecar 是一个轻量级代理,负责处理所有进出服务的流量。
- 根据 VirtualService 规则,流量将被路由至相应的目标服务。VirtualService 可以指定多种复杂的路由策略,如权重分配、版本控制等。
- 根据 DestinationRule,流量将被发送到相应的 Pod 和服务实例。DestinationRule 可以定义负载均衡策略、连接池设置和异常检测。
- 请求到达目标服务的 Envoy Sidecar。Sidecar 在转发请求给服务前,会根据 PeerAuthentication 和 AuthorizationPolicy 等安全策略执行身份验证和访问授权操作。
- 最后,请求到达目标服务,并得到响应。响应再按照类似的路径返回给客户端。
注意,以上流程描述了 Ingress 流量。Egress 流量(从集群向外部服务的请求)也遵循类似的逻辑,但是需要配置 Egress Gateway。在整个过程中,Istio 还会收集遥测数据、度量指标和日志信息,有助于监控和排查问题。