双“简”合璧:极简 Kubernetes 上使用极简服务网格

本文主要介绍在极简 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平台:ARM64OS:Ubuntu 20.04内核:5.4.0-122-generick8e:v1.21.14+k8e2osm-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 应用作为示例,应用的拓扑如下。

双“简”合璧:极简 Kubernetes 上使用极简服务网格
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
双“简”合璧:极简 Kubernetes 上使用极简服务网格
bookbuyer
双“简”合璧:极简 Kubernetes 上使用极简服务网格
bookthief

访问控制

由于开启了宽松流量模式,网格中的服务可以自由地互相访问,也因此 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!