基于阿里云 ASK 的 Istio 微服务应用部署初探

目前 Kubernetes 已经成为业界容器编排系统的事实标准,基于 Kubernetes 的云原生应用生态(Helm, Istio, Knative, Kubeflow, Spark on Kubernetes 等)更是让 Kubernetes 成为云操作系统。在这样的背景下,Serverless 容器成为现有 Container as a Service 的进化方向之一,一方面通过 Serverless 方式根本性解决了 Kubernetes 自身的管理复杂性,让用户无需受困于 Kubernetes 集群容量规划、安全维护、故障诊断;另一方面也进一步释放了云计算的能力,将安全、可用性、可伸缩性等需求由基础设施实现。

ASK 作为阿里云 Serverless Kubernetes 平台[1],不仅有免运维、秒级弹性、超大 Pod 容量、弹性预测等重磅能力,更重要的是它依然是一个标准 Kubernetes 平台。

本文会通过在 ASK 上试用 Istio 部署微服务应用的方式,来验证 ASK 对标准 Kubernetes 的兼容性。Istio 作为 Service Mesh(服务网格)的领导解决方案,一方面本身足够复杂具有代表性,另一方面它也代表了云原生时代微服务架构的趋势具有参考意义。

现在就让我们开始吧!

创建集群

试用 Istio 前,需要准备一个 ASK 集群。登录阿里云控制台,选择产品与服务 > 容器服务 Kubernetes 版,在左侧边栏选择集群进入集群列表页面。点击右上角创建集群开始创建集群,配置集群参数如下:

  • 集群名称:hello-istio
  • 集群规格:Pro 版
  • 地域:美国(硅谷)
  • 付费类型:按量付费
  • Kubernetes 版本:1.20.11-aliyun.1
  • 专有网络:自动创建
  • Service CIDR:172.21.0.0/20
  • API Server 访问:标准型I(slb.s2.small)
  • 使用 EIP 暴露 API Server:是
  • 时区:Aisa/Shanghai(UTC+08:00)
  • 服务发现:CoreDNS
  • 使用日志服务:创建新 Project

确认配置后点击创建集群进入等待集群创建完成。Istio 依赖 DNS 服务,这里选择创建集群时默认安装 CoreDNS 组件。

集群创建完成后,进入集群列表 > hello-istio > 详情 > 集群信息 > 连接信息页面,复制公网访问内容到本地/tmp/kube/config 文件,并通过如下命令配置好 kubelet:

$ export KUBECONFIG=/tmp/kube/config

试用 Istio

kubectl 配置好后就可以开始在集群安装和试用 Istio。

下载 Istio

进入 Istio 发布页面[2]下载针对操作系统的安装文件,也可以通过如下命令下载并提取最新版本:

$ curl -L https://istio.io/downloadIstio | sh -

因为我本机~/bin 目录已加入 PATH,这里我将提取的 Istio 目录复制~/bin 目录,并建好软链接。

$ cp istio-1.13.3 ~/bin
$ cd ~/bin
$ ln -s istio-1.13.3/bin/istioctl
$ ls -al ~/bin/
total 28
drwxr-xr-x   5 feilong.wfl staff   160  5  4 22:40 ./
drwxr-xr-x+ 95 feilong.wfl staff  3040  5  8 22:30 ../
drwxr-x---   9 feilong.wfl staff   288  4 15 00:48 istio-1.13.3/
lrwxr-xr-x   1 feilong.wfl staff    25  5  4 22:40 istioctl -> istio-1.13.3/bin/istioctl*

如果 istioctl --help 命令输出正常,则 istioctl 已正确配置。

安装 Istio

  1. 本次安装采用 demo profile[3],它包含了一组专为测试准备的功能集合,另外还有用户生产或性能测试的配置组合。
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
  1. 给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

部署示例应用

  1. 部署 Bookinfo 示例应用[4]
$ kubectl apply -f ~/bin/istio-1.13.3/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
  1. 检查 Pod 已就绪:
$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79f774bdb9-t2jhq       2/2     Running   0          2m54s
productpage-v1-6b746f74dc-qc9lg   2/2     Running   0          2m46s
ratings-v1-b6994bb9-tmbh6         2/2     Running   0          2m51s
reviews-v1-545db77b95-xdhp4       2/2     Running   0          2m49s
reviews-v2-7bf8c9648f-4gn6f       2/2     Running   0          2m48s
reviews-v3-84779c7bbc-jfndj       2/2     Running   0          2m48s

