关于k8s:警告有用的警告|让Kubernetes的使用越来越容易

4次阅读

共计 5414 个字符,预计需要花费 14 分钟才能阅读完成。

作者: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/v1
kind: CustomResourceDefinition
  name: crontabs.example.com
spec:
  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 微信公众号。

正文完
 0