APIServer dry-run和kubectl diff

代码觅月使
• 阅读 6915

作者:Antoine Pelisse(Google Cloud,@apelisse)

APIServer dry-run和kubectl diff

声明式(Declarative)配置管理,也称为配置即代码(configuration-as-code),是Kubernetes的关键优势之一。它允许用户提交所需的集群状态,并跟踪不同的版本,通过CI/CD管道改进审计和自动化。Apply工作组正在努力修复一些差距,而很高兴地宣布Kubernetes 1.13将服务器端干运行(server-side dry-run)和kubectl diff升级到beta。这两个特性是Kubernetes声明模型的重大改进。

挑战

为了在Kubernetes保持无缝的声明体验,仍然缺少一些部分,我们试图解决其中的一些问题:

  • 虽然编译器(compiler)和质量器(linter)可以很好地检测代码拉取请求中的错误,但Kubernetes配置文件缺少良好的验证。现有的解决方案是运行kubectl apply --dry-run,但这会运行本地(local)干运行而不与服务器通信:它没有服务器验证,也没有通过验证许可控制器(validating admission controller)。例如,自定义资源名称仅在服务器上验证,因此本地干运行无济于事。
  • 由于多种原因,很难知道服务器将如何应用你的对象:

    • 默认会将某些字段设置为潜在的意外值,
    • 变异(mutating)webhook可能会设置字段或更改某些值,
    • 修补(patch)和合并(merge)可能会在对象产生令人惊讶的效果和导致意外。例如,一旦合并,很难知道列表将如何排序。

工作组试图解决这些问题。

APIServer dry-run

实施APIServer dry-run来解决这两个问题:

  • 它允许对apiserver的个别请求标记为“dry-run”,
  • apiserver保证干运行请求不会被持久存储,
  • 请求仍然作为典型请求处理:字段是默认的,对象是经过验证的,它通过验证准入链(validation admission chain),并通过变异准入链(mutating admission chain),然后最终的对象像往常一样返回给用户,没有被持久存储。

虽然动态准入控制器(dynamic admission controller)不应对每个请求产生副作用,但只有当所有准入控制器(admission controller)明确宣布它们没有任何干运行副作用时,才会处理干运行请求。

如何启用它

通过功能门(feature-gate)启用服务器端干运行。现在该功能在1.13中是Beta,默认情况下应该启用,但仍然可以使用kube-apiserver --feature-gates DryRun=true启用/禁用功能。

如果你有动态准入控制器,则可能必须将它们修复为:

  • 当webhook请求中指定dry-run参数时,删除任何副作用,
  • 在admissionregistration.k8s.io/v1beta1.Webhook对象的sideEffects字段中指定,指示该对象在干运行上没有副作用。

如何使用它

你可以使用kubectl apply --server-dry-run在kubectl触发该功能,它将使用dryRun标志装饰请求,并返回应用的对象,如果失败则返回错误。

Kubectl diff

APIServer dry-run很方便,因为它可以让你看到如何处理对象,但如果对象很大,很难准确识别出改变了什么。kubectl diff可以满足这方面的需要,通过显示当前“实时”对象与新“干运行”对象之间的差异。只关注对对象所做的更改,服务器如何合并这些更改,以及变异webhook如何影响输出,这非常方便。

如何使用它

kubectl diff希望与kubectl apply尽可能相似:kubectl diff -f some-resources.yaml将显示yaml文件中资源的差异。甚至可以使用KUBECTL_EXTERNAL_DIFF环境变量来使用他们选择的diff程序,例如:

KUBECTL_EXTERNAL_DIFF=meld kubectl diff -f some-resources.yaml

接下来是什么

工作组仍在忙着改进其中一些事情:

  • 服务器端应用试图通过向字段添加所有者语义来改进应用(apply)方案!它还将改善对CRD和工会的支持!
  • diff中缺少某些kubectl apply可能很有用的功能,例如按标签过滤或显示已修剪资源的功能。
  • 最终,kubectl diff将使用服务器端应用!

2019年KubeCon + CloudNativeCon中国论坛提案征集(CFP)现已开放

KubeCon + CloudNativeCon 论坛让用户、开发人员、从业人员汇聚一堂,面对面进行交流合作。与会人员有 Kubernetes、Prometheus 及其他云原生计算基金会 (CNCF) 主办项目的领导,和我们一同探讨云原生生态系统发展方向。

2019年中国开源峰会提案征集(CFP)现已开放

在中国开源峰会上,与会者将共同合作及共享信息,了解最新和最有趣的开源技术,包括 Linux、容器、云技术、网络、微服务等;并获得如何在开源社区中导向和引领的信息。

大会日期:

  • 提案征集截止日期:太平洋标准时间 2 月 15 日,星期五,晚上 11:59
  • 提案征集通知日期:2019 年 4 月 1 日
  • 会议日程通告日期:2019 年 4 月 3 日
  • 幻灯片提交截止日期:6 月 17 日,星期一
  • 会议活动举办日期:2019 年 6 月 24 至 26 日

2019年KubeCon + CloudNativeCon + Open Source Summit China赞助方案出炉啦

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Rancher开源Harvester:基于K8s的超融合基础架构软件
2020年12月17日,业界应用最为广泛的Kubernetes管理平台创建者RancherLabs(以下简称Rancher)宣布推出全新开源软件Harvester,一个通过Kubernetes构建的超融合基础架构(HCI)软件。!图片(https://img.rwimg.top/7592_5649bc00e54d4b30a1419db9c4
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Kubernetes使用命令
kubeadm/kubelet/kubectl区别kubeadm是kubernetes集群快速构建工具kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现kubectl:kubectl是kubenetes命令行工具,提供指令Kubernete
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
ClickHouse性能提升
本文经作者授权,独家转载:作者主页:https://www.jianshu.com/u/8f36a5e63d181\.不要用select\反例:select  from app.user_model正例:select login_id,name,sex from app.user_mo
Wesley13 Wesley13
3年前
K8S知道,K9S呢?
k9s是用于管理Kubernetes集群的CLI。通过封装kubectl功能,k9s可以让开发者快速查看并解决运行Kubernetes时的日常问题。部分特性跟踪在Kubernetes集群运行的资源的实时活动处理Kubernetes标准资源和自定义资源跟踪与资源相关联的
Stella981 Stella981
3年前
Kubernetes 中 kubectl.sh 各种参数(待译)
kubectl是控制Kubernetes的集群管理器。详情查看https://github.com/kubernetes/kubernetes用法: kubectl\flags\ kubectl\command\可用命令: get                
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx
代码觅月使
代码觅月使
Lv1
日落君山云起,春到沅湘草木,远思渺难收。
文章
4
粉丝
0
获赞
0