要等待并确保所有的 Pod 达到此状态:就绪状态(READY)的值为 2/2 、状态(STATUS)的值为 Running。基于平台的不同,这个操作过程可能会花费几分钟的时间。

  1. 检查 Service 已就绪:
$ kubectl get services
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   172.21.11.168   <none>        9080/TCP   59s
kubernetes    ClusterIP   172.21.0.1      <none>        443/TCP    33m
productpage   ClusterIP   172.21.0.124    <none>        9080/TCP   51s
ratings       ClusterIP   172.21.9.7      <none>        9080/TCP   57s
reviews       ClusterIP   172.21.13.223   <none>        9080/TCP   55s
  1. 确保网页服务正常。如果命令返回页面标题,则应用已在集群中运行。
$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

对外开放服务

现在,BookInfo 应用已经部署,但还不能被外界访问。 要开放访问,需要创建 Istio 入站网关(Ingress Gateway), 它会把一个路径路由到网格内的服务。

  1. 把应用关联到 Istio 网关:
$ kubectl apply -f ~/bin/istio-1.13.3/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

2. 确保配置文件没有问题:

$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.

确定入站 IP 和端口

使用如下命令为访问网关设置 INGRESS_HOST 和 INGRESS_PORT 两个变量:

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')

设置变量 GATEWAY_URL,并确保 IP 地址和端口均成功的赋值给了该变量:

$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ echo "$GATEWAY_URL"
47.88.21.82:80

验证外部访问

运行下面命令,获取 Bookinfo 应用的外部访问地址:

$ echo "http://$GATEWAY_URL/productpage"
http://47.88.21.82:80/productpage

复制上面命令的输出地址到浏览器并访问,确认 Bookinfo 已经实现了外部访问。刷新页面,发现 Book Reviews 的显示样式会不断变化。

查看仪表盘

仪表盘能帮助了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。

  1. 首先安装 Kiali 和其他插件,等待部署完成。
$ kubectl apply -f ~/bin/istio-1.13.3/samples/addons
$ kubectl rollout status deployment/kiali -n istio-system
Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
deployment "kiali" successfully rolled out
  1. 访问 Kiali 仪表板。
$ istioctl dashboard kiali

3. 在左侧的导航菜单,选择 Graph,然后在 Namespace 下拉列表中,选择 default

Kiali 仪表板展示了网格的概览、以及 Bookinfo 示例应用的各个服务之间的关系。 它还提供过滤器来可视化流量的流动。

添加默认目标规则

使用 Istio 控制 Bookinfo 版本路由前,需要先在目标规则[5]中定义好可用的版本。运行以下命令为 Bookinfo 服务创建默认的目标规则:

$ kubectl apply -f ~/bin/istio-1.13.3/samples/bookinfo/networking/destination-rule-all.yaml
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created

等待几秒钟,目标规则生效。您可以使用如下命令查看目标规则:

$ kubectl get destinationrules
NAME          HOST          AGE
details       details       30s
productpage   productpage   32s
ratings       ratings       31s
reviews       reviews       32s

路由所有流量到 v1 版本

运行以下命令创建 Virtual Service 将所有流量路由到微服务的 v1 版本:

$ kubectl apply -f ~/bin/istio-1.13.3/samples/bookinfo/networking/virtual-service-all-v1.yaml
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created

您可以通过再次刷新 Bookinfo 应用程序的/productpage 页面测试新配置。请注意,无论您刷新多少次,页面的评论部分都不会显示评级星标。这是因为当前已将 Istio 配置为评论服务的所有流量路由到版本 reviews:v1,而此版本的服务不访问星级评分服务。

基于用户身份的路由

接下来将更改路由配置,实现将来自特定用户的所有流量路由到特定的服务版本。示例中来自名为 Jason 用户的所有流量将被路由到服务 review:v2。

Istio 对用户身份没有任何特殊的内置机制。本例中,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到效果。

  1. 运行以下命令以启用基于用户的路由:
