初试报名全日制 (openservicemesh)

微软近期开源了一个新的名为 Open Service Mesh[1] 的项目并准备捐赠给 CNCF[2] 。

基本介绍

Open Service Mesh (OSM) is a lightweight, extensible, Cloud Native service mesh that allows users to uniformly manage, secure, and get out-of-the-box observability features for highly dynamic microservice environments.

Open Service Mesh(OSM)是一个轻量级,可扩展的云原生服务网格,它使用户能够统一管理,保护和获得针对高度动态微服务环境的开箱即用的可观察性功能。

OSM 在 Kubernetes 上运行基于 Envoy 的控制平面,可以使用 SMI API 进行配置。它通过以 sidecar 的形式注入 Envoy 代理来工作。

控制面负责持续配置代理,以配置策略和路由规则等都保持最新。代理主要负责执行访问控制的规则,路由控制,采集 metrics 等。(这和目前我们常见到的 Service Mesh 方案基本都一样的)

显著特性

  • 基于 Service Mesh Interface (SMI) 的实现,主要包括 Traffic Access Control, Traffic Specs 和 Traffic Split 。剩下的 Traffic Metrics 正在开发中;
  • 服务间的通信加密使用 mTLS ;
  • 定义和执行服务间的访问控制[3]策略;
  • 通过 Prometheus 和 Grafana 完成其观察性;
  • 可与外部证书管理服务进行集成;
  • Envoy sidecar [4] 自动注入;

上手体验

只做介绍未免太过无趣,而且说实话,这么多 service mesh 实现,不亲自上手试试看,感觉不出来太多差异的。

这里我使用 KIND[5] 作为我本地的实验环境。

安装

安装过程很简单,直接去 Release 页面[6] *载下**预编译好的二进制文件。可将二进制文件加入到 $PATH 中。

(MoeLove)➜~wget-qhttps://github.com/openservicemesh/osm/releases/download/v0.1.0/osm-v0.1.0-linux-amd64.tar.gz
(MoeLove)➜~tar-xzvfosm-v0.1.0-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/README.md
linux-amd64/osm
(MoeLove)➜~cdlinux-amd64
(MoeLove)➜linux-amd64ls
LICENSEosmREADME.md

在进行 osm 资源和服务的正式安装前,先做个必要的检查:

(MoeLove)➜linux-amd64./osmcheck--pre-install
ok:initializeKubernetesclient
ok:queryKubernetesAPI
ok:Kubernetesversion
ok:cancreatenamespaces
ok:cancreatecustomresourcedefinitions
ok:cancreateclusterroles
ok:cancreateclusterrolebindings
ok:cancreatemutatingwebhookconfigurations
ok:cancreateserviceaccounts
ok:cancreateservices
ok:cancreatedeployments
ok:cancreateconfigmaps
ok:canreadsecrets
ok:canmodifyiptables
Allcheckssuccessful!

可以看到主要是和权限相关的一些检查。接下来就正式对 ocm 相关资源进行部署。

默认使用的镜像,托管在 DockerHub 上,如果需要配置加速的小伙伴,可传递 --container-registry 更改源地址,以便于加速安装进度。

(MoeLove)➜linux-amd64./osminstall

OSMinstalledsuccessfullyinnamespace[osm-system]withmeshname[osm]
(MoeLove)➜linux-amd64kubectl-nosm-systemgetpods
NAMEREADYSTATUSRESTARTSAGE
osm-controller-d499d6cc7-886590/1ContainerCreating012s
osm-grafana-58ff65dfb7-svztv0/1ContainerCreating012s
osm-prometheus-5756769877-zj6f60/1ContainerCreating012s
zipkin-6df4b57677-dcq8q0/1ContainerCreating012s

可以看到默认安装完成后,都在 osm-system 命名空间下,有 4 个 Pods

  • osm-controller:控制谬
  • osm-grafana:Dashboard 相关,可通过 osm dashboard 命令唤起;
  • osm-prometheus:采集 metrics ;
  • zipkin:链路追踪

还有对应的 service 记录.

(MoeLove)➜linux-amd64kubectl-nosm-systemgetsvc
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
osm-controllerClusterIP10.97.115.1<none>15128/TCP,443/TCP7m46s
osm-grafanaClusterIP10.110.209.86<none>3000/TCP7m46s
osm-prometheusClusterIP10.97.10.65<none>7070/TCP7m46s
zipkinClusterIP10.103.150.158<none>9411/TCP7m46s

以及一系列的 CRD

(MoeLove)➜linux-amd64kubectl-nosm-systemgetcrd
NAMECREATEDAT
backpressures.policy.openservicemesh.io2020-08-06T16:14:03Z
httproutegroups.specs.smi-spec.io2020-08-06T16:14:03Z
tcproutes.specs.smi-spec.io2020-08-06T16:14:03Z
trafficsplits.split.smi-spec.io2020-08-06T16:14:03Z
traffictargets.access.smi-spec.io2020-08-06T16:14:03Z

实践

  • 创建实验用的 namespace, 并通过 osm namespace add 将其纳入管理范围中:
(MoeLove)➜~kubectlcreatensbookstore
namespace/bookstorecreated
(MoeLove)➜~kubectlcreatensbookbuyer
namespace/bookbuyercreated
(MoeLove)➜~kubectlcreatensbookthief
namespace/bookthiefcreated
(MoeLove)➜~kubectlcreatensbookwarehouse
namespace/bookwarehousecreated
(MoeLove)➜~osmnamespaceaddbookstorebookbuyerbookthiefbookwarehouse
Namespace[bookstore]succesfullyaddedtomesh[osm]
Namespace[bookbuyer]succesfullyaddedtomesh[osm]
Namespace[bookthief]succesfullyaddedtomesh[osm]
Namespace[bookwarehouse]succesfullyaddedtomesh[osm]
  • 部署实验应用程序
