之前总听说什么声明式 API ,一直不知道是什么玩意,但是 k8s 有一个核心,赖以生存的一个东西,就是这个【声明式API】
- 先了解一下声明式 API
- 以后咱的操作都要靠这个东西,绝大时候就不会通过命令去部署什么了
命令式 API
所谓命令式 API,意思就是说系统只会傻瓜式的完成我所输入的命令操作,最终的执行结果取决于我这个命令是否正确;命令式 API 需要我们去想怎么做,然后才能将怎么做的过程给到系统,系统就按照我们自己的思路来实现。
- 就比如说,我要在k8s环境中直接起一个pod,k8s 就按照我输入的命令完成动作,我命令输错了也就不会去执行了
kubectl run pod my-nginx --image=nginx
- 像在
bash
终端执行命令那样,就是命令式API
声明式 API
告诉系统我想要什么东西,系统自己去想怎么做
声明式 API,可以让我们关注于应用本身,而非系统执行细节,这种方式可以大大简化应用的配置管理复杂度
- 按照我们之间的经验,我们在 k8s 中创建一次部署,应该是这样的
- 命令行的操作
kubectl create deployment my-nginx --image=nginx:1.21-alpine
-
命令行的方式要记得太多了,每一个功能都要记住一个命令,k8s 里面还提供一种配置文件的方式(对象描述文件)的方式来进行操作,用配置文件来固化操作,增加了移植性。
-
k8s 里面所有的资源都是可以使用
yaml
文件来指定的,我们只需要关注 yaml 文件内容,提交给 k8s ,由他自己去执行即可,kubectl apply -f test.yaml
-
k8s 里面可以操作的资源对象获取方式:
kubectl api-resources
-
初步体验一下 k8s 的声明式 API
#准备一个yaml文件,内容如下 apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本 kind: Deployment #该配置的类型,我们使用的是 Deployment metadata: #译名为元数据,即 Deployment 的一些基本属性和信息 name: nginx-deployment #Deployment 的名称 labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解 app: nginx #为该Deployment设置key为app,value为nginx的标签 spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用 replicas: 1 #使用该Deployment创建一个应用程序实例(写多少启动多少) selector: #标签选择器,与上面的标签共同作用,目前不需要理解 matchLabels: #选择包含标签app:nginx的资源 app: nginx template: #这是选择或创建的Pod的模板 metadata: #Pod的元数据 labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod app: nginx spec: #期望Pod实现的功能(即在pod中部署) containers: #生成container,与docker中的container是同一种 - name: nginx #container的名称 image: nginx #使用镜像nginx创建container,该container默认80端口可访问
-
也可以通过 yaml 配置文件直接删除
kubectl delete -f deploy.yaml
-
命令式和声明式的区别
有个比较形象的比喻,我觉得挺有意思的
我们有一个炒菜机,
如果炒菜机提供的接口是放油、放调料、放食材、大火、小火等操作,那就是命令式API
如果炒菜机提供的接口是来盘宫保鸡丁、来盘鱼香肉丝之类的,那就是声明式API了
声明式API比较典型的例子就是数据库提供的SQL接口,只需要告诉数据库你需要什么数据即可,至于怎么去获取这些数据,数据库自己会去按步骤操作
比喻出自:https://www.cnblogs.com/hnxxcxg/p/16366324.html