$ kubectl apply -f ~/bin/istio-1.13.3/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
virtualservice.networking.istio.io/reviews created
  1. 确保规则已创建:
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"reviews","namespace":"default"},"spec":{"hosts":["reviews"],"http":[{"match":[{"headers":{"end-user":{"exact":"jason"}}}],"route":[{"destination":{"host":"reviews","subset":"v2"}}]},{"route":[{"destination":{"host":"reviews","subset":"v1"}}]}]}}creationTimestamp: "2022-05-15T16:05:55Z"generation: 1name: reviewsnamespace: defaultresourceVersion: "1984849"uid: f3bd3dcb-d83c-4a75-9511-1fc9308ca05b
spec:hosts:- reviewshttp:- match:- headers:end-user:exact: jasonroute:- destination:host: reviewssubset: v2- route:- destination:host: reviewssubset: v1
  1. 在 Bookinfo 应用程序的/productpage 上,以用户 jason 身份登录。刷新浏览器,看到每个评论旁边显示星级评分。

  1. 以其他用户身份登录,刷新浏览器。发现星级评分消失了。

原理和限制

数据平面,Istio 通过向 Pod 注入的 Sidecar 代理(istio-proxy)来负责协调和控制微服务之前的所有网络通信。为了让 Sidecar 代理(istio-proxy)劫持业务容器流量,Istio 需要向 Pod 所在网络下发 iptables 规则。常规安装模式下,iptables 规则下发是由 Istio 向 Pod 注入的初始化容器 istio-init 完成。向 Pod 网络下发 iptables 规则需要容器可以使用 NET_ADMIN 和 NET_RAW 两个高权限的能力(Capabilities)。ASK 集群中这两个高权限能力受 ASK Pod Security Policy[6]和 ECI Container Security Policy[7]的影响。

ASK Pod Security Policy 的 CAPS 为 *,表示没有限制。

$ kubectl get psp
NAME             PRIV   CAPS   SELINUX    RUNASUSER   FSGROUP    SUPGROUP   READONLYROOTFS   VOLUMES
ack.privileged   true   *      RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            *

ECI Container Security Policy 允许通过容器安全上下文配置即可。Istio 中 Pod 注入模板文件
~/bin/istio-1.13.3/manifests/charts/istio-control/istio-discovery/files/injection-template.yaml 包含如下代码:不启用 Istio CNI 插件[8]将添加 NET_ADMIN 和 NET_RAW 两个高权限能力:

securityContext:allowPrivilegeEscalation: {{ .Values.global.proxy.privileged }}privileged: {{ .Values.global.proxy.privileged }}capabilities:
{{- if not .Values.istio_cni.enabled }}add:- NET_ADMIN- NET_RAW
{{- end }}drop:- ALL

所以从原理上分析当前 ASK 集群使用 Istio 没有兼容性问题。

总结

本次在 ASK 上试用 Istio 这类高复杂度的软件,未发现兼容性问题。又从原理上正面分析论证了产生兼容性问题的可能性较低。因此,ASK 对原生 Kubernetes 还是有着极好的兼容性。后续将在 ASK 集群上深入探索 Istio 其他功能,以进一步验证 ASK 对原生 Kubernetes 的兼容性。

参考链接:

[1] 阿里云 Serverless Kubernetes

https://help.aliyun.com/document_detail/127525.html

[2] Istio 发布页面

https://github.com/istio/istio/releases/tag/1.13.3

[3] demo profile

https://istio.io/latest/docs/setup/additional-setup/config-profiles/

[4] Bookinfo 示例应用

https://istio.io/latest/zh/docs/examples/bookinfo/

[5] 目标规则


https://istio.io/latest/docs/concepts/traffic-management/#destination-rules)中定义好可用的版本

[6] ASK Pod Security Policy

https://help.aliyun.com/document_detail/165047.html

[7] ECI Container Security Policy

https://help.aliyun.com/document_detail/163023.html

[8] Istio CNI 插件

https://istio.io/latest/docs/setup/additional-setup/cni/

作者:王飞龙(不物)

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZooKeeper 在阿里巴巴的服务形态演进

Apache ZooKeeper 在阿里巴巴经历了开源自用、深度优化、反哺社区、开发企业版服务云上客户的演进过程&#xff0c;为了厘清本文脉络&#xff0c;我们对演进过程中提到的关键名词做以下定义。 Apache ZooKeeper&#xff1a;提供分布式协调服务如分布式锁、分布式队列等&#x…

