Kubernetes 1.34 [beta]Kubernetes kuberc 配置文件允许您定义 kubectl 的偏好设置,例如默认选项和命令别名。与 kubeconfig 文件不同,kuberc 配置文件不包含集群详细信息、用户名或密码。
在 Linux / POSIX 系统中,此配置文件的默认位置为 $HOME/.kube/kuberc。Windows 下的默认路径类似:%USERPROFILE%\.kube\kuberc。要为 kubectl 指定自定义 kuberc 文件路径,请使用 --kuberc 命令行选项,或设置 KUBERC 环境变量。
使用 kubectl.config.k8s.io/v1beta1 格式的 kuberc 允许您定义以下类型的用户偏好设置:
在 kuberc 配置中,aliases (别名) 部分允许您定义 kubectl 命令的自定义快捷方式,并可选择预设命令行参数和标志。
下面的示例定义了 kubectl get 子命令的 kubectl getn 别名,并额外指定了 JSON 输出格式:--output=json。
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
aliases:
- name: getn
command: get
options:
- name: output
default: json
在此示例中,使用了以下设置:
name - 别名名称不得与内置命令冲突。command - 指定您的别名将执行的底层内置命令。这包括对 create role 等子命令的支持。options - 指定选项的默认值。如果您在运行 kubectl 时显式指定了某个选项,则您提供的值将优先于 kuberc 中定义的默认值。使用此别名,运行 kubectl getn pods 将默认采用 JSON 输出。但是,如果您执行 kubectl getn pods -oyaml,输出将采用 YAML 格式。
完整的 kuberc 模式可在此处查看。
下一个示例将扩展前一个示例,引入 prependArgs 部分,它允许在 kubectl 命令及其子命令(如果有)之后立即插入任意参数。
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
aliases:
- name: getn
command: get
options:
- name: output
default: json
prependArgs:
- namespace
在此示例中,使用了以下设置:
name - 别名名称不得与内置命令冲突。command - 指定您的别名将执行的底层内置命令。这包括对 create role 等子命令的支持。options - 指定选项的默认值。如果您在运行 kubectl 时显式指定了某个选项,则您提供的值将优先于 kuberc 中定义的默认值。prependArgs - 指定将放置在命令之后且直接生效的显式参数。在此处,它将被转换为 kubectl get namespace test-ns --output json。下一个示例将引入一种类似于前置参数的机制,不同之处在于,这次我们将参数追加到 kubectl 命令的末尾。
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
aliases:
- name: runx
command: run
options:
- name: image
default: busybox
- name: namespace
default: test-ns
appendArgs:
- --
- custom-arg
在此示例中,使用了以下设置:
name - 别名名称不得与内置命令冲突。command - 指定您的别名将执行的底层内置命令。这包括对 create role 等子命令的支持。options - 指定选项的默认值。如果您在运行 kubectl 时显式指定了某个选项,则您提供的值将优先于 kuberc 中定义的默认值。appendArgs - 指定将放置在命令末尾的显式参数。在此处,它将被转换为 kubectl run test-pod --namespace test-ns --image busybox -- custom-arg。在 kuberc 配置中,defaults 部分允许您为命令行参数指定默认值。
下一个示例将交互式删除模式设为调用 kubectl delete 的默认模式:
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
defaults:
- command: delete
options:
- name: interactive
default: "true"
在此示例中,使用了以下设置:
command - 内置命令,这包括对 create role 等子命令的支持。options - 指定选项的默认值。如果您在运行 kubectl 时显式指定了某个选项,则您提供的值将优先于 kuberc 中定义的默认值。使用此设置,运行 kubectl delete pod/test-pod 将默认提示确认。但是,kubectl delete pod/test-pod --interactive=false 将跳过确认。
Kubernetes v1.35 [beta]kubeconfig 的编辑器可以指定一个可执行插件,用于获取凭据以验证客户端与集群的连接。在 kuberc 配置中,您可以使用两个顶级字段来设置此类插件的执行策略。这两个字段均为可选。
您可以使用可选的 credentialPluginPolicy 字段配置凭据插件策略。该字段有三个有效值:
"AllowAll"当策略设置为 "AllowAll" 时,对可以运行的插件没有任何限制。此行为与 1.35 之前的 Kubernetes 版本一致。
"DenyAll"当策略设置为 "DenyAll" 时,将不允许任何 exec 插件运行。
"Allowlist"当策略设置为 "Allowlist" 时,用户可以有选择地允许执行凭据插件。当策略为 "Allowlist" 时,您必须同时提供 credentialPluginAllowlist 字段(也在顶级)。该字段描述如下。
credentialPluginPolicy 等同于显式将策略设置为 "AllowAll"。credentialPluginPolicy 不是 Allowlist 时(包括该字段缺失或为空的情况)设置此字段,被视为配置错误。credentialPluginAllowlist 字段指定了一组用于允许执行凭据插件的标准集合(即要求集)。每组要求将依次尝试;一旦插件满足至少一组中的所有要求,即被允许执行。也就是说,将许可名单应用于插件 my-binary-plugin 的最终结果,是列表中每一项所做决定的逻辑或 (OR)。
例如,考虑以下许可名单配置:
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: Allowlist
credentialPluginAllowlist:
- command: foo
- command: bar
- command: baz
在上面的示例中,许可名单将允许命令为 "foo"、"bar" 或 "baz" 的插件。
为了使一套要求有效,它必须至少包含一个非空且显式指定的字段。如果所有字段均为空或未指定,则视为配置错误,插件将不被允许执行。同样,如果 credentialPluginAllowlist 字段未指定,或者被显式指定为空列表。这是为了防止用户拼错 credentialPluginAllowlist 键——误以为自己指定了许可名单,但实际上并没有。
例如,以下配置是无效的:
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: Allowlist
credentialPluginAllowlist:
- command: ""
command 用于命名可能被执行的凭据插件。它可以指定为所需插件的基本名称 (basename) 或完整路径。如果指定为基本名称,则此字段给出的决定为“允许”,前提是满足以下两个条件之一:
command 字段与插件的 command 字段完全相等。command 和插件的 command 都执行完整路径解析,且结果相等。如果指定为完整路径,则此字段给出的决定为“允许”,前提是满足以下条件之一:
command 字段与插件的 command 字段完全相等(即插件的 command 也是一个完整路径)。command 执行完整路径解析,且与许可名单的 command 字段完全匹配。关于本页前面提到的完整路径解析,不会解析符号链接或 shell 通配符。
例如,考虑一个 command 为 /usr/local/bin/my-binary 的许可名单条目,其中 /usr/local/bin/my-binary 是指向 /this/is/a/target 的符号链接。如果 kubeconfig 中指定的 command 是 /this/is/a/target,它将不被允许。为了使其生效,您需要将 /this/is/a/target 显式添加到许可名单中。另一方面,如果 kubeconfig 的 command 为 /usr/local/bin/my-binary,则许可名单将允许它运行。
name 可用作 command 的别名。从 Kubernetes 1.36 开始,name 已弃用,推荐使用 command。在同一个许可名单条目中同时提供 name 和 command 被视为错误,因为这些是涉及安全性的设置。当 kuberc 达到 GA 阶段时,name 字段将被完全移除。以下示例展示了带有许可名单的 "Allowlist" 策略:
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: Allowlist
credentialPluginAllowlist:
- command: my-trusted-binary
- command: /usr/local/bin/my-other-trusted-binary
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
credentialPluginPolicy: Allowlist
credentialPluginAllowlist:
- command: my-trusted-binary
- command: "C:\my-other-trusted-binary"
kubectl kuberc set 管理凭据插件策略与其直接编辑 kuberc 文件,您可以使用 kubectl kuberc set 从命令行配置凭据插件策略。
# Set the policy to deny all credential plugins
kubectl kuberc set --section credentialplugin --policy DenyAll
# Set the policy to allow all credential plugins
kubectl kuberc set --section credentialplugin --policy AllowAll
# Allow only specific credential plugins
kubectl kuberc set --section credentialplugin \
--policy Allowlist \
--allowlist-entry command=my-trusted-binary \
--allowlist-entry command=my-other-trusted-binary
在此示例中,使用了以下标志:
--section credentialplugin - 选择凭据插件配置部分。--policy - 必需。将策略设置为 AllowAll、DenyAll 或 Allowlist。--allowlist-entry - 当 --policy=Allowlist 时必需。通过逗号分隔的 key=value 对指定要允许的插件。目前 command 是唯一支持的键(例如,command=<binary-name>),但该格式也考虑了未来的扩展,如摘要或公钥验证。重复此标志可允许多个插件。kubectl 维护者鼓励您采用以下默认设置的 kuberc:
如果您使用的是托管 Kubernetes 提供商,请查看提供商的文档,了解您环境中需要哪些 exec 插件,并改用 "Allowlist" 策略。
如果您在按照下文说明设置 "DenyAll" 策略后遇到问题,请观察 kubectl 的错误信息,以发现哪些插件被阻止运行,并与您的提供商文档进行核对。最后,将策略更改为 "Allowlist" 并将必要的插件添加到 credentialPluginAllowlist 字段中。
apiVersion: kubectl.config.k8s.io/v1beta1
kind: Preference
defaults:
# (1) default server-side apply
- command: apply
options:
- name: server-side
default: "true"
# (2) default interactive deletion
- command: delete
options:
- name: interactive
default: "true"
# See the above note about managed providers before selecting DenyAll
credentialPluginPolicy: DenyAll
在此示例中,强制执行以下设置:
kubectl delete 时默认为交互式删除,以防止意外删除集群中的资源。要暂时禁用 kuberc 功能,请设置(并导出)环境变量 KUBERC,其值为 off:
export KUBERC=off
或者禁用特性门控 (feature gate):
export KUBECTL_KUBERC=false
这有助于排查您的 kuberc 是否导致了问题。