🔰

k8s.gcr.io の凍結対応から学んだことメモ

2023/03/19に公開

今まで Kubernetes プロジェクトのコンテナ イメージをホストしていたイメージ レジストリ k8s.gcr.io が凍結されることが発表されました。
この記事では、k8s.gcr.io から registry.k8s.io に移行する過程で学んだことについて、備忘としてメモします。

この記事で書いてあること

  • k8s.gcr.io から registry.k8s.io に移行した流れ
  • helm で、dependencies によって外部の chart を install している場合に、外部の chart の values を設定する方法
  • skopeo によりローカルで docker を起動せずにイメージ レポジトリのタグをリストする方法

背景

Kubernetes プロジェクトで使用しているイメージ レジストリが 2023/02/06 に凍結されることが発表されました。
k8s.gcr.io Image Registry Will Be Frozen From the 3rd of April 2023 | Kubernetes

ブログ記事によると、下記のことが記載されています。

  • 新しいイメージ レジストリである registry.k8s.io に移行されること
  • 凍結後は新しいイメージが k8s.gcr.io に push されることはなくなること

凍結によって既存のイメージが削除されるわけではなく、また後日の発表により 2023/03/20 に k8s.gcr.io から registry.k8s.io へのリダイレクトが発表されたことにより、直ちに影響を受けない環境も多いと思います。
k8s.gcr.io Redirect to registry.k8s.io - What You Need to Know | Kubernetes
※ URL フィルタリングをしているケースなど、リダイレクト後に使用できないケースもあるので、詳細はブログを参照ください。

しかし、古いレジストリである k8s.gcr.io の廃止についても触れているため、早めに移行する必要があるため、レジストリの移行を行いました。

イメージ レジストリ移行の流れ

私が参画しているプロジェクトでのイメージ レジストリの移行は下記の流れで行いました。

  1. Kubernetes クラスターで起動している Pod から k8s.gcr.io のイメージを特定する。
  2. manifest でイメージを差し替える。

1. Kubernetes クラスターで起動している Pod から k8s.gcr.io のイメージを特定する

イメージの特定については、元のブログ記事である「k8s.gcr.io Image Registry Will Be Frozen From the 3rd of April 2023 | Kubernetes」に記載されているコマンドにより確認ができます。

ただし、Job など一時的にしか立ち上がらない Pod については表示されない可能性があるため、注意が必要です。
具体的なケースとして、kube-prometheus-stack | prometheus-community/helm-charts で使用されている kube-webhook-certgen が挙げられます。

2. manifest でイメージを差し替える

helm chart を使っている場合、最新の helm chart を使用することで、デフォルトの value として新しいイメージ レジストリを使用しているケースが多いです。

使用していない場合や helm chart を新しくできない場合でも value により新しいイメージ レジストリを指定することで対応できました。

helm の subchart の values を設定する

ほとんどの helm chart については上述した方法でイメージ レジストリの移行ができたのですが、dependencies を使用して外部の helm chart を呼び出しているケース (subchart) でイメージ レジストリを変更する方法がわかりませんでした。

対応方法について調べたところ、Helm | Subcharts and Global Values に記載された方法により、subchart の value を親の chart から指定できることがわかりました。

先ほど同様、kube-prometheus-stack | prometheus-community/helm-charts を例に、どのように記述するか記載します。

kube-state-metrics:
  registry: registry.k8s.io

上記サンプルの 1 行目のように、まず subchart の名称を記載します。
kube-prometheus-stack の場合、Chart.yaml に記載されています。
https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/Chart.yaml#L42

そして、2 行目以降に subchart の values.yaml で定義されている value を記載します。
https://github.com/prometheus-community/helm-charts/blob/kube-state-metrics-5.0.0/charts/kube-state-metrics/values.yaml#L4
最新の kube-state-metrics の helm chart では registry.k8s.io が指定されているのですが、私のプロジェクトでは k8s.gcr.io となっていたため、この対応が必要でした。

skopeo によるイメージ レポジトリのタグをリストする

設定する方法は上記のようにわかりましたが、念の為新しいイメージ レジストリに現在使用しているタグが存在するかを確認したくなります。

今回はコンテナ デーモンを実行していなくても確認できる方法として、skopeo を使用しました。

インストール方法は マニュアル を参照してください。
Mac の場合、Homebrew でインストールすることができます。

skopeo によりイメージのタグを調べる方法は下記の通りです。

$ skopeo list-tags docker://registry.k8s.io/kube-state-metrics/kube-state-metrics
{
    "Repository": "registry.k8s.io/kube-state-metrics/kube-state-metrics",
    "Tags": [
        "2.0.0-alpha",
        "2.0.0-alpha.1",
        "2.0.0-alpha.2",
        "sha256-5658d0011a41779ef114f3508143a0e67e4169f64333d0337e731d191ab7edb8.sig",
        "sha256-955869d5ae91ee4f46f07f27db43eeb10ba93586ecd921a8c05e4b196fb63322.sig",
        "sha256-a15ca437f2309b769caa36a88240ce0266d67028f02da90f1c817c849b144273.sig",
        "sha256-bdab4e49d71d272cf944c8612dff5ab1250f0fafdae45c22980286ac0c016032.sig",
        "sha256-ec5732e28f151de3847df60f48c5a570aacdb692ff1ce949d97105ae5e5a6722.sig",
        "v1.9.8",
        "v2.0.0",
        "v2.0.0-alpha.2",
        "v2.0.0-alpha.3",
        "v2.0.0-beta",
        "v2.0.0-rc.0",
        "v2.0.0-rc.1",
        "v2.1.0",
        "v2.1.0-rc.0",
        "v2.1.1",
        "v2.2.0",
        "v2.2.1",
        "v2.2.3",
        "v2.2.4",
        "v2.3.0",
        "v2.4.1",
        "v2.4.2",
        "v2.5.0",
        "v2.6.0",
        "v2.7.0",
        "v2.8.0",
        "v2.8.1",
        "v2.8.2"
    ]
}

まとめ

レジストリ凍結の対応としてはシンプルでしたが、その過程で helm の subchart などを学べて良い機会でした。

Discussion