作者:Jordan Liggitt(谷歌)
作为Kubernetes的维护者,咱们始终在寻找在放弃兼容性的同时进步可用性的办法。在开发个性、分类bug和答复反对问题的过程中,咱们积攒了有助于Kubernetes用户理解的信息。在过来,信息的共享仅限于公布阐明、布告电子邮件、文档和博客文章等内部办法。除非有人晓得该信息并设法找到它,否则他们不会从中受害。
在Kubernetes v1.19中,咱们增加了一个个性,容许Kubernetes API服务器向API客户机发送正告。正告是应用规范的Warning响应头发送的,因而它不会以任何形式更改状态代码或响应体。这容许服务器发送正告,任何API客户端都能够轻松读取,同时放弃与以前的客户端版本兼容。
正告在kubectl v1.19+的stderr输入和k8s.io/client-go客户端库v0.19.0+的日志输入。k8s.io/client-go的设定能够按过程或按客户端笼罩。
弃用的正告
咱们应用这个新性能的第一种形式是,对应用已弃用的API(deprecated API)发送正告。
Kubernetes是一个疾速倒退的大型项目。即便对于全职从事我的项目的人来说,跟上每个版本中的变动也是一件令人生畏的事件。一种重要的扭转是API的弃用。随着Kubernetes中的API降级到GA版本,预公布的API版本将被弃用并最终被删除。
即便有一个缩短的弃用期,并且在公布阐明中蕴含了弃用,它们依然很难跟踪。在弃用期间,预公布API依然无效,容许多个版本转换为稳固的API版本。然而,咱们发现,用户通常甚至没有意识到他们所依赖的API版本曾经弃用,直到他们降级到不再提供它的版本。
从v1.19开始,每当向弃用的REST API发出请求时,都会在API响应的同时返回一个正告。此正告包含无关API将不再可用的版本的详细信息,以及替换的API版本。
因为正告来自服务器,在客户端被拦挡,所以它实用于所有的kubectl命令,包含像kubectl apply这样的高级命令,和像kubectl get --raw这样的低级命令:
这有助于受弃用影响的人晓得他们收回的申请已被弃用,他们须要多长时间来解决这个问题,以及他们应该应用什么API来代替。当用户利用本人没有创立的清单时,这尤其有用,这样他们就有工夫分割作者,要求更新版本。
咱们还意识到,应用已弃用API的人通常不是负责降级集群的同一个人,因而咱们增加了两个面向管理员的工具,以帮忙跟踪已弃用API的应用状况,并确定何时降级是平安的。
指标
从Kubernetes v1.19开始,当向已弃用的REST API端点发出请求时,在kube-apiserver过程中将apiserver_requested_deprecated_apis度量指标设置为1。此指标具备API group、version、resource、subresource的标签,以及一个removed_version标签,该标签批示不再提供API的Kubernetes版本。
这是一个应用kubectl、prom2json和jq的示例查问,用于确定API服务器的以后实例申请了哪些弃用的API:
kubectl get --raw /metrics | prom2json | jq ' .[] | select(.name=="apiserver_requested_deprecated_apis").metrics[].labels'
输入:
{ "group": "extensions", "removed_release": "1.22", "resource": "ingresses", "subresource": "", "version": "v1beta1"}{ "group": "rbac.authorization.k8s.io", "removed_release": "1.22", "resource": "clusterroles", "subresource": "", "version": "v1beta1"}
这显示了弃用的extensions/v1beta1 Ingress和rbac.authorization.k8s.io/v1beta1 ClusterRole API在此服务器上被申请,将在v1.22中被删除。
咱们能够将这些信息与apiserver_request_total指标连接起来,以取得对于向这些API收回的申请的更多细节:
kubectl get --raw /metrics | prom2json | jq ' # set $deprecated to a list of deprecated APIs [ .[] | select(.name=="apiserver_requested_deprecated_apis").metrics[].labels | {group,version,resource} ] as $deprecated | # select apiserver_request_total metrics which are deprecated .[] | select(.name=="apiserver_request_total").metrics[] | select(.labels | {group,version,resource} as $key | $deprecated | index($key))'
输入:
{ "labels": { "code": "0", "component": "apiserver", "contentType": "application/vnd.kubernetes.protobuf;stream=watch", "dry_run": "", "group": "extensions", "resource": "ingresses", "scope": "cluster", "subresource": "", "verb": "WATCH", "version": "v1beta1" }, "value": "21"}{ "labels": { "code": "200", "component": "apiserver", "contentType": "application/vnd.kubernetes.protobuf", "dry_run": "", "group": "extensions", "resource": "ingresses", "scope": "cluster", "subresource": "", "verb": "LIST", "version": "v1beta1" }, "value": "1"}{ "labels": { "code": "200", "component": "apiserver", "contentType": "application/json", "dry_run": "", "group": "rbac.authorization.k8s.io", "resource": "clusterroles", "scope": "cluster", "subresource": "", "verb": "LIST", "version": "v1beta1" }, "value": "1"}
输入显示,只对这些API收回读申请,大多数申请是为了监督已弃用的Ingress API。
你还能够通过以下Prometheus查问找到该信息,该查问返回对于对将在v1.22中删除的已弃用API的申请的信息:
apiserver_requested_deprecated_apis{removed_version="1.22"} * on(group,version,resource,subresource)
审计正文
指标是查看是否正在应用弃用API,以及应用速度的一种疾速办法,然而它们没有蕴含足够的信息来辨认特定的客户机或API对象。从Kubernetes v1.19开始,对已弃用API的申请的审计事件包含一个审计正文"k8s.io/deprecated":"true"。管理员能够应用这些审计事件来标识须要更新的特定客户端或对象。
Custom Resource Definitions
从v1.19开始,除了API服务器正告已弃用API的性能外,CustomResourceDefinition还能够批示它所定义的资源的特定版本已被弃用。当API申请自定义资源的已弃用版本时,将返回一条正告音讯,与内置API的行为相匹配。
如果须要,CustomResourceDefinition的作者还能够为每个版本定制正告。这容许他们提供一个指向迁徙指南的指针,或者在须要时提供其余信息。
apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinition name: crontabs.example.comspec: versions: - name: v1alpha1 # This indicates the v1alpha1 version of the custom resource is deprecated. # API requests to this version receive a warning in the server response. deprecated: true # This overrides the default warning returned to clients making v1alpha1 API requests. deprecationWarning: "example.com/v1alpha1 CronTab is deprecated; use example.com/v1 CronTab (see http://example.com/v1alpha1-v1)" ... - name: v1beta1 # This indicates the v1beta1 version of the custom resource is deprecated. # API requests to this version receive a warning in the server response. # A default warning message is returned for this version. deprecated: true ... - name: v1 ...
Admission Webhooks
Admission webhook是与Kubernetes集成自定义策略或验证的次要形式。从v1.19开始,admission webhook能够返回正告音讯,这些音讯被传递到申请API客户端。正告能够与容许或回绝录取答复一起返回。
例如,容许一个申请,但正告一个已知的配置不工作,admission webhook能够发送这样的响应:
{ "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "response": { "uid": "<value from request.uid>", "allowed": true, "warnings": [ ".spec.memory: requests >1GB do not work on Fridays" ] }}
如果你正在实现一个webhook返回一个正告音讯,这里有一些提醒:
- 不要在音讯中蕴含“Warning:”前缀(这是客户端在输入中增加的)
- 应用正告音讯来形容收回API申请的客户端应该纠正或留神的问题
- 精简;如果可能,将正告限度在120个字符
admission webhook应用这个新个性的形式有很多,我很期待看到人们会提出什么。这里有一些倡议让你开始:
- webhook实现减少了一个“complain”模式,在这里他们返回正告而不是回绝,以容许尝试一个策略,以验证它是否失常工作,而后开始施行它
- “lint”或“vet”格调的webhook,查看对象和没有遵循最佳实际是提供正告
Kubectl严格模式
如果你想确保尽快留神到弃用并立刻着手解决它们,kubectl在v1.19中增加了一个--warnings-as-errors选项。应用此选项调用时,kubectl将从服务器接管到的任何正告视为谬误,并以非零退出代码退出:
这能够在CI作业中用于将清单利用到以后服务器,并且须要应用零退出代码传递,以示意CI作业胜利。
将来的可能性
当初,咱们曾经有了一种办法,能够在上下文中向用户传递有用的信息,咱们在思考应用这种办法来改善用户应用Kubernetes的体验。咱们探讨了的两个方面是对于已知有问题的值的正告,因为兼容性起因,咱们不能齐全回绝这些值,以及对于应用不举荐应用的字段或字段值的正告(比方应用beta os/arch节点标签的selector,在v1.14弃用)。我很快乐看到这一畛域的停顿,Kubernetes的应用越来越容易。
Jordan Liggitt是谷歌的一名软件工程师,帮忙领导Kubernetes的认证、受权和API工作。
点击浏览网站原文。
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。咱们通过将最前沿的模式民主化,让这些翻新为公众所用。扫描二维码关注CNCF微信公众号。