2.8K Views
September 09, 23
スライド概要
DMMでやっていた輪読会のための発表資料
LabelとAnnotationについての話をまとめた
SlideShareが使いにくくなってしまったのでこちらに全部移してみた。 - 勉強会で使った資料 - イベントでの登壇資料 等を中心に上げてあります。
「入門Kubernetes」輪読会 6章 Label と Annotation 2018/5/30 佐々木 健
この文書について 毎週水曜日にDMM社内で開催されている輪読会の 資料です。 30分の枠で、みんなでちょっとずつ読んでいくぞ。
今までの振り返り 1章: Kubernetesの概要 2章: Dockerの説明 3章: Kubernetesクラスタの作り方 4章: Kubernetes API、kubectlコマンドの説明 5章: Podの説明
今日の内容(目次) 6章: Label と Annotation ● ● 6.1 Label ● 6.1.1 Labelの適用 ● 6.1.2 Labelの変更 ● 6.1.3 Labelセレクタ ● 6.1.4 APIオブジェクト内のLabelセレクタ 6.2 Annotation ● 6.2.1 Annotationの定義 ● 6.3 後片付け ● 6.4 まとめ
今日の内容(ゴール) ● Label 機能について学ぶ ● ● ● Label機能の目的 ● オブジェクトのグループ化ができる ● 一覧表示、操作 Labelの使い方 Annotation機能について学ぶ ● Annotation機能の目的 ● オブジェクトに対するメタデータ付与 ● Annotationの使い方 ● Labelとの使いわけ
6章 イントロ ● Kuberenetesはアプリケーションが大きく複雑に なっても、うまく管理するための機能が用意され ている。 ● ● 沢山のKubernetesオブジェクトをグルーピングするため のLabel機能 個々のKubernetesオブジェクトに追加情報を付与する Annotation機能
6.1 Label (目的) ● Labelはどういう目的で作られたか? ● 巨大なアプリケーションを動かしてきたGoogleの経験か ら生まれてきたもの。 ● 詳しくは「SRE本」を読め、とのこと。 ● ● ● どこが該当するか良くわからんかったけどまあ全体なのかしら? 本番環境においては、1つしか作らない、ということは まずない。なので1つずつ管理するこということはせず に、まとめて管理したい。 階層構造はうまく機能しない。フラットに管理したい。
6.1 Label (構造1) ● キーと値(key、value)のペア。 ● Kubernetesオブジェクトに付与する。 ● 1つのオブジェクトに、Labelは複数付与できる。
6.1 Label (構造2) ● キーと値はどちらも文字列 ● キーは、プレフィックス(オプション)+名前 ● ● ● プレフィックスはDNSサブドメイン ● プレフィックスはオプションなのでなくても良い ● プレフィックス長は253文字以内 ● プレフィックスと名前の間の区切りは”/” 名前は63文字以内 ● 先頭と末尾は必ずアルファベット文字列か数字 ● 途中は、”-”、”_”、”.” を使っても良い 値は63文字以内の文字列 ● 使っていい文字列は名前と一緒
6.1 Label に関する情報 ● https://kubernetes.io/docs/concepts/overvie w/working-with-objects/labels/ Motivation Labels enable users to map their own organizational structures onto system objects in a loosely coupled fashion, without requiring clients to store these mappings. Service deployments and batch processing pipelines are often multi-dimensional entities (e.g., multiple partitions or deployments, multiple release tracks, multiple tiers, multiple micro-services per tier). Management often requires cross-cutting operations, which breaks encapsulation of strictly hierarchical representations, especially rigid hierarchies determined by the infrastructure rather than by users.
表6.1 Labelの例 キー 値 acme.com/app-version 1.0.0 appVersion 1.0.0 app.version 1.0.0 kubernetes.io/cluster-service true
6.1.1 に進む前の準備 ● ● ● 6.1.1から先は実際に、kubectlコマンドを使って LabelやAnnotationを操作していく。 なので、kubectlコマンドを動かせる環境は用意 しておく必要がある。 詳しくは、3章を参考のこと ● Google Cloud Platform を使うのがやっぱり楽ちん
ちょっと目をつぶること ● Deployment という機能が、しれっと出てくる。 ● バージョンのリリース管理に使われる機能 ● Podの集まりを作成できる ● 詳しくは12章 ● ● この章では、Deploymentオブジェクトに、Labelを付けていく、 という例で使われている。 ReplicaSet という機能も、しれっと出てくる。 ● Podのレプリカを簡単に管理する機能 ● 詳しくは8章
6.1.1 Labelの適用 ● Labelを付けたDeployment を作成する。 ● alpaca、banbicoot という2つのアプリケーションを作る ● それぞれ別の環境に置く ● バージョンもそれぞれ2つ作る
6.1.1 具体的なコマンド kubectl run alpaca-prod \ --image=gcr.io/kaur-demo/kuard-amd64:1 \ --replicas=2 \ --labels="ver=1,app=alpaca,env=prod" kubectl run alpaca-test \ --image=gcr.io/kaur-demo/kuard-amd64:2 \ --replicas=1 \ --labels="ver=2,app=alpaca,env=test" kubectl run bandicoot-prod \ --image=gcr.io/kaur-demo/kuard-amd64:2 \ --replicas=2 \ --labels="ver=2,app=bandicoot,env=prod" kubectl run bandicoot-staging \ --image=gcr.io/kaur-demo/kuard-amd64:2 \ --replicas=1 \ --labels="ver=2,app=bandicoot,env=staging" ● ● 4つのアプリケーショ ンを作っている 紫のところが上と異 なるところ。
(余談) オブジェクト定義の行数 % kubectl get deployments -o=yaml | wc 246 458 6524 % kubectl get pods -o=yaml | wc 576 1180 18365 ● オブジェクトの定義をyamlで吐き出してみると、 結構な行数になっているのがわかる。
(余談) Yamlを眺める apiVersion: extensions/v1beta1 kind: Deployment metadata: ..... labels: app: alpaca canary: "true" env: test ver: "2" ..... spec: replicas: 2 selector: matchLabels: app: alpaca env: prod ver: "1" ..... ..... ● ● ● こんな感じで定義さ れる。 metadataの中で定 義されている。 selectorの中にも定 義される。
Labelを見る % kubectl get deployments --show-labels NAME DESIRED CURRENT UP-TO-DATE alpaca-prod 2 2 2 alpaca-test 1 1 1 bandicoot-prod 2 2 2 bandicoot-staging 1 1 1 ● AVAILABLE 0 0 0 0 AGE 22h 22h 22h 22h LABELS app=alpaca,env=prod,ver=1 app=alpaca,env=test,ver=2 app=bandicoot,env=prod,ver=2 app=bandicoot,env=staging,ver=2 Deploymentオブジェクト毎にLabelが付けられて いるのがわかる。
特定のLabelの値を見る (6.1.2) % kubectl get deployments -L NAME DESIRED alpaca-prod 2 alpaca-test 1 bandicoot-prod 2 bandicoot-staging 1 ● app CURRENT 2 1 2 1 UP-TO-DATE 2 1 2 1 AVAILABLE 0 0 0 0 -L オプションで見ることができる AGE 22h 22h 22h 22h APP alpaca alpaca bandicoot bandicoot
PodのLabelはどうなってる?(6.1.3) % kubectl get pods --show-labels NAME alpaca-prod-5d649f7444-864f7 hash=1820593000,ver=1 alpaca-prod-5d649f7444-8h2nc hash=1820593000,ver=1 alpaca-test-b5ddbb4db-7xwvk bandicoot-prod-56f8f74f8b-jg7ss hash=1294930946,ver=2 bandicoot-prod-56f8f74f8b-wmq8h hash=1294930946,ver=2 bandicoot-staging-84bb77d6-8585q hash=40663382,ver=2 READY 0/1 STATUS ImagePullBackOff RESTARTS 0 AGE 22h LABELS app=alpaca,env=prod,pod-template- 0/1 ImagePullBackOff 0 22h app=alpaca,env=prod,pod-template- 0/1 0/1 ImagePullBackOff ImagePullBackOff 0 0 22h 22h app=alpaca,env=test,pod-template-hash=618866086,ver=2 app=bandicoot,env=prod,pod-template- 0/1 ImagePullBackOff 0 22h app=bandicoot,env=prod,pod-template- 0/1 ErrImagePull 0 22h app=bandicoot,env=staging,pod-template- ● DeploymentオブジェクトのLabelが継承されている。 ● Replica分、Podが複製されている。 ● pod-template-hashというLabelはDeploymentによって付けられ たもので、どのテンプレートからPodが作成されたのかを追跡でき るようにしている。
6.1.2 Labelの変更 % kubectl label deployments alpaca-test "canary=true" deployment "alpaca-test" labeled % kubectl label deployments alpaca-test "canary-" deployment "alpaca-test" labeled ● 作成後もLabelを追加したり修正したりできる。 ● 削除はLavelの「キー」の末尾に”-”を付ける ● 本では値の末尾って書いてあるけど多分間違い
6.1.3 Labelセレクタ ● ● ● Labelを付けるのは、オブジェクトをグルーピング するため 複数のオブジェクトから、該当するグループのオ ブジェクトを操作したり、指定したり、関連付けし たりするために使う。 kubectl コマンドでは --selector フラグを使って 指定することができる。 ● 特定のグループだけ削除、みたいなこともできる。 ● -l オプションでもだいたいOK。
具体例1 % kubectl get pods --selector="ver=2" NAME READY alpaca-test-b5ddbb4db-7xwvk 0/1 bandicoot-prod-56f8f74f8b-jg7ss 0/1 bandicoot-prod-56f8f74f8b-wmq8h 0/1 bandicoot-staging-84bb77d6-8585q 0/1 STATUS ImagePullBackOff ImagePullBackOff ImagePullBackOff ImagePullBackOff RESTARTS 0 0 0 0 AGE 1d 1d 1d 1d
具体例2 % kubectl get pods --selector="app in (alpaca,bandicoot)" NAME READY STATUS alpaca-prod-5d649f7444-864f7 0/1 ImagePullBackOff alpaca-prod-5d649f7444-8h2nc 0/1 ImagePullBackOff alpaca-test-b5ddbb4db-7xwvk 0/1 ImagePullBackOff bandicoot-prod-56f8f74f8b-jg7ss 0/1 ImagePullBackOff bandicoot-prod-56f8f74f8b-wmq8h 0/1 ImagePullBackOff bandicoot-staging-84bb77d6-8585q 0/1 ImagePullBackOff RESTARTS 0 0 0 0 0 0 AGE 1d 1d 1d 1d 1d 1d
具体例3 % kubectl label deployments alpaca-test "canary=true" deployment "alpaca-test" labeled % kubectl get deployments --selector="canary" NAME DESIRED CURRENT UP-TO-DATE AVAILABLE alpaca-test 1 1 1 0 AGE 1d
表6.2 セレクタで使える演算子 演算子 説明 key=value key は value である key!=value key は value ではない key in (value1, value2) key は value1 か value2 のどちらかである key notin (value1, value2) key は value1 と value2 のどちらでもない key keyが設定されている !key keyが設定されていない
6.1.4 APIオブジェクト内の Labelセレクタ ● ● Kuberenetsオブジェクトが他のKubernetesオブ ジェクトを参照する際にもLabelセレクタが使わ れる。 Labelセレクタは単純な文字列表現だけでなく、 パース可能な構造体でも表現できる。
(再掲) Yamlを眺める apiVersion: extensions/v1beta1 kind: Deployment metadata: ..... labels: app: alpaca canary: "true" env: test ver: "2" ..... spec: replicas: 2 selector: matchLabels: app: alpaca env: prod ver: "1" ..... ..... ● ● Labelはこういうオブ ジェクト構造になって いる。 selectorの定義が書 かれているが、これ は単純な文字列表現 の例
パース可能な構造体で書かれた例 ● app=alpaca, ver in (1,2) ● これは以下のように表現できる selector: matchLabels: app: alpaca matchExpressions: - {key: ver, operator: In, values: [1,2]}
6.2 Annotation ● ● ● ● Annotationはツールやライブラリを手助けするた めのメタデータ置き場 オブジェクトに関連する情報をなんでも付与でき る。 Kubernetesのいろいろな機能で使われている。 ただし、Labelと違ってセレクタ的な使い方はでき ない。
6.2 Annotation に関する情報 ● https://kubernetes.io/docs/concepts/overvie w/working-with-objects/annotations/ Attaching metadata to objects You can use either labels or annotations to attach metadata to Kubernetes objects. Labels can be used to select objects and to find collections of objects that satisfy certain conditions. In contrast, annotations are not used to identify and select objects. The metadata in an annotation can be small or large, structured or unstructured, and can include characters not permitted by labels.
6.2.1 Annotationの定義 ● ● Labelと同じフォーマットを使用できる。 値の部分はフリーフォーマット。Labelと違って柔 軟性は高い ● バリデーションはされない。
kubectlでAnnotationの設定 % kubectl annotate deployments alpaca-test description='hogehoge' deployment "alpaca-test" annotated % kubectl annotate deployments alpaca-test descriptiondeployment "alpaca-test" annotated ● labelコマンドを同じように annotate で設定できる ● 削除は「キー」の末尾に”-”を付ける
Yaml内のAnnotation表現 apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "1" description: hogehoge
6.3 後片付け ● kubectl delete deployment --all
6.4 まとめ ● LabelとAnnotationについて学んだ。 ● グルーピングにはLabelを便利に使いましょう。 ● ● ● オブジェクト間で参照するためのセレクタという仕組みもある オブジェクトにメタデータを付与するためには Annotationをうまく使いましょう。 Label、Annotationをうまく使うと、Kubernetesはよ り柔軟に使うことができる。 ● 自動化、ワークフロー構築、等で便利
今回のセクションの感想 ● ● ● ● やっぱりこの本、説明がいまいちな感がある。 説明が下手だったり妙なジャンプがあったり、1人で読んでたら心が 折れる気がした。 Kubernetesは概念とか用語をすぐには理解しにくいので、とりあえ ずいじってみつつ、適当にリファレンスを見ていく、みたいな勉強方 法が良いのかなあ。 でもまあ、Kubernetesは考え方がエレガントで良くできてるなあ、 とは今回も思った。 ● すべてがオブジェクト、APIを使ってやりとりをする、APIを気軽に叩くために kubectl がある、環境ができちゃえばサクサクいじれる、等々、いろいろ格 好良い。
おしまい