#在项目的代码目录中执行
(MoeLove)➜osmgit:(main)kubectlapply-fdocs/example/manifests/apps
Warning:kubectlapplyshouldbeusedonresourcecreatedbyeitherkubectlcreate--save-configorkubectlapply
namespace/bookbuyerconfigured
serviceaccount/bookbuyercreated
service/bookbuyercreated
deployment.apps/bookbuyercreated
Warning:kubectlapplyshouldbeusedonresourcecreatedbyeitherkubectlcreate--save-configorkubectlapply
namespace/bookstoreconfigured
service/bookstorecreated
service/bookstore-v1created
serviceaccount/bookstore-v1created
deployment.apps/bookstore-v1created
Warning:kubectlapplyshouldbeusedonresourcecreatedbyeitherkubectlcreate--save-configorkubectlapply
namespace/bookthiefconfigured
serviceaccount/bookthiefcreated
service/bookthiefcreated
deployment.apps/bookthiefcreated
Warning:kubectlapplyshouldbeusedonresourcecreatedbyeitherkubectlcreate--save-configorkubectlapply
namespace/bookwarehouseconfigured
serviceaccount/bookwarehousecreated
service/bookwarehousecreated
deployment.apps/bookwarehousecreated
trafficsplit.split.smi-spec.io/bookstore-splitcreated
  • 本地访问

你可以通过 kubectl port-foward 在本地对刚才部署的应用进行访问。示例中也提供了相应的启动脚本 scripts/port-forward-all.sh ,注意这里需要先安装 GNU parallel ,例如: dnf install parallel .

(MoeLove)➜osmgit:(main)✗./scripts/port-forward-all.sh
Academictraditionrequiresyoutociteworksyoubaseyourarticleon.
IfyouuseprogramsthatuseGNUParalleltoprocessdataforanarticleina
scientificpublication,pleasecite:

O.Tange(2018):GNUParallel2018,Mar2018,ISBN9781387509881,
DOIhttps://doi.org/10.5281/zenodo.1146014

Thishelpsfundingfurtherdevelopment;ANDITWON'TCOSTYOUACENT.
Ifyoupay10000EURyoushouldfeelfreetouseGNUParallelwithoutciting.

MoreaboutfundingGNUParallelandthecitationnotice:
https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice

Tosilencethiscitationnotice:run'parallel--citation'once.


访问本地的 8080~8083 端口即可看到示例项目。例如:

初试报名全日制,openservicemesh

备注:这里是因为我的应用程序已经运行一段时间了,如果是新部署的,所有数字皆为 0

  • 访问控制策略

我们来看看如何调整访问控制的策略

kind:TrafficTarget
apiVersion:access.smi-spec.io/v1alpha2
metadata:
name:bookstore-v1
namespace:bookstore
spec:
destination:
kind:ServiceAccount
name:bookstore-v1
namespace:bookstore
rules:
-kind:HTTPRouteGroup
name:bookstore-service-routes
matches:
-buy-a-book
-books-bought
sources:
-kind:ServiceAccount
name:bookbuyer
namespace:bookbuyer
#-kind:ServiceAccount
#name:bookthief
#namespace:bookthief
---
apiVersion:specs.smi-spec.io/v1alpha3
kind:HTTPRouteGroup
metadata:
name:bookstore-service-routes
namespace:bookstore
spec:
matches:
-name:books-bought
pathRegex:/books-bought
methods:
-GET
headers:
-host:"bookstore.bookstore"
-"user-agent":".*-http-client/*.*"
-"client-app":"bookbuyer"
-name:buy-a-book
pathRegex:".*a-book.*new"
methods:
-GET
headers:
-host:"bookstore.bookstore"

这里定义了两个 SMI 中的资源 TrafficTarget 和 HTTPRouteGroup ,用来控制入口流量。

(MoeLove)➜osmgit:(main)✗kubectlapply-fdocs/example/manifests/access/

通过以上命令创建这两个资源。然后再次打开我们的示例应用程序,就会看到对应的计数正在逐步增加(因为请求被放行了) 。

以上示例来自于项目仓库 中的示例。

Dashboard

通过 osm dashboard 可直接唤起本地浏览器,并 port-foward 将 Grafana 打开。

初试报名全日制,openservicemesh

总结

Open Service Mesh 相对来说,确实很轻量。 所需要的访问控制,流量切割等功能通过自己创建 SMI 资源来控制。

并且,在同一个集群内可存在多组 mesh ,osm 安装的时候,可指定 mesh 名称。

此外,这个项目也是微软在 Service Mesh 方向的又一个大动作了。目标也许是 Istio 。让我们拭目以待。

欢迎订阅我的文章公众号【MoeLove】

参考资料

[1]

OSM: https://github.com/openservicemesh/osm/

[2]

捐赠提案: https://github.com/cncf/toc/pull/507

[3]

访问控制: https://github.com/servicemeshinterface/smi-spec/blob/v0.5.0/apis/traffic-access/v1alpha2/traffic-access.md

[4]

sidecar 注入: https://github.com/openservicemesh/osm/blob/main/docs/patterns/sidecar_injection.md

[5]

Kubernetes In Docker: https://kind.sigs.k8s.io/

[6]

osm Release 页面: https://github.com/openservicemesh/osm/releases