我已经在 Ubuntu 20.04 上安装了一个包含 3 个主服务器和 3 个节点的 kubernetes (v1.20.0) 集群,使用kubeadm init
和kubeadm join
。现在我需要更新配置和
- 在所有节点上添加
--cloud-provider=external
kubelet 启动标志,因为我将使用vsphere-csi 驱动程序 --service-cidr
根据网络要求更改
然而,我不完全确定进行这些改变的正确方法是什么。
库贝莱特
看起来/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
有参考,/etc/default/kubelet
但它被认为是最后的手段,并建议更新.NodeRegistration.KubeletExtraArgs
:
...
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
...
这是在哪里.NodeRegistration.KubeletExtraArgs
以及如何为集群中的所有节点更改它?
控制平面
据我所知,apiserver 和 controller-manager 在每个 master 上作为静态 pod 运行,并从 读取配置/etc/kubernetes/manifests/kube-<type>.yaml
。我的第一个想法是对这些文件进行必要的更改,但是根据 kubernetes 文档升级 kubeadm 集群,kubeadm 将:
* Fetches the kubeadm ClusterConfiguration from the cluster.
* Optionally backups the kube-apiserver certificate.
* Upgrades the static Pod manifests for the control plane components.
由于我手动更改了清单,因此它们未在 ClusterConfiguration ( kubectl -n kube-system get cm kubeadm-config -o yaml
) 中更新,这样我的更改在升级后还能继续吗?我想我也可以手动编辑 ClusterConfiguration,kubeadm edit cm ...
但这似乎容易出错,而且每次都很容易忘记更改它。
根据文档,有一种方法可以自定义控制平面配置但这似乎仅在首次安装集群时才会发生。例如,kubeadm config print init-defaults
顾名思义,只给我默认值,而不是集群中当前正在运行的值。尝试从中提取 ClusterConfigurationkubectl -n kube-system get cm kubeadm-config -o yaml
并运行kubeadm init --config <config>
会以各种方式失败,因为集群已经初始化。
Kubeadm 可以运行初始阶段控制平面它会更新静态 pod 清单,但保持 ClusterConfiguration 不变,所以我upload-config
也需要运行该阶段。
基于上述内容,工作流程似乎是
- 从中提取 ClusterConfiguration
kubeadm -n kube-system get cm kubeadm-config
并将其保存到 yaml 文件 - 根据需要修改 yaml 文件
- 使用以下方式应用更改
kubeadm init phase control-plane all --config <yaml>
- 上传修改后的配置
kubeadm init phase upload-config all --config <yaml>
- 将修改后的yaml文件分发给所有master
- 对于每个硕士,申请
kubeadm init phase control-plane all --config <yaml>
我担心的是静态 pod 清单和 ClusterConfiguration 之间明显的脱节。更改并不经常进行,因此很容易忘记在一个地方进行更改也需要在另一个地方进行更改 - 手动进行。
有没有办法更新 kubelet 和控制平面设置,以确保 Kubernetes 组件和 kubeadm 之间的一致性?我对 Kubernetes 还很陌生,很多关于它的文档,所以如果我在这里遗漏了一些明显的内容,我很抱歉。
答案1
我将尽力解答您的两个问题。
1.在所有节点上添加--cloud-provider=external kubelet启动标志
这个 .NodeRegistration.KubeletExtraArgs 在哪里,我如何为集群中的所有节点更改它?
KubeletExtraArgs
是 kubelet 支持的任何参数。它们都有文档记录这里。您需要使用kubelet
带有适当标志的命令才能对其进行修改。另请注意,您即将使用的标志将在 k8s v1.23 中删除:
--cloud-provider string
云服务的提供商。设置为空字符串表示在没有云提供商的情况下运行。如果设置,云提供商将确定节点的名称(请参阅云提供商文档以确定是否以及如何使用主机名)。(已弃用:将在 1.23 版中删除,以从 Kubelet 中删除云提供商代码为替代。)
编辑:
为了更好地回答您的问题:.NodeRegistration.KubeletExtraArgs
这些也是kubeadm init 配置文件:
可以
kubeadm init
使用配置文件而不是命令行标志进行配置,并且一些更高级的功能可能仅作为配置文件选项提供。此文件使用标志传递--config
,它必须包含一个ClusterConfiguration
结构,并且可选地包含多个结构,由---\n
混合--config
使用其他标志分隔,在某些情况下可能不允许。
您还可以找到有关节点注册选项以及有关配置字段和用法的更多信息。
另请注意:
KubeletExtraArgs
将额外的参数传递给 kubelet。这里的参数通过环境文件传递给 kubelet 命令行kubeadm 在运行时将 kubelet 写入源。这将覆盖 kubelet-config-1.X 中的通用基础级配置
ConfigMap
解析时,标志具有更高的优先级。这些值是本地的,特定于 kubeadm 正在执行的节点。
编辑2:
kubeadm init
在您使用标志或配置文件创建集群时,它应该只使用一次。您无法通过使用不同的值再次执行它来更改配置。这里您将找到有关 kubeadm 及其用法的信息。集群设置完成后,应删除 kubeadm,并直接对静态 pod 清单进行更改。
2. 根据网络要求更改 --service-cidr
这比较复杂。你可以尝试类似地执行此操作这里或者这里但这种方法容易出错,所以不推荐。
kubeadm reset
更可行、更安全的方法是使用和重新创建集群kubeadm init --service-cidr
。从 Kubernetes 的角度来看,自动更改 CIDR 的选项甚至不是预期的。简而言之,kubeadm 重置是来这里的必经之路。
答案2
关于
我知道 KubletExtraArgs 是指 kubelet 命令行参数,但我不明白这个属性在哪里以及如何修改它。
多个来源,例如这个指向添加到
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
例如
Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"
例如,在这里为静态 pod 的自定义目录设置环境,而不是使用带有
kubelet --pod-manifest-path=/etc/kubelet.d
正如文档中所建议的那样。
如果你用谷歌搜索,$KUBELET_EXTRA_ARGS
你会发现很多有关上述10-kubeadm.conf
文件的例子。