写点什么

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

作者:Flomesh
  • 2022 年 9 月 14 日
    北京
  • 本文字数:3749 字

    阅读完需:约 12 分钟

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

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

发布于: 58 分钟前阅读数: 6
用户头像

Flomesh

关注

微信订阅号:flomesh 2022.04.07 加入

一站式云原生应用流量管理供应商 官网:https://flomesh.io

评论

发布
暂无评论
双“简”合璧:极简 Kubernetes 上使用极简服务网格_Service Mesh 服务网格_Flomesh_InfoQ写作社区