课时1:Kubernetes 应用管理领域总览和入门实践|学习笔记(二)

简介: 快速学习课时1:Kubernetes 应用管理领域总览和入门实践

开发者学堂课程【Kubernetes 云原生管理实践课时1:Kubernetes 应用管理领域总览和入门实践】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/293/detail/3438


课时1:Kubernetes 应用管理领域总览和入门实践

四、CUE configuration language

1、K8s yaml 管理的窘境

(1)Templating, Overlay, DSL

oam 如何作为 kuberneters 应用层抽象,kuberneters 本身是服务器端的能力,开发者使用时往往需要更为简单的模版,分享一篇文章,文章中很好的描述了kuberneters 配置管理的一些解决方法,对比了三种解决方法,第一种是templating,最简单的解法,直接在愿配置的基础上暴露几个参数,比如heim就采用这种方法,第二种l ayering 能够保留原配置并通过叠加方式做更改,比如kustomize就是采用这种方法,第三种是 dcl,比较偏向跟编程语言一样,提供抽象和库,从而达到高度重合的目的,borgcfg 外面有个开源板,jsonet都采用这种方法,cue也可以归类为第三种,它也是从borgcfg 和 jsonet 自然演进的下一代技术。

(2)简单统一→复杂多样→简单统一,

比如yaml,发现重复内容多或者有更好管理思路,又开发一系列工具和格式,最后又导致整个社区又开始变得多样化和不统一,最后又希望回到简单统一的方式,又回到开发下一代yaml格式,如此循环往复迭代下去,而cue出现在从复杂多样到简单统一时间节点上,cue如何统一管理配置,通过实战深入解cue并且回答问题。

2、CUE 用法入门

(1)进入cue官方网站,点Tutorials会出现一系列相应教程,通过教程逐个了解cue。

image.png

Cue,JSON Superset,创建cue,创建cue的文件test.cue,输入cue export test . cue,可以看到返回了JSON的文件,说明cue可以返回JSON Superset。

{

"list": [

1,

2,

3

],

"one": 1,

"two": 2,

"two-and-a-half": 2.5

}

(2)Types are values,通过里面的例子进行了解,

moscow: {

name :"Moscow"

pop:11.92M

capital: true

}

municipality: {

name :string

pop:int

capital: bool

}

在cue里面每个string都是集合,使用cue对不同集合取交集,比如失败,因为需要具体的数字,moscow是具体的数字,但是可以把municipality变成一个定义,但是只是export master,可以把定义跟值取交集,这时export成功,因为moscow值也是对应的type,如果type更改,export就不成功了,说明cue里面,type也是一个值,一个type和一个value怎么取交集,value里面更具体的type,cue取交集的操作,就是把集合不断的具体化,改成42,成功,改成string | int,也成功。

moscow: {

name :"42"

pop:11.92M

capital: true

}

municipality: {

name :string | int

pop:int

capital: bool

}

改成moscow,也可以。

moscow: {

name :"moscow"

pop:11.92M

capital: true

}

municipality: {

name :string | int

pop:int

capital: bool

}

定义另一个,也可以。

moscow:#Municipality& #municipality2 & f {

name :"moscow"

pop:11.92M

capital: true

}

municipality: {

name :string | int

pop:int

capital: bool

}

Municipality2: {

name :string

pop:int

capital: bool

}

如果改成int,就失败。

moscow:#Municipality& #municipality2 & f {

name :"moscow"

pop:11.92M

capital: true

}

municipality: {

name :string | int

pop:int

capital: bool

}

Municipality2: {

name :int

pop:int

capital: bool

}

(3)Duplicate Fields

允许多个字段重复,cue不断对string集合取交集,如果是一模一样的就不会产生冲突,没问题。

a: 4

a: 4

s:[b:2]

s:{c:2}

l:[1,2]

l: [1,2]

(4)Constraints

cue里面可以表达一些constraints,限制,跟type关系类似,有一定的关系,cue eval test . cue,violo从schema里面把human:true//always true 继承过来,如果export是不成功的,把它变成定义,跟定义取交集时,把定义里面的值赋予进来,把没有定义的字段暴露出来,export会告诉字段它不认识,如果加...,相当允许,可以加任意字段,export成功。

(5)Validation

#Language {

tag:string

name: =~"Alp(Lu)" // Must start with an

}

