Istio 是什么
Istio 是一个开源服务网格,可透明地分层到现有的分布式应用程序中。 Istio 强大的功能提供了一种统一且更高效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的途径,只需很少或无需更改服务代码。
它为您提供:
- 在集群中通过双向 TLS 加密、基于强身份的认证和授权来保护服务到服务通信
- 对 HTTP、gRPC、WebSocket 和 TCP 流量进行自动负载均衡
- 通过丰富的路由规则、重试、故障转移和故障注入来精细控制流量行为
- 支持访问控制、速率限制和配额的可插拔策略层和配置 API
- 集群内所有流量(包括集群入口和出口)的自动指标、日志和追踪
Istio 将网格分为数据平面和控制平面:数据平面是注入到每个工作负载旁的 Envoy sidecar(或原生 init 容器形式的 sidecar);控制平面 istiod 是把早期的 Pilot (xDS)、Citadel (证书)、Galley (配置校验) 合并而成的单一二进制。istiod 监听 Kubernetes 与 Istio 资源,通过 xDS API 向 Envoy 推送配置。
自动注入由 MutatingAdmissionWebhook 完成:当 Pod 在带 istio-injection=enabled 标签的 namespace 中创建时,webhook 会改写 Pod spec,加入 istio-proxy 容器。已存在的 Pod 不会被修改——标签只对之后创建的 Pod 生效。
检查现有控制面
检查当前集群是否已安装 Istio,如果已安装控制平面,且其版本与下面安装的 CLI 兼容,就复用它并跳过步骤 4——不要安装第二套网格。如果 istio-system 不存在,继续往下。
1
2
3
4kubectl config current-context
kubectl get namespace istio-system
kubectl get pods -n istio-system -o wide
istioctl version
安装版本匹配的 istioctl CLI
当前 kubernetes 集群版本为 1.36.5
1
2
3
4
5
6
7
8# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster01 Ready control-plane 30h v1.36.5
k8smaster02 Ready control-plane 30h v1.36.5
k8smaster03 Ready control-plane 29h v1.36.5
k8snode01 Ready <none> 29h v1.36.5
k8snode02 Ready <none> 29h v1.36.5
k8snode03 Ready <none> 29h v1.36.5从官方安装文档中选择一个与当前 Kubernetes 版本兼容、且仍在支持期内的 Istio release,这里选择 1.31.2:
1
2
3
4
5
6
7
8
9
10
11# 配置 Istio 版本变量
export ISTIO_VERSION='1.31.2'
# 下载 Istio 安装包
curl -fsSL https://istio.io/downloadIstio | ISTIO_VERSION="$ISTIO_VERSION" sh -
# 拷贝 istioctl 到 /usr/local/bin/ 目录安装 istioctl
cp istio-1.31.2/bin/istioctl /usr/local/bin/
# 查看版本
istioctl version
部署 Istio
运行安装前检查
precheck仍是实验性命令(带 x 前缀),但能在安装前发现常见问题,例如 Kubernetes 版本不受支持或权限不足。1
istioctl x precheck
安装 demo profile
安装 profile 决定打包哪些组件:minimal 只装 istiod,default 增加 ingress/egress gateway,demo 再打包适合一次性学习集群的全部组件。生产环境绝不能使用 demo。
安装 demo 模式
1
istioctl install --set profile=demo -y
以上命令默认使用的是国外的 Docker Hub镜像仓库,未配置代理的话会拉不到镜像,可以同步镜像到国内阿里云镜像仓库,然后使用以下命令安装
1
2
3
4
5
6
7
8
9# 查看当前版本需要使用到的镜像以及版本
istioctl manifest generate |grep image:
# 安装 Istio
istioctl install -y \
--set profile=demo \
--set hub=registry.cn-hangzhou.aliyuncs.com/59izt-publics \
--set tag=1.31.2 \
--set values.global.proxy.image=proxyv2或者给 Containerd 配置代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 创建 systemd drop-in 配置
mkdir -p /etc/systemd/system/containerd.service.d
# 创建 /etc/systemd/system/containerd.service.d/http-proxy.conf 文件
cat > /etc/systemd/system/containerd.service.d/http-proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://<代理IP>:<端口>"
Environment="HTTPS_PROXY=http://<代理IP>:<端口>"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"
EOF
# 重载并重启 containerd
systemctl daemon-reload && systemctl restart containerd
# 验证是否生效,确认输出里有你刚才配的 HTTP_PROXY、HTTPS_PROXY。
systemctl show --property=Environment containerd
# 测试拉取镜像
ctr -n k8s.io images pull docker.io/istio/pilot:1.31.2
ctr -n k8s.io images pull docker.io/istio/proxyv2:1.31.2代理配置要注意几点:
- 代理地址要换成你实际可用的代理。
- HTTPS_PROXY 也要配,因为 Docker Hub 是 HTTPS。
- NO_PROXY 里要把集群内网、K8s Service 域名段、本地地址都排除掉,避免内部流量被代理打断。
查看安装状态
1
2# 查看 Pod 状态
kubectl get pods -n istio-system创建 bookinfo namespace 并开启注入
1
2
3
4
5
6
7
8# 创建命名空间
kubectl create namespace bookinfo
# 给命名空间添加 istio-injection=enabled 标签
kubectl label namespace bookinfo istio-injection=enabled
# 查看命名空间标签
kubectl get namespace bookinfo --show-labels校验配置
1
istioctl analyze -n bookinfo
空 namespace 应当没有任何校验问题。istioctl analyze 会按最佳实践持续检查你的 Istio 资源
部署 Bookinfo 应用到集群
把 Bookinfo 示例部署到已开启注入的 bookinfo namespace,验证每个 Pod 都运行两个容器(应用 + istio-proxy),此示例部署了一个由四个独立微服务组成的示例应用程序,用于演示各种 Istio 功能。
Bookinfo 应用程序分为四个单独的微服务:
- productpage。 productpage 微服务调用 details 和 reviews 微服务来填充页面。
- details。 details 微服务包含书籍信息。
- reviews。 reviews 微服务包含书籍评论。它还调用 ratings 微服务。
- ratings。 ratings 微服务包含随书评论一起提供的书籍排名信息。
评论微服务有 3 个版本:
- 版本 v1 不调用评分服务。
- 版本 v2 调用评分服务,并将每个评分显示为 1 到 5 颗黑星。
- 版本 v3 调用评分服务,并将每个评分显示为 1 到 5 颗红星。
部署 Gateway API
Istio 支持 Kubernetes Gateway API,并计划在未来使其成为流量管理的默认 API。请注意,Kubernetes Gateway API CRD 在大多数 Kubernetes 集群上默认不安装,因此请确保在使用 Gateway API 之前安装它们。
1 | kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \ |
部署应用
进入到下载的 istio-1.31.2 目录,bookinfo 的资源清单文件在
samples/bookinfo/platform/kube/目录1
cd istio-1.31.2
执行以下命令部署 bookinfo 应用
1
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
确保所有的 Pod 和 services 正常
1
2
3
4
5
6
7
8
9
10
11
12
13
14# kubectl get pods,svc -n bookinfo
NAME READY STATUS RESTARTS AGE
pod/details-v1-59c46d86df-v4tgm 2/2 Running 0 67m
pod/productpage-v1-755568db9f-jx74q 2/2 Running 0 67m
pod/ratings-v1-6f9948c865-5lqtx 2/2 Running 0 67m
pod/reviews-v1-7c5b5d94f5-kx9jd 2/2 Running 0 67m
pod/reviews-v2-7c8587bb49-dpfnr 2/2 Running 0 67m
pod/reviews-v3-68dbf754c9-2rh7k 2/2 Running 0 67m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/details ClusterIP 10.96.33.127 <none> 9080/TCP 78m
service/productpage ClusterIP 10.96.150.69 <none> 9080/TCP 78m
service/ratings ClusterIP 10.96.169.231 <none> 9080/TCP 78m
service/reviews ClusterIP 10.96.125.7 <none> 9080/TCP 78m要确认 Bookinfo 应用程序正在运行,请从某个 pod(例如 ratings)通过 curl 命令向其发送请求
1
2
3kubectl exec -n bookinfo "$(kubectl get pod -n bookinfo -l app=ratings -o jsonpath='{.items[0].metadata.name}')" \
-c ratings \
-- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
暴露服务
现在 Bookinfo 服务已启动并运行,您需要使应用程序可以从 Kubernetes 集群外部访问,例如从浏览器。网关用于此目的。
为 Bookinfo 应用程序创建一个网关
1
2
3# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created确认网关已创建
1
2
3# kubectl get gateway.networking.istio.io -n bookinfo
NAME AGE
bookinfo-gateway 4m11s
