本文主要介绍在极简 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-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 搭建的快乐。
评论