MicroK8s 在上个月发布的 1.25 版本中加入了服务网格组件 osm-edge,自此通过 MicroK8s 管理的基础设施搭配轻量级的服务网格 osm-edge,将服务网格能力延伸到了边缘计算场景。
MicroK8s
MicroK8s 是一个 Kubernetes 发行版,以功能强大、重量轻、生产可靠著称。同时,还提供了开箱即用的生产级附加组件。MicroK8s 支持到达 42 种 Linux 发行版,以及使用 Multipass 的 Mac 和 Windows,支持 x86、ARM64 等多种计算架构,有着非常强的软硬件兼容性。可以实现 Kubernetes 集群的一键部署,从个人开发的实验环境到生产环境都能满足需求。
osm-edge
osm-edge 是针对边缘计算环境设计的服务网格,采用 osm 作为控制平面,采用 Pipy 作为数据平面,具有高性能、低资源、简单、易用、易扩展、广泛兼容(支持 x86/arm64/龙芯/RISC-V)的特点。
今天就来为大家介绍如何使用 MicroK8s 快速部署集群,并演示使用服务网格来进行服务的访问控制
Demo
安装 MicroK8s
这里提供了 macOS 和 Linux 两种平台的安装,记得指定 MicroK8s 的版本为 1.25-strict。
macOS
brew install multipass #安装 Multipass
brew install ubuntu/microk8s/microk8s
microk8s install --cpu 2 --mem 8 --disk 20 --channel=1.25-strict/stable
复制代码
Linux
sudo snap install microk8s --channel=1.25-strict/stable
复制代码
安装 osm-edge
osm-edge 成为 MicroK8s 的附加组件后,安装更加简单,可以通过 microk8s enable osm-edge
命令一键安装。
这里我们通过参数指定服务网格的名字 osm
,以及部署网格组件的命名空间 osm-system
,以及开启宽松流量策略模式(这种模式下,默认允许服务间的自由通信)。
export osm_namespace=osm-system
export osm_mesh_name=osm
microk8s enable osm-edge \
--mesh-name "$osm_mesh_name" \
--osm-namespace "$osm_namespace" \
--set=osm.enablePermissiveTrafficPolicy=true
复制代码
确认 osm-edge 的组件已启动并正常运行。
microk8s kubectl get pod -n osm-system
NAME READY STATUS RESTARTS AGE
osm-bootstrap-84d58db974-xzmv9 1/1 Running 0 3m20s
osm-injector-64db5b67-csv4z 1/1 Running 0 3m20s
osm-controller-76c674f9c7-2gctr 2/2 Running 0 3m20s
复制代码
部署示例应用
还是使用常见的 bookstore 应用作为示例。
创建命名空间。
microk8s kubectl create namespace bookstore
microk8s kubectl create namespace bookbuyer
microk8s kubectl create namespace bookthief
microk8s kubectl create namespace bookwarehouse
复制代码
将刚创建的命名空间纳入服务网格管理(无需借助 osm CLI)。
microk8s kubectl annotate namespace bookstore openservicemesh.io/sidecar-injection=enabled
microk8s kubectl label namespace bookstore openservicemesh.io/monitored-by=osm
microk8s kubectl annotate namespace bookbuyer openservicemesh.io/sidecar-injection=enabled
microk8s kubectl label namespace bookbuyer openservicemesh.io/monitored-by=osm
microk8s kubectl annotate namespace bookthief openservicemesh.io/sidecar-injection=enabled
microk8s kubectl label namespace bookthief openservicemesh.io/monitored-by=osm
microk8s kubectl annotate namespace bookwarehouse openservicemesh.io/sidecar-injection=enabled
microk8s kubectl label namespace bookwarehouse openservicemesh.io/monitored-by=osm
复制代码
应用中使用 mysql,需要用到持久化存储。执行下面的命令,添加 hostpath provisioner。
microk8s enable hostpath-storage
复制代码
部署应用
microk8s kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookbuyer.yaml
microk8s kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookthief.yaml
microk8s kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookstore.yaml
microk8s kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookwarehouse.yaml
microk8s kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/mysql.yaml
复制代码
通过端口转发,在浏览器中可以查看应用的运行。
microk8s kubectl port-forward deploy/bookbuyer 8080:14001 -n bookbuyer --address 0.0.0.0 &
microk8s kubectl port-forward deploy/bookthief 8083:14001 -n bookthief --address 0.0.0.0 &
microk8s kubectl port-forward deploy/bookstore 8084:14001 -n bookstore --address 0.0.0.0 &
复制代码
在浏览器中使用主机的 IP 地址来访问应用,比如我使用的主机地址 192.168.1.11
:
bookbuyer: http://192.168.1.11:8080
bookthief: http://192.168.1.11:8080
bookbookstore: http://192.168.1.11:8080
访问控制
由于开启了宽松流量模式,网格中的服务可以自由地互相访问,也因此 bookthief 可以不断地从 bookstore 中偷取书籍(bookthief 页面计数器不断增长)。
要防止书籍被偷,首先我们关闭宽松流量模式。执行下面的命令后,bookthief 和 bookbuyer 页面的计数器停止了增长。
microk8s 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 的访问放行:
microk8s 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 页面的计数器仍未恢复。
通过流量策略的配置,我们实现了网格中服务间的访问控制。
总结
通过这篇文章,我们一键安装了 Kubernetes 集群和服务网格 osm-edge,并通过示例应用来验证如何使用服务网格来限制服务间的通信。服务网格的功能还有很多,由于篇幅原因不一一展示,有兴趣的同学可以访问 osm-edge 官方文档了解更多。
虽然引入了 sidecar 容器来管理服务间的网络通信,但是对轻量级的服务网格来说,sidecar 占用的资源有限却依然保持高性能,非常适合大规模的远端和资源受限的边缘。对资源占用和延迟感兴趣的同学,可以阅读文档《边缘服务网格 osm-edge 数据平面基准测试》。
评论