🏷️

Kubernetes推奨ラベルとラベルの更新方法について

に公開

概要

k8sにはlabelという属性があります
これは主にリソースをグルーピングするために使用し、ユーザー側で自由に付与できます

ラベル(Labels) はPodなどのオブジェクトに割り当てられたキーとバリューのペアです。
ラベルはユーザーに関連した意味のあるオブジェクトの属性を指定するために使われることを目的としています。

推奨ラベル

自由に付与が可能ですが、自由がある分どのようなラベルを付与すればいいか迷うと思います
そんな時のために推奨ラベルというものがKubernetesドキュメントにあります
https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/common-labels/

推奨されるラベルを使用することで、ツールで横断的にグルーピングが可能であり管理もしやすくなると思われます

推奨されているラベル一覧は以下です

キー 説明
app.kubernetes.io/name アプリケーション名 mysql 文字列
app.kubernetes.io/instance アプリケーションのインスタンスを特定するための固有名 mysql-abcxzy 文字列
app.kubernetes.io/version アプリケーションの現在のバージョン (例: セマンティックバージョン、リビジョンのハッシュなど) 5.7.21 文字列
app.kubernetes.io/component アーキテクチャ内のコンポーネント database 文字列
app.kubernetes.io/part-of このアプリケーションによって構成される上位レベルのアプリケーション wordpress 文字列
app.kubernetes.io/managed-by このアプリケーションの操作を管理するために使われているツール helm 文字列

実装例

公式の使用例が以下にあります
https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/common-labels/#ラベルの使用例

マイクロサービスで付与する場合私は以下のようにしました

共通付与

  • app.kubernetes.io/part-of
    • configmapsecretなど、namespace間で共通利用するリソースに関してはこのラベルだけ付与を行いました

各マイクロサービス、Serviceなど

  • app.kubernetes.io/name
  • app.kubernetes.io/component
  • app.kubernetes.io/instance
    • 同一マイクロサービスで複数instanceが必要な場合
    • 例えばHA構成のprimary, backupなど

階層構造としては以下のようになるのかなと思います
part-of > component > name > instance

プロジェクトによってどれくらいの深さになるのかはまちまちだと思います
全部付与する必要はないので、ドメインを整理してどれくらいの階層構造になるのか整理すると判断しやすいと思います

wordpress > server > db
wordpress > db > mysql

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: artemis
    app.kubernetes.io/instance: artemis-primary
    app.kubernetes.io/component: messaging
    app.kubernetes.io/part-of: ec-test

明示的な再作成が必要なリソースについて

ラベルの更新は基本的には自由に行うことができます
ですが、labelSelectorに使用されているラベルについてはimmutableであるため適応するとエラーが発生します

v1.LabelSelector{MatchLabels:map[string]string{“app”:“nginx”}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

これらに使用しているラベルを更新したい場合は再作成を行う必要があります
immutableになった経緯は以下で議論されています

https://github.com/kubernetes/kubernetes/issues/50808

更新方法

以下の2つの方法を使用することで更新が可能です
どちらの方法でも既存のリソースは削除されているため、本番環境での適応は慎重に行う必要があります

Deleteを使う方法

こちらは単純にdeploymentの削除を行い再作成する方法です

kubectl delete deployment/**** -n XXXX
kubectl apply sample.yml

replaceを使う方法

リソースの再作成を行うコマンドであるreplaceを使用する方法です
更新を行ったマニフェストを指定して実行します

kubectl replace sample.yml

https://note.com/minato_kame/n/nd9aa29389ea3
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_replace/

Instiny Tech Blog

Discussion