導入:なぜLabelsとSelectorsが重要なのか
Kubernetes(K8s)の運用において、最も重要な概念の一つが「疎結合」です。従来のサーバー管理では、IPアドレスやホスト名で特定のサーバーを直接指定して管理することが一般的でした。しかし、K8sではPodが頻繁に入れ替わるため、固定的な指定は破綻を招きます。ここで登場するのが「Labels」と「Selectors」です。これらを活用することで、リソース間の依存関係を動的に解決し、運用の自動化と可用性を劇的に向上させることができます。
基礎知識:LabelsとSelectorsとは何か
Labels(ラベル)は、Kubernetesオブジェクト(Pod、Service、Deploymentなど)に付与する「キーと値」のペアです。例えば「app: web-server」「env: production」といったメタデータを自由に設定できます。
一方、Selectors(セレクター)は、そのラベルを条件として指定し、特定のリソースを抽出するためのフィルターのような役割を果たします。
この仕組みにより、特定のPodがどのServiceに属するか、どのDeploymentがどのPodを管理すべきかを、名前やIPではなく「属性」に基づいて定義できるようになります。これがK8sにおける「動的制御」の根幹です。
実装:ラベルによるリソースの紐付け
実装の基本は、Deployment(管理側)のテンプレートにあるラベルと、Service(接続側)のセレクターを一致させることです。これにより、新しいPodが起動した瞬間に自動的にトラフィックの対象として組み込まれるという、疎結合な連携が実現します。
サンプルプログラム:DeploymentとServiceの連携定義
以下は、Webサーバーをデプロイし、それをServiceで公開する際の設定例です。
Deploymentの設定(Podにラベルを付与)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-web-app # ここで指定したラベルを持つPodを管理する
template:
metadata:
labels:
app: my-web-app # Pod自体にこのラベルを付与
spec:
containers:
- name: nginx
image: nginx:latest
Serviceの設定(ラベルで紐付け)
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: my-web-app # Deploymentのラベルと一致させることでPodを特定する
ports:
- protocol: TCP
port: 80
targetPort: 80
応用・注意点:現場で陥りやすい罠
実運用で最も多いミスは「ラベルの不一致」です。Serviceのselectorで指定したラベルと、Podに付与されたラベルが一つでも異なると、通信が通らなくなります。
また、運用中の注意点として、稼働中のPodからラベルを削除したり変更したりすると、その瞬間にServiceやDeploymentの管理対象から外れてしまう(オーケストレーションの整合性が崩れる)可能性があるため、本番環境でのラベル操作は慎重に行う必要があります。
現場では、ラベルの命名規則(命名規則の統一)をチーム内でドキュメント化し、CI/CDパイプラインを通じて自動的にラベルが付与される仕組みを構築することをおすすめします。

コメント