languages: [ . . . #Language ]

相当于用cue,yaml文件的验证方式,cue vet test . cue data . yaml,把no变成“no”,把dutch变成Dutch,没有错误,顺序没有关系,cue只是对内容取交集,在交集的操作里面,没有太大的关系,cue export test . cue,顺序改变也是暴露一样的内容。

a:{x:int,y:2}

a: {x: 1, y: int}

b: {x: 1, y: int}

b: {x: int, y: 2}

跟以继承为手段的工具最大的区别,像哪些工具,非常关注顺序,在大型协作里面反而不方便,像不关注顺序反而更容易去协作。更快速编写单层结构,自动next下去,跟之前一模一样,成功。

b: {x: 1, y: int}

b: {x: int, y: 2}

a: x: int

a:y:2

// a: {x: int, y: 2}

a: {x: 1, y: int}

3、用 CUE 管理 k8syaml

cue在kubernetes里的实践。

tree ./original I head

services

frontend

bartender

kube. yaml

breaddispatcher

kube. yaml

host

kube.yaml

Maitred

cp-a original tmp

cd tmp

cue mod init下载下来

写import代码

cd services 跑进文件夹

tree cue . mod I head

里面有

module. cue

pkg

Usr

cat cue . mod/module . cue

cd services

cue import ./...把里面所有的yaml都变成cue的一种定义,或者是cue的文件,cue import是失败的,有多个包和文件,要把所有的文件统一p kube名字

Cue import ./ . ..-p kube

失败,因为一个文件里面包含多个kubernetes object,如果不同的object在同一个kube包里,会产生冲突。

加前缀。

Cue import ./.. -p kube -l ' st rings. ToCamel(kind) ' -l metadata, name -f

可以看到cue文件都生成了。

Tree .I head

services

Frontend

bartender

kube . cue

kube. yaml

breaddispatcher

kube. cue

kube . yaml

打开cue文件,可以看到里面的yaml都变成了cue的定义,加的前缀就是kind,它的名字,每个集合都有不同的前缀,文件里面不仅有yaml格式,还有prometheus相关的格式,存的string类型放在里面,也是yaml的弊端,在cue里面相当于可以自动监测yaml和json string自动转化成cue的格式,这也是非常先进的东西,把所有的内容通过yaml marshal的方式放到原来字段里面,相当于用cue统一管理kubernetes配置,prometheus配置。可以看到跟yaml文件一模一样。

cue eval ./mon/prometheus -e configMap . prometheus

cue evaL -C ./...> snapshot

在文件里面存在大量重复的内容,尝试去除重复的内容,

cp frontend/breaddispatcher/kube . cue

创建cue文件,减少service和deployment里面重复的内容,每个service都有不同的名字,定义成类似于一个参数id,会把labels和ports,template相应重复的内容削减掉,报错,没有label,不符合要求,把component统一定义成string类型,输入

ls -d*/| sed 's/.$//' | xargs -I DIR sh -c 'cd DIR; echo "package kube

#Component: \"DIRI\"

" > kube.cue; cd ..'

根据目录名字加上cue文件,cue文件定义component具体的值,目录名字根据mon加上了component值,自动取交集,因为原先缺少component label,自动加上label,cue一秒就会成功,输入cue evaL -C ./...> snapshot2成功。

diff snapshot snapshot2

保存cp snapshot2 snapshot

find .| grep kube.cueI xargs Wc| tail -1

1792 3616 34815 total

cue trim ./....利用工具,在kube.cue中统一定义label,prot,template,cue trim自动的调整,把重复的削减掉,可以看到整个文件的行数少了很多,500行。

find .|grep kube.cue|xargs wc|tail - 1

1223 2374 22903 total

cue evaL -C ./...> snapshot2

行数减少很多,但是得到没有任何的区别,得到的都是一样的结果,

diff snapshot snapshot2 | WCc

把共同的字段定义出来,削减配置的行数,添加内容,统一配置。

$ cat <> kube. cue

daemonSet:[ID=_ ]:_ spec & {

apiVersion: "apps/v1"

kind:"DaemonSet"

_name:ID

}

statefulSet: [ID=_ ]:_ spec & {

apiVersion: "apps/v1"

ind:"StatefulSet"

_name :ID

}

deployment: [ID=_ ]: spec & {

apiVersion:"apps/v1"

kind:"Deployment"

_name:ID

spec:replicas: *1 | int

}

configMap: [ID=_ ]: {

metadata :name: ID

metadata: labels: component: #Component

}

_spec: {

_name: string

metadata :name:_ name

metadata: labels: component: #Component

spec: selector: {}

spec: template: {

metadata: labels: {

app:_name

component: #Component

domain :"prod"

}

spec: containers: [{name: name}]

}

}

EOF

$ cue fmt

//Define the export option and set the default to true

//for all ports defined in all containers.

_spec: spec: template: spec: containers: {...(

ports:{..(

export: *truel false //include the port in the service

}]

for x in [deployment, daemonSet, statefulSet] for k,v in x {

service: "\(k)": {

spec: selector: v. spec. template. metadata. labels

spec: ports:[

for c in v. spec . template. spec. containers

for p in c.ports

if p._ export {

let Port = p. containerPort // Port is an alias

port: *Port |int

targetPort: *Port|int

}

]

}

多个export存在,deployment, daemonSet, statefulSet对相应的service自动生成port的字段,它里面的port跟service port对应起来,有if else的操作,如果是export会给相应的service给它port填上,port的名字和数值,cue里面有for,if else的操作。

$ cat <> inf ra/events/kube . cue

deployment: events: spec: template: spec: containers: [{ports: [{_ export: false),_] }]

EOF

$ cat <> infra/tasks/kube. cue

deployment: tasks: spec: template: spec: containers: [{ports: [{_ export: false),_] }]

E0F

$ cat <>infra/watcher/kube. cue

deployment: watcher: spec: template: spec: containers:  [{ports: [{_ export: false),_] }]

EOF

把配置进一步减少

cue trim ./....

find .|grep kube.cue|xargs wc|tail - 1

把很多行变成一行

cue trim ./....-s

 

五、CUE 跟 OAM 的关系

还有更多减少配置的方法,整个过程充分了解如何通过cue更好的管理,更搞笑的减少重复的配置,使用 Kubernetes oam 相关的配置文件,更加舒服。

通过样例可以知道cue即可以作为配置,也可以作为配置验证和管理工具,cue 也可以把各种各样的格式统一起来,比如 kubernetes yaml 或者 prometheus。通过 cue 的模版达到用 GitOps/laC 的目的,运行在任何以恶 oam 平台上。

1、OAM 是服务器端的更高级别抽象,达到以应用为中心。

2、CUE 是客户端工具,为了更高效准确地编写和管理配置文件。

3、OAM 可以通过 CUE  透出更简单易用的模板: CUE templates→GitOps/laC→OAM

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
安全 网络安全 数据安全/隐私保护
DMZ是什么?它是如何工作的?
DMZ,中文通常译为“隔离区”或“非军事化区”,是在网络安全领域中用来描述一个逻辑或物理的网络子段,这个子段通常位于组织的内部网络和外部网络(如互联网)之间。DMZ的主要目的是提供一个受限制且受控的环境,允许对外提供服务的服务器放置在此区域,从而在一定程度上保护内部网络的安全。
2578 1
|
监控 测试技术 开发者
开发者如何使用微服务引擎MSE
【10月更文挑战第16天】开发者如何使用微服务引擎MSE
787 4
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
SQL 关系型数据库 数据库
Schema(模式
【10月更文挑战第11天】
1238 8
|
Kubernetes 负载均衡 调度
Kubernetes的主要用途是什么?
【7月更文挑战第2天】Kubernetes的主要用途是什么?
664 1
|
Unix Shell Linux
在Linux中,什么是Bash脚本,并且如何使用它。
在Linux中,什么是Bash脚本,并且如何使用它。
|
JavaScript Ubuntu 关系型数据库
在Linux中,如何查询已安装软件包的版本信息?
在Linux中,如何查询已安装软件包的版本信息?
|
运维 算法 安全
Linux下使用MD5SUM命令详解
Linux下使用MD5SUM命令详解
851 0
|
分布式计算 Hadoop 网络安全
|
安全 数据库 数据安全/隐私保护
撞库攻击是什么?如何有效阻止撞库攻击?
通过采取这些防护措施,可以有效降低撞库攻击的成功几率,保护用户的账户和数据安全。
790 0
撞库攻击是什么?如何有效阻止撞库攻击?