阿里巴巴张勇:继续在全球舞台上提升技术先进性

在11月3日开幕的2022云栖大会上&#xff0c;阿里巴巴董事会主席兼首席执行官张勇表示&#xff0c;科技是阿里巴巴从过去走到现在&#xff0c;并且更好走向未来的基石。阿里对技术先进性的追求始终不变。先进性要在竞争中获得、在你追我赶中获得&#xff0c;更先进的技术是为了承…

K8s 网关选型初判:Nginx 还是 Envoy?

为了避免混淆&#xff0c;我们先对一些关键定义做一些厘清&#xff1a; 传统网关&#xff1a;未作容器化改造&#xff0c;未启用 K8s&#xff0c;通过流量网关与业务网关两层网关来构建&#xff0c;流量网关提供全局性的、与后端业务无关的策略配置&#xff0c;例如 Tengine 就…

从原理到操作,让你在 Apache APISIX 中代理 Dubbo3 服务更便捷

本文为大家介绍了如何借助 Apache APISIX 实现 Dubbo Service 的代理&#xff0c;通过引入 dubbo-proxy 插件便可为 Dubbo 框架的后端系统构建更简单更高效的流量链路。 背景 Apache Dubbo 是由阿里巴巴开源并捐赠给 Apache 的微服务开发框架&#xff0c;它提供了 RPC 通信与…

阿里云数据库走向“四化”:深度融合自研软硬件体系,AllinServerless

11月3日&#xff0c;在2022云栖大会上&#xff0c;阿里云宣布PolarDB、AnalyticDB(简称ADB)、RDS、Lindorm等核心数据库产品已与自研CPU、CIPU、飞天操作系统进行深度融合创新&#xff0c;并全面Serverless化&#xff0c;对外更好地提供一站式数据管理与服务。 阿里云智能数据库…

RocketMQ 5.0: 存储计算分离新思路

Apache RocketMQ 自 2012 年开源以来&#xff0c;因其架构简单&#xff0c;业务功能丰富&#xff0c;具备极强的可扩展性等特点被广泛采用。RocketMQ 在阿里巴巴集团内部有着数千台的集群规模&#xff0c;每天十万亿消息的规模。在阿里云上&#xff0c;RocketMQ 的商业化产品也…

谈谈技术能力

技术人成长的悖论 在程序员界有一个悖论持续在困惑着很多技术人&#xff1a;在写代码的人的困惑是一直写代码是不是会丧失竞争力&#xff0c;会不会被后面年轻的更能加班写代码的人汰换。典型代表就是工作 5 年左右的核心技术骨干&#xff0c;此时正处于编码正嗨但也开始着手规…

阿里云ODPS升级为一体化大数据平台 满足用户多元化数据计算需求

11月3日&#xff0c;2022云栖大会上&#xff0c;阿里巴巴集团副总裁、阿里云计算平台事业部负责人贾扬清表示&#xff0c;为满足用户多元化数据计算需求&#xff0c;阿里云ODPS升级为一体化大数据平台。 升级后的ODPS支持大规模批量计算、实时分析等服务&#xff0c;提供实时流…

上篇:技术架构的设计方法

上周我写的一篇文章《谈谈技术能力》引起了大家的关注&#xff0c;好多读者的评论“以写代想、以想促真、以讲验真”&#xff0c;大家的感受很深刻&#xff0c;基于上次的文章&#xff0c;这篇文章我其实更想跟大家聊聊一些常用的思考方法&#xff0c;思考问题的方式对了&#…

下篇:技术 Leader 的思考方式

技术 Leader 是一个对综合素质要求非常高的岗位&#xff0c;不仅要有解具体技术问题的架构能力&#xff0c;还要具备团队管理的能力&#xff0c;更需要引领方向带领团队/平台穿越迷茫进阶到下一个境界的能力。所以通常来说技术 Leader 的技能是虚实结合的居多&#xff0c;繁杂的…

阿里进入“全面云原生深度用云”阶段 PaaS支出占用云总成本43%

