三. Istio
官网
Github
- Connect 连接: 服务发现、负载均衡、重试、路由、故障注入、重定向、A/B测试、金丝雀发布
- Secure 安全方面: 认证、通道加密、访问授权
- Control 控制: 访问控制、限速、配额管理、服务计费
- Observe 观察: 链路跟踪、监控、日志搜集、可视化
(一). 概念
- Google 、 IBM 和 Lyft 于2017年5月24日发布0.1版本, 2018年7月31日晚24点,Istio 推出1.0正式版本,并表示可用于生产环境
- 部署最好选择最新但是不要太靠前的版本用于生产, 1.5之前版本和1.5之后的架构是不一样的(1.5进行了架构重构)
1. gateway
- 在
Kubernetes
环境中,Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio
服务网格中,更好的方法是使用新的配置模型,即 Istio Gateway
,Gateway 允许将 Istio
流量管理的功能应用于进入集群的流量,gateway 分为两种,分别是 Ingress-gateway
和 Egress-gateway
(二). 架构
- Istio 分为 Data plane(数据平面)和 Control plane(控制平面)
1. Data plane
- 数据平面的 Sidecar 代理可以调节和控制应用服务之间所有的网络通信,当 pod 被 istio 注入后,就被纳入到服务网格中,每个应用服务 Pod 启动时会伴随启动 2个容器
istio-init
和 istio-proxy
- istio-init: 该容器主要功能是初始化 Pod 网络和对 Pod 设置
iptable
规则,拦截我们所有的入站(inbound)和出站(outbound)流量, 然后把所有的流量导入到 istio-proxy
,让他来处理流量, 而 istio-proxy
定义了规则, 就实现了流量的控制, 设置完成后自动结束 - istio-proxy: 该容器会启动两个进程:
pilot-agent
以及 Sidecar
代理(Istio使用的是 Envoy
),pilot-agent
的作用是同步管理数据,启动并管理 Sidecar 代理服务进程,上报遥测数据,Sidecar 代理则根据管理策略完成流量管控、生成遥测数据 - Envoy: 可以理解为充当
nginx
的角色,做为proxy代理,负责接管pod的入口和出口流量, Envoy
代理是唯一与数据通信交互的Istio组件,使用 C++ 开发,性能较高,Envoy
和 Nginx
对比 (后面会对Envoy做详细介绍)
2. Control plane
1). Pilot
2). Citadel
3). Gallery
- 负责在 Istio 内验证、摄取、聚合、转换和分发配置
(三). 部署
官网
Github
Kubernetes 对应 Istio 版本
Kubernetes 版本:1.21.4
[root@lonely ~]
[root@lonely ~]
[root@lonely ~]
[root@lonely ~/istio-1.13.2]
total 28
drwxr-x--- 2 root root 22 Mar 9 2022 bin
-rw-r--r-- 1 root root 11348 Mar 9 2022 LICENSE
drwxr-xr-x 5 root root 52 Mar 9 2022 manifests
-rw-r----- 1 root root 880 Mar 9 2022 manifest.yaml
-rw-r--r-- 1 root root 5866 Mar 9 2022 README.md
drwxr-xr-x 23 root root 4096 Mar 9 2022 samples
drwxr-xr-x 3 root root 57 Mar 9 2022 tools
[root@lonely ~/istio-1.13.2]
[root@lonely ~]
Istio configuration profiles:
default
demo
empty
external
minimal
openshift
preview
remote
[root@lonely ~/istio-1.13.2/manifests]
total 36
-rw-r--r-- 1 root root 4778 Mar 9 2022 default.yaml
-rw-r--r-- 1 root root 1836 Mar 9 2022 demo.yaml
-rw-r--r-- 1 root root 317 Mar 9 2022 empty.yaml
-rw-r--r-- 1 root root 590 Mar 9 2022 external.yaml
-rw-r--r-- 1 root root 216 Mar 9 2022 minimal.yaml
-rw-r--r-- 1 root root 504 Mar 9 2022 openshift.yaml
-rw-r--r-- 1 root root 747 Mar 9 2022 preview.yaml
-rw-r--r-- 1 root root 116 Mar 9 2022 remote.yaml
[root@lonely ~]
[root@lonely ~]
1. profile
- 生产环境使用
default
模式
- demo profile 会安装 ingressgateway、egressgateway、istio-pilot 等 istio 组件,同时会安装 grafana、istio-tracing、kiali、prometheus 等外部插件
核心组件/模式 | default | demo | minimal | remote | empty | preview |
---|
说明 | 适合生产 | 仅供学习,不适合生产 | 最小化安装 | | | |
istio-egress gateway | | ? | | | | |
istio-ingress gateway | ? | ? | | | | ? |
istiod | ? | ? | ? | | | ? |
profile | 描述 |
---|
default | 根据 IstioOperator API 的默认设置启动组件, 建议用于生产部署和 Multicluster Mesh 中的 Primary Cluster |
demo | 这一配置具有适度的资源需求,旨在展示 Istio 的功能, 它适合运行 Bookinfo 应用程序和相关任务, 这是通过快速开始指导安装的配置, 此配置文件启用了高级别的追踪和访问日志,因此不适合进行性能测试, 也不适用生产 |
empty | |
external | |
minimal | 与默认配置文件相同,但只安装了控制平面组件。 它允许您使用 Separate Profile 配置控制平面和数据平面组件(例如 Gateway) |
openshift | |
preview | 预览文件包含的功能都是实验性。这是为了探索 Istio 的新功能。不确保稳定性、安全性和性能(使用风险需自负) |
remote | 配置 Multicluster Mesh 的 Remote Cluster |
2. 安装
- 默认会创建在 istio-system 名称空间,也会创建许多 CRD, 可以
kubectl get crd
查看,这些是为了创建 istio 功能的,还有 egress、ingress、istiod 的pod 和 deployment
[root@lonely ~/istio-1.13.2]
This will install the Istio 1.13.2 demo profile with ["Istio core" "Istiod" "Ingress gateways" "Egress gateways"] components into the cluster. Proceed? (y/N) y
[root@lonely ~/istio-1.13.2]
NAME READY STATUS RESTARTS AGE
istio-egressgateway-66fdd867f4-lg5pt 1/1 Running 0 4m14s
istio-ingressgateway-77968dbd74-8m45c 1/1 Running 0 4m14s
istiod-699b647f8b-xrn8b 1/1 Running 0 5m18s
[root@lonely ~/istio-1.13.2]
client version: 1.13.2
control plane version: 1.13.2
data plane version: 1.13.2 (2 proxies)
istioctl manifest generate --set profile=demo | kubectl delete -f -
(四). 实践
涉及陌生的 Resource, 后面会详细介绍,先部署起来
kubectl create ns istio
kubectl label ns istio istio-injection=enabled
cd /root/istio-1.13.2/samples/bookinfo/platform/kube
[root@lonely ~/istio-1.13.2/samples/bookinfo/platform/kube]
total 68
-rw-r--r-- 1 root root 914 Mar 9 2022 bookinfo-certificate.yaml
-rw-r--r-- 1 root root 1387 Mar 9 2022 bookinfo-db.yaml
-rw-r--r-- 1 root root 1409 Mar 9 2022 bookinfo-details-v2.yaml
-rw-r--r-- 1 root root 1519 Mar 9 2022 bookinfo-details.yaml
-rw-r--r-- 1 root root 1743 Mar 9 2022 bookinfo-ingress.yaml
-rw-r--r-- 1 root root 2009 Mar 9 2022 bookinfo-mysql.yaml
-rw-r--r-- 1 root root 988 Mar 9 2022 bookinfo-ratings-discovery.yaml
-rw-r--r-- 1 root root 1596 Mar 9 2022 bookinfo-ratings-v2-mysql-vm.yaml
-rw-r--r-- 1 root root 1825 Mar 9 2022 bookinfo-ratings-v2-mysql.yaml
-rw-r--r-- 1 root root 1927 Mar 9 2022 bookinfo-ratings-v2.yaml
-rw-r--r-- 1 root root 1519 Mar 9 2022 bookinfo-ratings.yaml
-rw-r--r-- 1 root root 1643 Mar 9 2022 bookinfo-reviews-v2.yaml
-rw-r--r-- 1 root root 7975 Mar 9 2022 bookinfo.yaml
-rwxr-xr-x 1 root root 1979 Mar 9 2022 cleanup.sh
-rw-r--r-- 1 root root 1026 Mar 9 2022 productpage-nodeport.yaml
-rw-r--r-- 1 root root 137 Mar 9 2022 README.md
kubectl apply -f bookinfo.yaml -n istio
kubectl -n istio apply -f bookinfo-details-v2.yaml
kubectl -n istio apply -f bookinfo-ratings-v2.yaml
kubectl -n istio apply -f bookinfo-ratings-v2-mysql.yaml
kubectl -n istio apply -f bookinfo-ratings-v2-mysql-vm.yaml
kubectl -n istio apply -f bookinfo-db.yaml
kubectl -n istio apply -f bookinfo-mysql.yaml
kubectl create ns vm
kubectl -n vm apply -f bookinfo-mysql.yaml
cd /root/istio-1.13.2/samples/bookinfo/networking
kubectl -n istio apply -f bookinfo-gateway.yaml
kubectl -n istio apply -f destination-rule-all.yaml
kubectl -n istio apply -f virtual-service-all-v1.yaml
[root@lonely ~/istio-1.13.2/samples/bookinfo/networking]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.110.65.133 <none> 80/TCP,443/TCP 5h47m
istio-ingressgateway LoadBalancer 10.108.206.183 <pending> 15021:31228/TCP,80:32293/TCP,443:30606/TCP,31400:32273/TCP,15443:31398/TCP 5h47m
istiod ClusterIP 10.111.202.194 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 5h48m
http://172.164.100.44:32293/productpage
1. Istio crd
CRD | 说明 |
---|
Gateway | 网关配置 |
VirtualServices | http、tcp、tls的路由、故障注入 |
DestinationRules | 目标规则、负债均衡、熔断、subset、基于地域负债均衡、tls等 |
Sidecar | 减少ingress、egress配置 |
authorizationpolicies | 权限 |
peerauthentications | 配置双向tls |
requestauthentications | 配置jwt认证 |
workloadentries | |
workloadgroups | |
serviceentries | 服务条目 |
proxyconfigs | 代理的配置、并发和环境变量 |
wasmplugins | |
envoyfilters | 直接配置Envoy的配置规则,下发到Envoy并直接生效 |
istiooperators | 用于安装的 |
telemetries | 标签、测试等 |
| |
kubectl get crd |grep istio
四. Kiali
官网
Kiali 和 Istio 对应版本
- Kiali 为 Service Mesh 提供了一个观测的可视化平台
cd /root/istio-1.13.2/samples/addons
[root@lonely ~/istio-1.13.2/samples/addons]
total 280
drwxr-xr-x 2 root root 113 Mar 9 2022 extras
-rw-r--r-- 1 root root 245578 Mar 9 2022 grafana.yaml
-rw-r--r-- 1 root root 2533 Mar 9 2022 jaeger.yaml
-rw-r--r-- 1 root root 11826 Mar 9 2022 kiali.yaml
-rw-r--r-- 1 root root 14114 Mar 9 2022 prometheus.yaml
-rw-r--r-- 1 root root 5194 Mar 9 2022 README.md
kubectl apply -f kiali.yaml
kubectl patch svc kiali -n istio-system -p '{"spec": {"type": "NodePort"}}'
[root@lonely ~/istio-1.13.2/samples/addons]
kiali NodePort 10.105.26.47 <none> 20001:32617/TCP,9090:30673/TCP
Could not fetch metrics: error in metric request_count: Post "http://prometheus.istio-system:9090/api/v1/query_range": dial tcp: lookup prometheus.istio-system on 10.96.0.10:53: no such host
kubectl apply -f prometheus.yaml
kubectl apply -f grafana.yaml
kubectl apply -f jaeger.yaml
kubectl apply -f extras/zipkin.yaml