kubeadm を使用して kubelet とコントロールプレーンの設定を変更するための適切な方法は何ですか?

kubeadm を使用して kubelet とコントロールプレーンの設定を変更するための適切な方法は何ですか?

kubeadm initUbuntu 20.04に、とを使用して3つのマスターと3つのノードを持つKubernetes(v1.20.0)クラスターをインストールしました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は各マスター上で静的ポッドとして実行され、から設定を読み込んでいます/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名前が示すように、クラスターで現在実行されているものではなく、デフォルト値のみが提供されます。クラスターがすでに初期化されているため、ClusterConfiguration を抽出してkubectl -n kube-system get cm kubeadm-config -o yaml実行しようとすると、kubeadm init --config <config>あらゆる方法で失敗します。

Kubeadmは実行できます初期化フェーズ制御プレーンこれにより、静的ポッド マニフェストは更新されますが、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ファイルをすべてのマスターに配布する
  • 各マスターごとに、kubeadm init phase control-plane all --config <yaml>

ここで私が懸念しているのは、静的ポッド マニフェストと ClusterConfiguration の間に明らかな断絶があることです。変更はそれほど頻繁に行われないため、1 つの場所で変更を行うと、他の場所でも手動で変更する必要があることを忘れがちです。

kubernetesコンポーネントとkubeadm間の一貫性を保証するkubeletとコントロールプレーンの設定を更新する方法はありませんか?私はまだKubernetesの初心者で、たくさん周りのドキュメントがたくさんあるので、何か明らかなことを見逃していたらごめんなさい。

答え1

あなたの質問の両方にお答えしたいと思います。


1. すべてのノードに --cloud-provider=external kubelet 起動フラグを追加します。

この .NodeRegistration.KubeletExtraArgs はどこにあり、クラスター内のすべてのノードに対してこれを変更するにはどうすればよいですか?

KubeletExtraArgskubeletでサポートされている引数とパラメータです。これらは文書化されていますここ変更するには、適切なフラグを指定したコマンドを使用する必要がありますkubelet。また、使用しようとしているフラグは k8s v1.23 で削除されることに注意してください。

--cloud-provider stringクラウド サービスのプロバイダー。クラウド プロバイダーなしで実行するには、空の文字列に設定します。設定されている場合、クラウド プロバイダーがノードの名前を決定します (ホスト名が使用されているかどうか、またどのように使用されているかを確認するには、クラウド プロバイダーのドキュメントを参照してください)。(非推奨: Kubelet からクラウド プロバイダー コードを削除するため、1.23 で削除されます。)

編集:

以下に関するご質問に適切にお答えします:.NodeRegistration.KubeletExtraArgs

これらはまた、kubeadm init 設定ファイル:

kubeadm initコマンドライン フラグの代わりに構成ファイルを使用して構成することも可能です。また、より高度な機能の一部は、構成ファイル オプションとしてのみ使用できる場合があります。このファイルはフラグを使用して渡され、 構造体と、オプションで で区切られた複数の構造体が--config含まれている必要があります。他のフラグとの混在は 、場合によっては許可されないことがあります。ClusterConfiguration---\n--config

さらに詳しい情報については、ノード登録オプションまた、構成のフィールドと使用方法に関する詳細情報も表示されます。

また、次の点に注意してください。

KubeletExtraArgskubeletに追加の引数を渡します。ここでの引数は環境ファイルを介してkubeletのコマンドラインに渡されます。

kubeadmは実行時にkubeletのソースに書き込みます。これはkubelet-config-1.Xの一般的な基本レベル設定を上書きします。 ConfigMap

フラグは解析時に優先されます。これらの値はローカルであり、kubeadm が実行されているノードに固有です。

編集2:

kubeadm initフラグまたは構成ファイルと共に使用する場合、クラスターを作成するときに 1 回だけ使用する必要があります。異なる値で再度実行して構成を変更することはできません。ここkubeadm とその使用方法に関する情報が見つかります。クラスターがセットアップされたら、kubeadm を削除し、静的ポッド マニフェストに直接変更を加える必要があります。


2. ネットワーク要件に応じて--service-cidrを変更する

これはもっと複雑です。同じように次のようにやってみてください。ここまたはここしかし、このアプローチは間違いを起こしやすいため、あまりお勧めできません。

より現実的で安全な方法は、単にkubeadm resetとを使用してクラスタを再作成することですkubeadm init --service-cidr。CIDRを自動的に変更するオプションは、Kubernetesの観点からは予想されていませんでした。つまり、kubeadm リセットここで行くべき道です。

答え2

に関して

KubletExtraArgs は kubelet コマンドライン引数を参照することは理解していますが、この属性がどこにあり、どのように変更できるかがわかりません。

複数の情報源、例えばこれです追加することを指摘する

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

例えば次のような行

Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"

たとえば、ここで静的ポッドのカスタムディレクトリの環境を設定するには、cliを使用する代わりに

kubelet --pod-manifest-path=/etc/kubelet.d

ドキュメントに記載されているとおりです。

Google で検索すると、$KUBELET_EXTRA_ARGS前述のファイルに関する多くの例が見つかります10-kubeadm.conf

関連情報