11月4日&#xff0c;2022杭州云栖大会《互联网产业与飞天技术创新》峰会上&#xff0c;阿里技术风险与效能负责人张瓅玶表示&#xff0c;经过持续多年上云用云&#xff0c;今年阿里巴巴集团在PaaS&#xff08;包括大数据、机器学习平台、数据库中间件等&#xff09;支持的业务形…

Apache ShenYu 网关正式支持 Dubbo3 服务代理

Apache Dubbo 在去年发布了下一代的云原生微服务版本 Dubbo3&#xff0c;目前最新版本 Dubbo3 已在阿里经济体完成对 HSF2 框架的全面替换与升级&#xff0c;Dubbo3 目前已成为社区企业实践推荐版本。Apache Shenyu 网关在这个背景下发布了对 Dubbo3 服务代理的支持。 本文介绍…

支持中英文自由说、访谈自动整理,新一代会议AI助理“听悟”升级发布

“你只需专注会议&#xff0c;其余一切交给听悟。”11月4日&#xff0c;2022杭州云栖大会&#xff0c;阿里巴巴达摩院研发的智能产品“听悟”进阶版亮相大会现场。仅需一台个人电脑&#xff0c;观众和媒体记者们即可体验全面集成达摩院语音语言智能的最新AI助理&#xff0c;感受…

成本节省 50%,9人团队使用函数计算开发 wolai 在线文档应用

我们的日常工作场景几乎离不开“云文档”。目前&#xff0c;人们对于文档的需求再不仅仅是简单的记录&#xff0c;而扩展到办公协同、信息组织、知识分享等。在国内众多在线文档中&#xff0c;wolai 因为功能新、迭代快、流畅的异地协同体验、高效的信息组织方式以及“信息块”…

阿里云“汽车云”亮相云栖大会,小鹏、一汽、长城、地平线等均已上云

11月3日&#xff0c;阿里云“汽车云”在2022云栖大会上正式亮相。基于云、钉钉、达摩院、瓴羊等核心技术能力&#xff0c;通过与客户、伙伴紧密共创&#xff0c;阿里云在研发、制造、流通三个业务场景形成了“自动驾驶云”“智造云”“营销云”解决方案&#xff0c;提供“产研供…

阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂

2022年5月18日&#xff0c;在“云上数字工厂与中小企业数字化转型创新论坛”暨“鼎捷MES & 阿里云云盒云上数字工厂解决方案发布会”上&#xff0c;阿里云智能弹性计算产品解决方案架构师梁旭为大家带来了《MES on 云盒&#xff0c;助力客户快速构建数字工厂》的主题分享&a…

如视技术副总裁杨永林:当传统产业遇到“数字空间”

图&#xff1a;2022阿里云视觉计算私享会现场 5月11日&#xff0c;在“2022阿里云视觉计算私享会”上&#xff0c;如视技术副总裁杨永林为大家带来了题为《当传统产业遇到“数字空间”》的主题分享。以下内容根据他的演讲整理而成。 随着互联网的发展&#xff0c;我们不断地将…

第二届上汽零束SOA平台开发者大会揭幕,智能汽车生态加速落地

重磅发布一览&#xff1a; 上汽、OPPO联合发布《生态域白皮书》&#xff0c;率先打通不同品牌硬件、操作系统和产品之间的交互壁垒&#xff0c;构建广泛兼容的生态域底层协议&#xff0c;并向全行业开放技术标准和开发资源。上汽、地平线联合发布基于征程5芯片的智驾解决方案。…

从 Redis7.0 发布看 Redis 的过去与未来

前言 经历接近一年的开发、三个候选版本&#xff0c;Redis 7.0终于正式发布&#xff0c;这是Redis历史上改变最多的一个大版本&#xff0c;它不仅包含了50多个新命令&#xff0c;还有大量核心新特性与改进&#xff0c;这些不仅能够解决用户使用中的诸多问题&#xff0c;还进一…

聊一聊并行文件系统的客户端优化之道

并行文件系统作为文件存储的一个高性能分支&#xff0c;自出现以来已经走过了二十个年头&#xff0c;一直被大规模应用于气象预测、石油勘探、高能物理、汽车制造、芯片制造、自动驾驶、影视渲染等高性能计算领域。在AI时代下&#xff0c;GPU并行计算如火如荼&#xff0c;阿里云…