跳至内容

附加组件管理

kOps 包含一些附加组件的管理;我们必须管理一些在 Kubernetes API 正常运行之前需要的附加组件。

此外,kOps 通过 channels 工具提供附加组件的最终用户管理(该工具目前仍处于实验阶段,但我们正在努力使其成为 Kubernetes 附加组件管理的推荐部分)。我们在 addons 目录 中提供了一些精选的附加组件,更多信息请参见 addons 文档

kOps 也使用 channels 工具进行系统附加组件管理。由于 kOps 使用相同的工具进行系统附加组件管理和用户附加组件管理,这意味着由 kOps 在集群启动过程中安装的附加组件可以与其他附加组件一起管理。(但请注意,启动附加组件在 kOps 升级期间更有可能被替换)。

kOps 的总体理念是尽量减少启动附加组件的集合,并简化后续附加组件的安装。

因此,kube-dns 和网络覆盖(如果有)是典型的启动附加组件。但是,诸如仪表盘或 EFK 堆栈之类的附加组件可以在 kOps 启动后轻松安装,使用 kubectl apply -f https://...channels 工具。

将来,我们可能会出于方便起见,简化将可选附加组件添加到 kOps 清单的过程,但这仅仅是手动执行此操作的便捷包装器。

更新启动附加组件

如果要更新启动附加组件,可以运行以下命令来显示哪些附加组件需要更新。添加 --yes 才能实际应用更新。

channels apply channel s3://KOPS_S3_BUCKET/CLUSTER_NAME/addons/bootstrap-channel.yaml

版本控制

channels 工具添加了一个清单-清单文件,其Kind: Addons,它允许描述各种可用的清单版本。这样,kOps 就可以在发布附加组件的新版本时管理更新。例如,dashboard 附加组件 列出了多个版本。

例如,典型的附加组件声明可能如下所示

  - version: 1.4.0
    selector:
      k8s-addon: kubernetes-dashboard.addons.k8s.io
    manifest: v1.4.0.yaml
 - version: 1.5.0
    selector:
      k8s-addon: kubernetes-dashboard.addons.k8s.io
    manifest: v1.5.0.yaml

这声明了附加组件的两个版本,其清单位于 v1.4.0.yamlv1.5.0.yaml。这些被评估为相对于附加组件文件本身的相对路径。(channels 工具支持比 kubectl 更多的协议,例如,s3://... 用于 S3 托管的清单)。

version 字段为备用清单赋予意义。它被解释为 semver。channels 工具会跟踪当前安装的版本(目前通过对 kube-system 命名空间的注释实现)。

当以下任何条件适用时,channels 工具会更新已安装的版本。

  • 附加组件清单中声明的版本大于当前已安装的版本。
  • 版本号匹配,但 id 不同
  • 版本号和 id 匹配,但附加组件清单的哈希值自安装以来已更改。

这意味着用户可以编辑已部署的附加组件,但更改不会被替换,除非安装了附加组件的新版本。这里长期的方向是附加组件将主要通过 ConfigMap 或 Secret 对象进行配置,附加组件管理器将(待办事项)不会替换 ConfigMap。

selector 确定构成附加组件的对象。这将用于构建 --prune 参数(待办事项),以便在升级过程中删除先前版本中存在但新版本中不存在的对象。

Kubernetes 版本选择

附加组件管理器现在支持 kubernetesVersion 字段,该字段是对 Kubernetes 版本的 semver 范围说明符。如果 Kubernetes 的目标版本与指定的 semver 不匹配,则附加组件版本将被忽略。

这允许你为 Kubernetes API 的重大更改提供不同的清单版本。例如,1.6 将污点和容忍度更改为一个字段,RBAC 迁移到 beta 版。因此,拥有两个单独的清单更容易。

例如

  - version: 1.5.0
    selector:
      k8s-addon: kube-dashboard.addons.k8s.io
    manifest: v1.5.0.yaml
    kubernetesVersion: "<1.6.0"
    id: "pre-k8s-16"
 - version: 1.6.0
    selector:
      k8s-addon: kube-dashboard.addons.k8s.io
    manifest: v1.6.0.yaml
    kubernetesVersion: ">=1.6.0"
    id: "k8s-16"

在 1.6 之前的 Kubernetes 版本上,我们将安装 v1.5.0.yaml,而在 1.6 及更高版本的 Kubernetes 版本上,我们将安装 v1.6.0.yaml

请注意,我们删除了 Kubernetes semver 的 pre-release 字段,以便 1.6.0-beta.1 将匹配 >=1.6.0。这与 Kubernetes 处理预发布版本的方式一致。

Semver 不够:id

但是,semver 在此情况下不足以进行 Kubernetes 版本选择。问题出现在以下情况下

  • 安装 k8s 1.5,安装 1.5 版本的清单
  • 升级到 k8s 1.6,安装 1.6 版本的清单
  • 降级到 k8s 1.5;我们希望安装 1.5 版本的清单,但 1.6 版本的 semver 将大于或等于 1.5 版本的 semver。

我们需要一种方法来打破 semver 之间的联系,因此我们引入了 id 字段。

因此,清单实际上将如下所示

  - version: 1.6.0
    selector:
      k8s-addon: kube-dns.addons.k8s.io
    manifest: pre-k8s-16.yaml
    kubernetesVersion: "<1.6.0"
    id: "pre-k8s-16"
 - version: 1.6.0
    selector:
      k8s-addon: kube-dns.addons.k8s.io
    manifest: k8s-16.yaml
    kubernetesVersion: ">=1.6.0"
    id: "k8s-16"

请注意,这两个附加组件具有相同的版本,但 kubernetesVersion 选择器不同。但它们的 id 值不同;具有匹配 semver 但 id 不同的附加组件将被升级。(但是,我们永远不会降级到更旧的 semver,无论 id 如何)。

因此,在上述情况下,降级到 1.5 后,尽管 semver 相同,但 id 将不匹配,并且将安装 pre-k8s-16。(当我们升级回 1.6 时,将安装 k8s-16 版本)。

一些提示

  • version 现在可以更 closely 地反映上游版本。
  • 清单名称可能应该包含 id,以提高可维护性。