两个思考题:
1.你是如何理解“命令式”和“声明式”的?为什么说空调是“声明式”的?
2.使用 --v=9 参数,试着解释一下 YAML 是如何被 kubectl 转换成 HTTP 请求的

-
因为空调的使用是我们设置温度,然后空调尽量去达成设置的温度,即我们设置的是我们想要达成的效果,而不像电视遥控器,每次操作都发送一个指令。
声明式还有一个特点是容易 patch,拿空调举例,当前气温 30 度,我们先设置了 24 度,然后升高到 26 度,空调并不会先降低到 24 度,再升高到 26 度,而是将两次传递的意图 patch,直接降低到 26 度,k8s 也是如此。 -
yaml 转换 json 的过程基本上字段一一对应,除了最后会把当前的 json 再序列化为字符串,存储到 "kubectl.kubernetes.io/last-applied-configuration" 这个 annotations 中。
-
你是如何理解“命令式”和“声明式”的?为什么说空调是“声明式”的?
从kubernetes相关知识点中学习并理解到的“声明式”一个最直白的地方是新增与修改两个命令式操作写成apply,如果创建对象不存在则创建、对象已存在就比较spec进行相应变更,当然k8s的修改实际上是先delete再create。至于kubectl create、kubectl edit、kubectl delete等都是"命令式"操作,告诉k8s应该怎么做。
空调是“声明式”的原因是我不知道当前温度是多少,只需要我知道应该开成多少度即可,即我们在操作遥控器之前就知道我们要将空调调成多少度,这是预期值。 -
使用 --v=9 参数,试着解释一下 YAML 是如何被 kubectl 转换成 HTTP 请求的。
虽然yaml格式是json的超集,但在k8s中的yaml文件最终都是被转换为json格式字符串放在request body中提交到apiserver的,从kubectl -v=9
对各种操作的调试中可以看到。
除此之外,还发现一些有规律的地方,如下:
可见简单对象(如pod, configmap, secret, serviceaccount等)调用的接口形式如/api/<apiVersion>/namespaces/<namespace>/<kinds>[/<name>]
,其中对象类型为复数形式即kubectl api-resources
中的name字段,修改、删除与查询具体对象时在URL中有/<name>
部分,其它如创建、查询所有就没有。
对于复合对象(简单对象的包装对象,如replicaset, deployment, statefulset, cronjob等)的URL不同的是以/apis
开头,说明是属于复合型的接口(组合服务)。
YAML被转换成两部分,一部份是apiversion、 metedata、kind作为header,剩余的转换为body。
curl -v -X GET 'https://192.168.49.2:8443/openapi/v2?timeout=32s' \
-H "Accept: application/com.github.proto-openapi.spec.v2@v1.0+protobuf" \
-H "User-Agent: kubectl/v1.23.3 (linux/amd64) kubernetes/816c97a"
网友评论