开发者学堂课程【Kubernetes 云原生管理实践:Kubernetes 应用管理领域总揽和入门实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/751/detail/13220
快速学习 Kubernetes 应用管理领域总揽和入门实践
内容介绍:
一、创立 OAM 的背景和原因
二、OAM 基本概念
三、部署 OAM 应用
一、创立 OAM 的背景和原因
1、OAM :自包含、关注点分离的云原生应用定义
(1)构建以应用为中心的 Kubernetes
k8s 统一了底层基础设施 (Compute, Network, Storage), 但是在应用层上没有进一步往上抽象。大家在 K8s上主要以使用单个 workload 为主。一旦能力多了,整个管理和扩展的难度会增大,且用户体验也不够友好。
2、尝试往应用层做抽象,做统一的云原生应用管理架构。
云原生应用管理架构的领域建模:
• Clean architecture :可扩展、易标准化的架构
•越往里,依赖越低,抽象程度越高,接口设计越稳定
•核心层为通用的应用模型 (OAM)→ PaaS 平台基础能力→用户展示和体验层
3、什么是 OAM ?为什么要用 OAM ?
ubernetes 目前主要价值在于统一了基础设施层,但是在应用层上并没有进一步抽象。大家在 Kubernetes 上主要还是使用单个 workload 为主,一旦能力多了,整个管理和扩展的难度就会增大,并且用户体验也不够友好。为了解决这些问题,尝试往应用层上做抽象,做统一的云原生应用管理架构。有了这个目标,这一层云原生应用管理架构又该怎样建模?可以借鉴微服务领域建模的思想,分享一篇叫做 Clean architecture 领域建模的文章。
这篇文章最核心的思想表达了这样一个观点,一个好的架构设计,关键在于把不容易变换的接口单独分层和抽象出来。越是不容易变化的,在模型里就越靠近或成为内核。一个内核依赖程度越低,抽象程度越高,可重用和标准化能力随之越强。
4、设计一个 Paas 层架构模型也是同样的道理。
最内层的核心是一个通用的应用模型,他有一些特征,比如自包含、关注点分离、结构化组合等。往外一层是 Paas 平台的基础能力,比如 Kubernetes 原生的或自定义的资源、外部的云资源、应用的生命周期管理等等。最外层是用户的展示和体验层,包括 IaC 工具,接下来要讲的 CUE 也是属于这一部分的内容。以及 CLI/UI 工具,类似于 Docker Compose 的定义文件、Source Image 工具等。
二、OAM 基本概念
1、OAM 基本概念
• WorkloadDefinition:cloneset workload definition
• TraitDefinition:ingress trait definition
• Component
• ApplicationConfiguration
•自包含:所有服务组件和运维能力都在一个定义里。
•结构化: traits attached to components, 避免了 label selector 号等关联资源的方式,让用户使用更简单,体验也更友好。
2、OAM 里面有一个目录 Definition 的概念,目前用户 workload 在 Kubernetes 上,它会定义成 CRD,而目录 definition 是帮助 CRD 外再加一些 OAM 本身的概念,比如说子资源的信息等等内容在里面。
3、trait 是一个作用在目录上的运维能力,trait definition 跟目录 definition 类似,是运维能力定义成一个 CRD。trait definition 包住 CRD 外加一些 OAM 本身的概念,比如说下图中的 appliesto 。
表达可作用于的 workload 类型,还有表达自动填写 workload 信息的字段。
4、这里有很多 Componet,这些之后会谈到他都是研发来定义的,每一个 component 代表的是一个微服务的组件。一个 component 是对 workload 实例的一层分装,帮助他来表达其他的内容,比如说 Paramittens。
5、Application configuration 是运维侧给 Components 加上运维能力或者最终部署物。直接来看例子。
在这个例子可以看到 Application configuration 是自包含的。所有需要的内容,比如需要多少组件、运维能力都包含在一个含义里面,也就是最终的 Application Configuration。同时它也是结构化的,他的traits和运维能力会 attach 到 component 上,避免了 label selector 等离散的绑定方式,使用户体验更简单也更友好。
三、部署 OAM 应用
1、在 demo 里面,将通过 OAM 来部署一个应用。Demo 会依赖 KinD,在本地通过 doc 来运行 Kubernetes 的一种方式。我写了一个 README 来说明有一个样例来给大家展示如何去部署 OAM 应用。首先进到 OAM 目录下。
README 是刚才读的内容,复制 bash create-cluster.sh,接下来创建一个 cluster,一边创建一边可以看cluster做了什么。
他是创建一个 kind cluster,这个 kind cluster有一些本地的 pormetic,本地 pormetic 可以让本地通过 ingress 直接访问里面的服务。kind cluster已经创建完毕。
oam git:(master) bash create-cluster. sh
Creating cluster"kind"...
√
Ensuring node image(kindest/node:v1.18.2)
√
Preparing nodes
√
writing configuration
√
Starting control-plane
√
Installing CNI
√
Installing StorageClass
Set kubectl context to"kind-kind"
You can now use your cluster with:
kubectl cluster-info--context kind-kind
Not sure what to do next? Check out
https://kind.sigs.kess.io/docs/user/quick-start/
oam git:(master)
2、接下来把 ingress control 的
kubectl apply-f
https://raw.githubusercontent.com/
kubernetes/ingress-ngins/master/deploy/static/provider/kind/deploy.yaml
在 kind cluster 安装。安装完成如下图
3、在本地构建一个 flask app。复制
docker build-t flash-sample:v1.
kind load docker-image flask-sample:vl
看一下 dockerfile 里面引用 nginx-flask 的 python,并且把本地的 flash app 的代码复制进去。
FROM tiango lo/uwsgi-nginx-flask-python3.8
COPY ./app/app
Flash app 很简单,他直接返回 hello world。
4、第二个命令 kind load 虽然在本地构建了一个 image
,
kind load docker-image flask-sample:vl
但是并没有 posh 到远端,而 kind load 可以直接把 image load 到本地 kind 的集群里,这样里面的 kind 部署 deporment 也能直接识别里面的 image,不需要从远端在部一遍。Image 已经 build 完成。
5、接下来这一步将会把 OAM 运行起来
kubectl create namespace oam-system
helm repo add crossplane-master
https://charts
.
crossplane.io/master/
helm install oam-namespace oam-system crossplane-master/
oam-kubernetes-runtime—
devel
通过 helm 的方式来安装,把 crossplain 的 master 作为一个 vipor 加进来,基于 vipor 有一个 OAM Kubernetes runtime,并且把 runtime 装到 oam-system namespace 上面。现在 namespace 下面已经有 oam-system,里面runtine 也被部署起来了。
6、接下来部署应用。
Kubec apply -f config /
这个应用里面有 definition 的文件,这个 definition 的文件就是定义了需要部署 load 和 trait 都有哪些?还有一些 compote 文件,就是刚刚 flask app 作为一个 Component 部署进去了。
最后就是 component,component 也给他打上了 trait,包括 service 的能力和 ingress 的能力,也就是给它加上了一个访问的运维能力。
7、ingress 绑定了本地的 pod,可以直接从 local host 上访问。访问成功会显示
oam git:(
master
)
curl http
:
//localhost/
Hello World from Flask%
这样这个 demo 就完成了。最后需要把他清理掉。
Kubectl delete -f config/
Kind delete cluster