Kubernetes 1.24 の CHANGELOG から SIG Cluster Lifecycle の取り組みについてにピックアップしました。
主要テーマ (Major Themes)
- なし。
重大なアップグレードに関する警告 (Urgent Upgrade Notes)
-
kubeadm/k8s.io/v1beta2
は非推奨になり、3リリース以内(約一年)の将来のバージョンで削除されます。新しいクラスタに対してはkubeadm.k8s.io/v1beta3
を利用してください。ディスクに保存してある古い設定ファイルはkubeadm config migrate
コマンドで移行することができます。 (#107013, @pacoxu) -
kubeadm: デフォルトのcontainerd向けのソケットのパスの設定が Docker のパスでは無くなりました(Unix:
unix:///var/run/containerd/containerd.sock
, Windows:npipe:////./pipe/containerd-containerd
)。もし、クラスタ作成中にInit|JoinConfiguration.nodeRegistration.criSocket
の設定が空白で、複数のソケットが見つかった場合、エラーが発生し、どの値を利用するかについてユーザに尋ねるようになりました。kubeadmのバージョンが1.24以上の場合、kubeletのバージョンが1.23以下であったとしてもディスク状のkubeadmの設定ファイルにdockershimのソケットを含めないようにしてください。kubeadm preflightからdocker
サービスのためのDockerValidator
とServiceCheck
が削除されました。Dockerは現在ホスト検証の際の特別なケースはなく、理想的にはこのタスクは互換性の問題となり、外部のcri-dockerdプロジェクトで行われるべきものです。Dockerのためのdocker cliを使わずに、実行中のコンテナリストの取得や、イメージの取得のようなCRIソケットを介したすべての利用にはcrictl
を使うようにしてください。 (#107317, @neolit123) -
kubeadm: labelsやtaintsから
master
という単語の利用をやめるプランの第二ステージを適用します。新しいクラスタのコントロールプレーンのノードに対してnode-role.kubernetes.io/master
のラベルは付与されず、node-role.kubernetes.io/control-plane
のラベルのみが付与されます。kubeadm upgrade apply
を利用して1.24にアップグレードされるクラスタに対しては、コントロールプレーンのノードから既存のnode-role.kubernetes.io/master
のラベルが削除されます。また、新しいクラスタには、古いtaintであるnode-role.kubernetes.io/master:NoSchedule
と新しいtaintであるnode-role.kubernetes.io/control-plane:NoSchedule
両方がコントロールプレーンのノードに付与されます。1.20リリース時(第一ステージ)のリリースノートでは、前もってこの新しいtaintに対して許容するように指示してありました。kubeadm upgrade apply
を利用して1.24にアップグレードされるクラスタに対しては、既存のコントロールプレーンのノードに新しくnode-role.kubernetes.io/control-plane:NoSchedule
のtaintが付与されます。これらの変更に対応するようお願いします。1.25リリース時に古いtaintであるnode-role.kubernetes.io/master:NoSchedule
は削除されます。 (#107533, @neolit123)-
コントロールプレーンで起動するPodには
role.kubernetes.io/control-plane:NoSchedule
のtaintに対してtolerationを設定してください。 -
コントロールプレーンで起動するPodには、
node-role.kubernetes.io/control-plane
対してセレクタを設定してください。
-
コントロールプレーンで起動するPodには
種類別の変更 (Changes by Kind)
廃止予定 (Deprecation)
-
kubeadm:
UnversionedKubeletConfigMap
Feature Gate がベータになりデフォルトで有効化されました。これにより、1) 新しいクラスターでは古いkubelet-config-x.yy
という命名フォーマットに従ったものではなく、RBACやKubeletのConfigMapの命名フォーマットとしてkube-system/kubelet-config
が利用されるようになります。2)アップグレード中にkubeadmはConfigMapやRBACにこの新しい命名フォーマットを利用します。この機能を無効化するには、新しいクラスタの場合はkubeadmの設定ファイルにてUnversionedKubeletConfigMap: false
を指定してください。既存のクラスタをアップグレードする場合はkube-system/kubeadm-config
中のClusterConfigurationにパッチをすることで振る舞いを上書きしてください。詳細は関連するKEPを読んでください。 (#108027, @neolit123)
APIの変更 (API Change)
- なし。
機能 (Feature)
-
kubeadm:
kubeadm reset
のdry-runのサポートを追加しました。新しいkubeadm reset --dry-run
フラグは既存のkubeadm init/join/upgrade
フラグと同じように、どんな変更が適用されるのかを確認することができるようになります。 (#107512, @SataQiu) -
kubeadm: etcdメンバーのデータ一貫性を保証するために、etcd static Podのマニフェストに
--experimental-initial-corrupt-check
フラグを追加しました。 (#109074, @neolit123) -
kubeadm: kubeadm アップグレード時に、コントロールプレーンノード上のstatic podを再起動するための kubelet を待機する際のエラーをより適切に表示するようにしました。 (#108315, @Monokaix)
-
kubeadm upgrade
時に、コントロールプレーンノード上のstatic podを更新する際、古いstatic podのマニフェストのhashを計算するらしいのですが、その計算時にエラーが発生した場合にちゃんとそのエラーがユーザに戻らないため、なんで失敗したのかわからなくて困ってた、という話らしいです。
-
-
kubeadm: ユーザの YAML/JSON で書かれた設定ファイルの厳密な解析を改善しました。重複したフィールドや未知のフィールドがあった場合、警告を表示し(現場の振る舞い)、そののちに例えば
controlPlaneEndpoint
が正しくControlPlaneEndpoint
が不正、などのような大文字と小文字の区別が正しくないフィールドに対する警告も表示するようにしました。init
時とjoin
時に警告を表示するだけでなく、ClusterConfiguration
,KubeletConfiguration
またはKubeProxyConfiguration
をクラスターからダウンロードする際にも警告を表示するようにしました。この警告はユーザがそれぞれのConfigMapを間違ってパッチしていた場合に便利です。 (#107725, @neolit123)
バグ修正 (Bug or Regression)
-
kubeadm: kubeconfigファイルの証明書の期限をチェックする際に、
certs check-expiration
コマンドにてクラスタのCA key(ca.key file)を必要としないようになりました。 (#106854, @neolit123) -
kubeadm:
certs check-expiration
コマンドの実行中、etcd CAキーファイル(etcd/ca.key
)がない場合はetcd CAを外部CAとして扱い、etcd CAによって署名された証明書に適切な検証を実行します。さらに、ディスク上の証明書とkubeconfig
ファイル内の証明書の両方について、出力テーブルのすべてのエントリのCAが含まれていることを確認するようにしました。 (#106891, @neolit123) -
kubeadm:
KubeletConfiguration
のresolvConf
フィールドの値が/run/systemd/resolve/resolv.conf
と一致しない場合に出力される警告に関連するバグを修正しました。 (#107785, @chendave)-
resolvConf
に/run/systemd/resolve/resolv.conf
を設定していても、/run/systemd/resolve/resolv.conf
を設定していない、という警告が出ていたようです。 - 修正を見ると、文字列を比較するつもりがポインタ同士を比較してミスっていたようです。
-
-
kubeadm:
/etc/kubernetes/pki
にあるCAファイル(ca.key
/ca.crt
)と共にkubeadm init --dry-run
を使った際のバグを修正しました。 (#108410, @Haleygo)-
ca.key
,ca.crt
がある状態でkubeadm init --dry-run
が動作しなかったようです。 - 既存の CAファイルを考慮してdry-runしていなかったようです。
-
-
kubeadm: preflight errorが起こり、IPv6を利用したクラスターにWindowsノードがJoinできなかった問題を修正しました。 (#108769, @SataQiu)
-
kubeadm:
kubeadm certs generate-csr
コマンドが重複するSANsを取り除かなかったバグを修正しました。 (#107982, @SataQiu)
その他 (Other (Cleanup or Flake))
-
kubeadm: すべての警告メッセージが、標準出力ではなく、標準エラー出力に表示されるようになりました。 (#107467, @SataQiu)
-
kubeadm: 新しいクラスタを作成する際の dockershim 関連フラグの削除に対する処理を追加しました。kubeletのバージョンが1.23以下、かつkubeadmのバージョンが1.24以上の場合は、ユーザがkubeadmの設定ファイルである
{Init|Join}Configuration.nodeRegistration.criSocket
にUnixにおいてはunix:///var/run/dockershim.sock
、Windowsにおいてはnpipe:////./pipe/dockershim
を設定した場合、ビルトインのdockershimを利用し続けることができます。もし、kubeletのバージョンが1.24以上かつ、kubeadmのバージョンが1.24以上の場合はすべてのコンテナランタイムを--container-runtime=remote --container-runtime-endpoint=scheme://some/path
のフラグを利用して "remote"として取り扱います。kubeletのバージョン1.23以下の場合の特別な処理は、kubeadm 1.25で削除されます。 (#106973, @neolit123) -
kubeadm:
kubeadm init/join
がkubeletに--container-runtime-endpoint
を渡す際に、常にURLスキーム(Linux:unix://
, Windows:npipe://
)を使うようにしました。このフラグの値はkubeadmの設定ファイルのcriSocket
フィールドか、CLIの--cri-socket
フラグから得られた値です。ユーザの設定にURLスキームが欠けていた場合はメモリ内で自動的に追加されますが、ユーザにはディスクに保存された設定ファイルを更新するように警告がなされます。kubeadm upgrade apply/node
コマンドの実行時に、必要な場合はNodeオブジェクトに対するkubeadm.alpha.kubernetes.io/cri-socket
アノテーションとディスク上の/var/lib/kubelet/kubeadm-flags.env
ファイルが変更されます。これらの自動的な振る舞いは一時的なもので将来のバージョンで削除されます。また、将来のkubeletでURLスキームが設定されていないCRIのエンドポイントはサポートされなくなるかもしれません。 (#107295, @neolit123) -
kubeadm: いくつかのkubeadmのコマンドで出力の機械可読性のために利用されている非推奨の
output/v1alpha1
APIが削除されました。kubeadm の 1.23 ではすでにoutput/v1alpha2
を利用していました。 (#106648, @calvin0327) -
kubeadm:
ca.crt
に一つの証明書しか含むことができないという制約を削除しました。複数の証明書がca.crt
に含まれていた場合、kubeadmは最初の証明書をデフォルトで利用します。 (#107327, @SataQiu)- 外部のCAを利用する場合、その証明書には全ての証明書チェーンの証明書が含まれている場合があります。