本文主要介绍在极简 Kubernetes 发行版 k8e[1] 上如何使用轻量级服务网格 osm-edge 进行服务治理,演示在一个低资源(2c4g)的 ARM 集群上进行服务的灰度发布和访问控制。
介绍
K8E
k8e 读作 ‘kuber easy’,是一个 Kubernetes 的极简发行版。k8e 是基于另一个发行版 k3s ,经过裁剪(去掉了 Edge/IoT 相关功能、traefik等)、扩展(加入 ingress、sidecar 实现、cilium等)而来,旨在让云原生落地部署 Kubernetes 更轻松。在最新发布的版本 v1.21.14+k8e2[2]中,k8e 集成了边缘服务网格 osm-edge v1.1.0[3] 作为其默认的服务网格组件。
k8e 具有以下特性:
•单二进制文件,集成了 k8s 的各种组件、containerd、runc、kubectl、nerdctl 等•使用 cilium 作为 cni 的实现,方便 eBPF 的快速落地•使用 osm-edge 作为服务网格实现,在保证轻量级的同时•按照私有云的经验增加、优化代码
得益于这些特性,k8e 非常适合CI、开发和企业级部署,单机版的集群适合技术验证环境。
服务网格 osm-edge
osm-edge 是针对边缘计算环境设计的服务网格,采用 osm[4] 作为控制平面,采用 Pipy[5] 作为数据平面,具有高性能、低资源、简单、易用、易扩展、广泛兼容(支持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-system
NAME READY STATUS RESTARTS AGE
cilium-operator-598c495f5f-44wxp 1/1 Running 0 2m17s
cilium-zbclv 1/1 Running 0 2m17s
coredns-574bcc6c46-fd6fz 1/1 Running 0 2m17s
local-path-provisioner-84bb864455-nmtn2 1/1 Running 0 2m17s
metrics-server-b55c49795-7hgh6 1/1 Running 0 2m17s
安装服务网格
k8e 成功安装后,就可以使用其内置的 osm CLI 来进行 osm-edge 的安装了。
osm version
CLI 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-system
NAME READY STATUS RESTARTS AGE
osm-bootstrap-6b885c564c-7hxjv 1/1 Running 0 5m2s
osm-controller-777c7d64d4-4wmqm 2/2 Running 0 5m2s
osm-injector-7fd575988-5ttvd 1/1 Running 0 5m2s
部署示例应用
我们使用常见的 bookstore 应用作为示例,应用的拓扑如下。

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse
osm namespace add bookstore bookbuyer bookthief bookwarehouse
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookbuyer.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookthief.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookstore.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookwarehouse.yaml
kubectl 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.1
cd osm-edge
cp .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=merge
meshconfig.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.yaml
traffictarget.access.smi-spec.io/bookstore created
httproutegroup.specs.smi-spec.io/bookstore-service-routes created
traffictarget.access.smi-spec.io/bookstore-access-bookwarehouse created
httproutegroup.specs.smi-spec.io/bookwarehouse-service-routes created
traffictarget.access.smi-spec.io/mysql created
tcproute.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.yaml
service/bookstore-v2 created
serviceaccount/bookstore-v2 created
deployment.apps/bookstore-v2 created
traffictarget.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=bookstore
NAME READY STATUS RESTARTS AGE
bookstore-8999cfbbd-bkv44 2/2 Running 0 52m
kubectl get po -l app=bookstore-v2
NAME READY STATUS RESTARTS AGE
bookstore-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 搭建的快乐。
引用链接
[1]
k8e: https://getk8e.com[2]
v1.21.14+k8e2: https://github.com/xiaods/k8e/releases/tag/v1.21.14%252Bk8e2[3]
osm-edge v1.1.0: https://github.com/flomesh-io/osm-edge[4]
osm: https://github.com/openservicemesh/osm[5]
Pipy: https://github.com/flomesh-io/pipy
原文始发于微信公众号(Flomesh):双“简”合璧:极简 Kubernetes 上使用极简服务网格
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/59555.html