
背景阿里云服务网格ASM可以简化服务治理,保障服务间通信的认证安全以及提供网格可观测性能力等需求,降低开发与运维的工作负担。对于网络插件类型为Terway的阿里云容器服务 ACK集群作为数据面集群的场景,阿里云服务网格ASM支持集成应用型负载均衡实例(ALB)。前提条件创建阿里云服务网格ASM企业版实例。创建网络插件类型为Terway阿里云容器服务 ACK实例。ACK实例的CCM(Cloud Controller Manager)组件版本>=v1.9.3.313-g748f81e-aliyun。步骤1 为阿里云容器服务 ACK实例安装ALB Ingress Controller组件若需要创建集群,请在组件配置配置向导页面,在Ingress字段右侧选择ALB Ingress。若已创建集群,且未安装ALB Ingress Controller组件。关于如何安装ALB Ingress Controller组件,请参见管理组件。步骤2 部署测试应用添加集群到ASM在阿里云服务网格ASM控制台,集群与工作负载管理-> Kubernetes集群。添加符合条件的阿里云容器服务ACK实例。部署测试应用在阿里云服务网格ASM控制台,网格实例->全局命名空间中,为default命名空间开启sidecar自动注入。参考部署应用到ASM实例,使用数据面集群的kubeconfig来创建bookinfo示例。kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/platform/kube/bookinfo.yaml步骤3 创建ASM网关在阿里云服务网格ASM控制台,ASM网关进行创建。选择负载均衡类型为私网访问。测试应用需要设置端口为80。步骤4 创建Istio资源在本测试应用中,我们创建网关资源和虚拟服务来方便测试。创建网关规则在流量管理,网关规则中,创建示例应用的网关规则:预览如下所示:apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: bookinfo-gateway namespace: default spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - '*'创建虚拟服务虚拟服务新建,为bookinfo-gateway网关设置虚拟服务配置。设置路由预览效果如下:apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo namespace: default spec: gateways: - bookinfo-gateway hosts: - '*' http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080步骤5 创建AlbConfig对于使用ALB的用户,分2种场景,分别是已有ALB实例和需要新建创建ALB的场景。和阿里云服务网格ASM的集成过程的区别点在于AlbConfig的配置。场景1:已有ALB标准版实例集成ASM网关对于已有ALB实例(目前仅支持标准版)的情况,在ALB控制台获取ALB实例id,修改AlbConfig的config中的id为ALB实例id。将一下内容保存为alb-demo.yamlapiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: default spec: config: id: alb-xxxxx forceOverride: false执行以下命令,创建AlbConfigkubectl apply -f alb-demo.yaml场景2:新建ALB实例集成ASM网关参考文档,在数据面集群ACK中配置AlbConfig,这里我们设置自动创建的ALB名称为alb-demo,将一下内容保存为alb-demo.yaml。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: default spec: config: name: alb-demo addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15****参数说明spec.config.name表示ALB实例名称。addressType(必选)表示负载均衡的地址类型。取值如下:Internet(默认值):负载均衡具有公网IP地址,DNS域名被解析到公网IP,因此可以在公网环境访问。Intranet:负载均衡只有私网IP地址,DNS域名被解析到私网IP,因此只能被负载均衡所在VPC的内网环境访问。zoneMappings(必选)用于设置ALB Ingress交换机ID,您需要至少指定两个不同可用区交换机ID,指定的交换机必须在ALB当前所支持的可用区内。关于ALB Ingress支持的地域与可用区,请参见支持的地域与可用区。执行以下命令,创建AlbConfigkubectl apply -f alb-demo.yaml步骤6 创建IngressClassapiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: default scope: Cluster步骤7 配置Ingress阿里云服务网格ASM网关的服务创建在istio-system命名空间中,我们需要在到数据面集群(阿里云容器服务ACK集群)中的istio-system命名空间中创建Ingress。port端口和前面创建ASM网关时设置的80端口保持一致。将以下内容保存为asm-gateway-ingress.yaml,执行kubectl apply -f asm-gateway-ingress.yaml创建。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: asm-gateway-ingress namespace: istio-system spec: ingressClassName: alb rules: - http: paths: - backend: service: name: istio-ingressgateway port: number: 80 path: /* pathType: ImplementationSpecific步骤8 测试访问执行kubectl get ing -n istio-system查看地址:NAME CLASS HOSTS ADDRESS PORTS AGE asm-gateway-ingress alb * alb-xxxx.xxxx.alb.aliyuncs.com 80 18h查询ingress实例的地址。可以通过 http://alb-xxxxxx.xxxx.alb.aliyuncs.com/productpage来访问ASM网关。也可以登录ALB控制台,通过ALB公网地址访问ASM网关。如果ALB已绑定域名,也可以通过域名进行访问。相关参考ACK网络插件选择使用Terway网络插件总结阿里云服务ASM能够和应用型负载均衡实例ALB的场景无缝集成,满足多种使用场景。作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景, 详情可见产品介绍:https://www.aliyun.com/product/servicemesh 。用户讨论群:
背景在阿里云服务网格ASM中,支持通过ArgoCD来进行应用程序的发布、更新,简化了运维成本。开发者提交YAML编写的应用程序定义(Deployment、Service)和流量管理(VirtualService、Gateway、DestinationRule)到Git仓库。ArgoCD会监控集群中应用程序当前的Deployment、Service、VirtualService等资源的状态,与Git仓库中的资源期望编排进行比较,以Git仓库中的内容为基准。并且能够在 Git 仓库更改时自动/手动去同步和部署应用程序。2. 前提条件创建Istio版本为1.12.4.50或更高版本的阿里云服务网格 (ASM) 企业版实例;创建容器服务Kubernetes (ACK) 集群;将ACK集群添加到ASM实例;已安装ArgoCD;Git仓库;3. 指导步骤安装ArgoCD启用ASM的数据面KubeAPI访问能力创建ASM网关将ACK集群添加到ASM实例通过ArgoCD部署Istio资源GitOps流程演示3.1 安装 ArgoCD如果已经安装了ArgoCD,请跳过此步骤。ArgoCD的安装和部署可以参考它的 主页。阿里云容器服务(ACK)应用中心具有内置的ArgoCD功能,也可以避免手动安装ArgoCD。ACK应用程序中心允许检查应用程序状态,可以使用Git仓库和Helm chart将应用程序版本部署到Kubernetes集群。可以回滚和发布应用程序版本。3.2 启用ASM的数据面KubeAPI访问能力注意:由于阿里云服务网格(ASM)是一个托管istio兼容的控制平面,ArgoCD管理的服务网格(ASM)控制平面和数据平面(Kubernetes容器服务(ACK))不在同一个Kubernetes集群环境中。我们需要在ASM中启用“数据平面KubeAPI访问”,然后ArgoCD才能像访问ACK集群的资源一样访问ASM集群中的Istio资源。在托管模式下,服务网格ASM和ArgoCD所管理的容器服务ACK并不处于同一个集群环境,需要启用阿里云服务网格ASM特有的“数据面KubeAPI访问能力”后,使得ArgoCD能像访问ACK集群的资源一样,访问ASM集群中的Istio资源。在阿里云服务网格 ASM 控制台中,如下图所示,启用该能力。3.3. 创建ASM网关 在阿里云服务网格ASM控制台 -> ASM网关 -> 创建ASM网关处,创建一个ASM网关,提供80和443端口。3.4 将ACK群集作为外部群集添加到ArgoCD(可选)如果ArgoCD和ASM管理的ACK集群不在同一个集群中,我们需要将ACK集群添加到ArgoCD。ACK集群可以使用Kubernetes secret作为外部集群添加到ArgoCD中,tlsClientConfig可以从ACK KubeConfig文件中获取:caData=证书颁发机构数据,certData=客户端证书数据,keyData=客户端密钥数据 3.5 通过ArgoCD应用程序部署istio资源Istio资源现在可以定义为Kubernetes清单,并推送到用于部署应用程序k8s编排的Git仓库中。 3.5.1 Create APP这里我们使用Istio book-info示例,Git仓库地址为https://github.com/AliyunContainerService/asm-labs.git。您先将此仓库Fork到您本地分支选择argocd-asm,Path为argo-cd/bookinfo。3.5.2 查看应用状态创建完成后如下所示:点击bookinfo可查看创建的资源状态。3.5.3 在阿里云控制台查看资源状态在ASM控制台可以看到创建的资源, 如下所示创建出的VirtualService。可以点击bookinfo名称查看具体的YAML内容。在 ACK控制台也可以看到创建的资源, 如下所示创建出的Deployment。3.5.4 访问测试从ASM控制台获取ASM网关的地址,在浏览器输入http://{ASM-Gateway-IP}/productpage进行访问因为Istio book-info的reviews有3个版本,我们现在还未指定版本,每次刷新,右侧数据显示会不一样。我们之后通过GitOps的流程进行指定。3.6 GitOps Demo我们通过配置流量规则,正常只展示v1版本的reviews,只有当登录用户名为jason时,显示v2版本。并且将Deployment reviews-v1的副本修改为2。添加如下内容到我们的Git仓库的argo-cd/bookinfo/istio-route.yaml文件中。并修改argo-cd/bookinfo/bookinfo.yaml的reviews-v1 Deployment副本数为2。3.6.1 修改本地文件apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v1 ---3.6.2 Commit & Push$ git add * $ git commit -m "reviews-v1" reviews-v1 2 files changed, 22 insertions(+), 22 deletions(-) $ git push 3.6.3 同步如果开启了自动同步,ArgoCD会自动同步Git的配置到集群,如果没有,可以手动点一下同步按钮。如下所示, 因为文件存在了变更, Argo控制台中会自动给出OutOfSync状态的提示, 点击SYNC按钮完成同步。同步之后, 在ASM控制台可以查看同步之后创建的资源, 如下所示创建出的VirtualService。可以点击reviews名称查看具体的YAML内容。在 ACK控制台也可以看到更新之后的资源, 如下所示 Deployment reviews-v1 副本数更新为2.3.6.4 效果查看根据路由规则,在未登录状态下,访问http://{ASM-Gateway-IP}/productpage,固定为review-v1版本。reviews-v1的副本数也生效为2。如果我们使用jason为用户名(任意密码)登录后,看到的是v2版本。4. 总结实践中结合阿里云服务网格ASM的最新特性,使用ArgoCD将资源编排以GitOps方式进行管理,简化了运维管理成本。
KServe(原KFServing)是云原生环境的的一个模型服务器和推理引擎,可以支持自动缩放、零缩放、金丝雀部署等能力。本文将介绍如何结合阿里云服务网格ASM和阿里云容器服务平台Kubernetes(ACK)来部署。前提条件创建Kubernetes集群。创建阿里云服务网格ASM企业版实例,版本需要>=v1.12.4.58-g3e422e2a-aliyun本文以KServe v0.8版本为例进行安装。添加数据面集群在集群与工作负载管理->Kubernetes集群中,将数据面集群到阿里云服务网格ASM管理。启用数据面KubeAPI访问在基本信息页,选择启用数据面KubeAPI访问。安装KServe组件如果已经在数据面集群安装过KServe,可以跳过此步骤。1. 安装Knative Serving这里以 Knative Serving v0.7为例,需求Kubernetes版本>=v1.17。。通过运行以下命令安装Knative Serving所需的自定义资源:kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/kserve/kserve-0.7/serving-crds.yaml安装Knative Serving的核心组件:kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/kserve/kserve-0.7/serving-core.yaml安装Knative Istio controller 在KServe中,可以使用Istio用作调用入口,并提供模型的蓝/绿和金丝雀部署能力。执行以下命令,将安装net-istio-controller用于Istio的Knative入口控制器,以及istio Gateway和PeerAuthentication资源。PeerAuthentication是用于在服务网格环境中为knative webhook设置PERMISSIVE来避免mTLS认证问题。由于已经启用了数据面KubeAPI访问能力,可以直接使用数据面的kubeconfig进行创建。kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/kserve/kserve-0.7/net-istio.yaml2. 安装Cert ManagerKServe依赖Cert Manager组件。此组件的最低版本要求为v1.3.0。以v1.3.0版本为例,使用如下命令安装:kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/kserve/kserve-0.7/cert-manager.yamlhttps://github.com/cert-manager/cert-manager/releases/download/v1.3.0/cert-manager.yaml3. 安装KServekubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/kserve/kserve-0.7/kserve.yaml创建ASM网关在ASM网关点击创建。注意,协议需要选择TCP,我们设置端口为80。创建第一个推理服务使用scikit-learn的训练模型进行测试。创建命名空间首先,创建用于部署KServe资源的命名空间。kubectl create namespace kserve-test创建 InferenceServicekubectl apply -n kserve-test -f - <apiVersion: "serving.kserve.io/v1beta1"kind: "InferenceService"metadata: name: "sklearn-iris"spec: predictor: model: modelFormat: name: sklearn storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"EOF检查创建状态。使用数据面Kubeconfig,执行如下命令查询inferenceservices的sklearn-iris的安装状态。kubectl get inferenceservices sklearn-iris -n kserve-test安装完成后,会自动创建对应模型配置的虚拟服务和网关规则。测试通过ASM网关进行访问创建模型输入文件cat < "./iris-input.json"{ "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ]}EOF通过ASM网关进行访问获取SERVICE_HOSTNAME:SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -n kserve-test -o jsonpath='{.status.url}' | cut -d "/" -f 3)测试HOST为sklearn-iris.kserve-test.example.com使用前文创建的ASM网关地址curl -H "Host: ${SERVICE_HOSTNAME}" http://{ASM网关地址}:80/v1/models/sklearn-iris:predict -d @./iris-input.json 总结作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景, 详情可见产品介绍:https://www.aliyun.com/product/servicemesh 。
2022年06月