Kubernetes推奨ラベルとラベルの更新方法について
概要
k8sにはlabelという属性があります
これは主にリソースをグルーピングするために使用し、ユーザー側で自由に付与できます
ラベル(Labels) はPodなどのオブジェクトに割り当てられたキーとバリューのペアです。
ラベルはユーザーに関連した意味のあるオブジェクトの属性を指定するために使われることを目的としています。
推奨ラベル
自由に付与が可能ですが、自由がある分どのようなラベルを付与すればいいか迷うと思います
そんな時のために推奨ラベルというものがKubernetesドキュメントにあります
推奨されるラベルを使用することで、ツールで横断的にグルーピングが可能であり管理もしやすくなると思われます
推奨されているラベル一覧は以下です
| キー | 説明 | 例 | 型 |
|---|---|---|---|
| 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 | 文字列 |
実装例
公式の使用例が以下にあります
マイクロサービスで付与する場合私は以下のようにしました
共通付与
- app.kubernetes.io/part-of
-
configmapやsecretなど、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になった経緯は以下で議論されています
更新方法
以下の2つの方法を使用することで更新が可能です
どちらの方法でも既存のリソースは削除されているため、本番環境での適応は慎重に行う必要があります
Deleteを使う方法
こちらは単純にdeploymentの削除を行い再作成する方法です
kubectl delete deployment/**** -n XXXX
kubectl apply sample.yml
replaceを使う方法
リソースの再作成を行うコマンドであるreplaceを使用する方法です
更新を行ったマニフェストを指定して実行します
kubectl replace sample.yml
Discussion