本文主要介绍在极简 Kubernetes 发行版 k8e 上如何使用轻量级服务网格 osm-edge 进行服务治理,演示在一个低资源(2c4g)的 ARM 集群上进行服务的灰度发布和访问控制。
介绍
K8E
k8e 读作 ‘kuber easy’,是一个 Kubernetes 的极简发行版。k8e 是基于另一个发行版 k3s ,经过裁剪(去掉了 Edge/IoT 相关功能、traefik 等)、扩展(加入 ingress、sidecar 实现、cilium 等)而来,旨在让云原生落地部署 Kubernetes 更轻松。在最新发布的版本 v1.21.14+k8e2中,k8e 集成了边缘服务网格 osm-edge v1.1.0 作为其默认的服务网格组件。
k8e 具有以下特性:
单二进制文件,集成了 k8s 的各种组件、containerd、runc、kubectl、nerdctl 等
使用 cilium 作为 cni 的实现,方便 eBPF 的快速落地
使用 osm-edge 作为服务网格实现,在保证轻量级的同时
按照私有云的经验增加、优化代码
得益于这些特性,k8e 非常适合 CI、开发和企业级部署,单机版的集群适合技术验证环境。
服务网格 osm-edge
osm-edge 是针对边缘计算环境设计的服务网格,采用 osm 作为控制平面,采用 Pipy 作为数据平面,具有高性能、低资源、简单、易用、易扩展、广泛兼容(支持 x86/arm64/龙芯/RISC-V)的特点。
osm-edge 的简单首先是控制平面的简单,实现了服务网格接口 SMI。SMI 提供通过少量的 CRD 提供了标准通用的服务网格能力,整个控制平面的实现没有复杂的设计,且具有很高的开放性。
其次是数据面,数据面使用了 Pipy。在保持极低资源占用的情况下有着很高的性能,同时通过可编程的特性提供扩展性。
Demo
环境
先介绍下环境,使用 ARM64 的虚拟机,分配 2c 4g 的资源。
资源:2c4g * 1
平台:ARM64
OS:Ubuntu 20.04
内核:5.4.0-122-generic
k8e:v1.21.14+k8e2
osm-edge:v1.1.0(k8e)内置
集群安装
使用下面的版本安装最新版本的 k8e:
curl -sfL https://getk8e.com/install.sh | K8E_TOKEN=k8e-mesh INSTALL_K8E_EXEC="server --cluster-init --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config" sh -
复制代码
检查并等待所有 pod 启动并运行:
kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEcilium-operator-598c495f5f-44wxp 1/1 Running 0 2m17scilium-zbclv 1/1 Running 0 2m17scoredns-574bcc6c46-fd6fz 1/1 Running 0 2m17slocal-path-provisioner-84bb864455-nmtn2 1/1 Running 0 2m17smetrics-server-b55c49795-7hgh6 1/1 Running 0 2m17s
复制代码
安装服务网格
k8e 成功安装后,就可以使用其内置的 osm CLI 来进行 osm-edge 的安装了。
osm versionCLI Version: version.Info{Version:"v1.1.0", GitCommit:"2fbc79c9a9f2eee85110e144b5e21ea5d52e7ba4", BuildDate:"2022-07-20-09:35"}
MESH NAME MESH NAMESPACE VERSION GIT COMMIT BUILD DATE
复制代码
使用下面的命令安装 osm-edge,在安装时顺便开启宽松流量策略模式,这样无需配置流量策略来允许服务间的访问。
export osm_namespace=osm-system export osm_mesh_name=osm
osm install \ --mesh-name "$osm_mesh_name" \ --osm-namespace "$osm_namespace" \ --set=osm.enablePermissiveTrafficPolicy=true
复制代码
osm-edge 只有 3 个组件,等待 pod 启动并运行。
kubectl get po -n osm-systemNAME READY STATUS RESTARTS AGEosm-bootstrap-6b885c564c-7hxjv 1/1 Running 0 5m2sosm-controller-777c7d64d4-4wmqm 2/2 Running 0 5m2sosm-injector-7fd575988-5ttvd 1/1 Running 0 5m2s
复制代码
部署示例应用
我们使用常见的 bookstore 应用作为示例,应用的拓扑如下。
kubectl create namespace bookstorekubectl create namespace bookbuyerkubectl create namespace bookthiefkubectl create namespace bookwarehouseosm namespace add bookstore bookbuyer bookthief bookwarehousekubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookbuyer.yamlkubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookthief.yamlkubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookstore.yamlkubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookwarehouse.yamlkubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/mysql.yaml
复制代码
通过端口转发,在浏览器中可以查看应用的运行。
git clone https://github.com/flomesh-io/osm-edge.git -b release-v1.1cd osm-edgecp .env.example .env./scripts/port-forward-all.sh
复制代码
访问控制
由于开启了宽松流量模式,网格中的服务可以自由地互相访问,也因此 bookthief 可以不断地从 bookstore 中偷取书籍(bookthief 页面计数器不断增长)。
要防止书籍被偷,首先我们关闭宽松流量模式。执行下面的命令后,bookthief 和 bookbuyer 页面的计数器停止了增长。
kubectl patch meshconfig osm-mesh-config -n osm-system -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":false}}}' --type=mergemeshconfig.config.openservicemesh.io/osm-mesh-config patched
复制代码
为了保证正常的书籍购买,要对 bookbuyer 对 bookstore 的访问放行:
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/release-v1.1/manifests/access/traffic-access-v1.yamltraffictarget.access.smi-spec.io/bookstore createdhttproutegroup.specs.smi-spec.io/bookstore-service-routes createdtraffictarget.access.smi-spec.io/bookstore-access-bookwarehouse createdhttproutegroup.specs.smi-spec.io/bookwarehouse-service-routes createdtraffictarget.access.smi-spec.io/mysql createdtcproute.specs.smi-spec.io/mysql created
复制代码
此时,bookbuyer 页面的计数器恢复增长,bookthief 页面的计数器仍未恢复。
通过流量策略的配置,我们实现了网格中服务间的访问控制。
灰度发布
在 bookbuyer 的页面上,只有 bookstore V1 的计数器在增长,说明 bookbuyer 只会从 v1 版本的 booktore 中购买书籍。
接下来我们部署 v2 版本的 bookstore。
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/release-v1.1/manifests/apps/bookstore-v2.yamlservice/bookstore-v2 createdserviceaccount/bookstore-v2 createddeployment.apps/bookstore-v2 createdtraffictarget.access.smi-spec.io/bookstore-v2 created
复制代码
创建一个流量拆分策略 TrafficSplit,设置为所有流量到 bookstore service。
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/release-v1.1/manifests/split/traffic-split-v1.yaml
复制代码
由于 service 标签选择器的原因,流量并不会进入 v2 。
kubectl get po -l app=bookstoreNAME READY STATUS RESTARTS AGEbookstore-8999cfbbd-bkv44 2/2 Running 0 52m
kubectl get po -l app=bookstore-v2NAME READY STATUS RESTARTS AGEbookstore-v2-7d496494c6-ggksk 2/2 Running 0 25m
复制代码
接下来,将一般流量拆分到 v2。
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/release-v1.1/manifests/split/traffic-split-50-50.yaml
复制代码
此时,在 bookbuyer 页面可以看到 v1 和 v2 的计数器同时增长。
最后,我们修改策略,将所有流量导入到 v2 中。
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/release-v1.1/manifests/split/traffic-split-v2.yaml
复制代码
策略生效后,页面上将只有 v2 的计数器在增长。完成发布后,v1 版本的服务便可以下线了。
总结
Open Service Mesh (OSM) 是由业界巨头微软主导发布的轻量级微服务实现规范,以前我们提起 Mesh,只知道有 Istio,并没有什么标准来实现自己的 Mesh。即使像阿里、腾讯这样的大厂造了一些 Mesh 方案,大多也是在 Istio 生态做一些裁剪,很难形成通用型的方案。所以,osm-edge 方案在 OSM 标准上进行了优化实现,采用高性能的 Pipy 边际网关作为依托,完整实现了一套 Mesh 套件。
看官可以按照以上教程快速搭建自己的 Mesh,而不用担心组件的复杂性。为了考虑运维部署的简化,osm-edge 被内置在 k8e 集群发行版本中,也就是你拿到一个只有 80M 大小的单二进制文件,就可以部署一整套 Kubernetes 和 Mesh 集群环境。因为采用 systemd 托管机制,k8e 和 osm 的升级不影响集群中应用的运行,简单到直接覆盖二进制文件然后采用 systemctl restart k8e 重启就可以完成整套集群的升级,让极简主义进行彻底。话不多说,希望读者能遵循以上步骤走一遍,感受一下云原生 Mesh 搭建的快乐。
评论