このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Kubernetes入門:サービスの定義ファイルを作成する

Kubernetesでアプリケーションを稼働させる際、デプロイメントとセットでよく使用されるのがサービスです。サービスの役割は、Podへのアクセスを管理し、内部や外部のクライアントが適切にPodと通信できるようにすることです。サービスの定義ファイルはデプロイメントよりもシンプルですが、通信に関する重要な設定が含まれます。

サービスの定義ファイルの書き方
サービスの定義ファイルには、metadataとspecという2つの大項目の設定が中心となります。サービスの設定項目は以下の通りです。
apiVersion:
kind:
metadata:
name: ←サービスの名前を設定します
spec:
type: ←サービスの種類(ClusterIP, NodePort, LoadBalancer, ExternalName)
ports: ←通信に関するポート設定
- port: ←サービスが公開するポート番号
targetPort: ←コンテナの内部で使用するポート番号
protocol: ←使用するプロトコル(通常はTCP)
nodePort: ←NodePortタイプを使用する場合に指定するワーカーノードのポート番号
selector: ←対象となるPodを識別するラベル大項目のサービスの設定項目
- apiVersion: サービスのAPIバージョンを指定。
- kind: リソースの種類。ここでは「Service」を指定。
- metadata: サービスのメタデータ、主に名前を指定。
- spec: サービスのスペックとして、サービスのタイプ、ポート設定、対象Podのラベルなどを記述。
主なサービスの設定項目
サービスのタイプやポート設定は、クライアントがどのようにPodにアクセスするかを決定します。typeでは、外部アクセスの可否や通信の仕組みを設定し、portsでは通信に関わる具体的なポートを設定します。
タイプ(type)の設定
サービスのtypeは、どのようにPodにアクセスするかを決定する重要な設定です。以下は、代表的なタイプの種類です。

| タイプ名 | 内容 |
|---|---|
| ①ClusterIP | Cluster内でのみアクセスを許可する。外部からのアクセスはできません。 |
| ②NodePort | ワーカーノードのIPでサービスにアクセスできるようにします。 |
| ③LoadBalancer | ロードバランサーのIPでサービスにアクセスできるようにします。 |
| ④ExternalName | Podから外部サービスにアクセスするための設定。 |
ポート(ports)の設定
ポートの設定により、サービスがどのポートで通信を受け付けるか、またコンテナ内部でどのポートが使われるかを指定します。nodePortは、外部から直接アクセスする場合に使用され、範囲は30000〜32767です。

| 項目 | 内容 |
|---|---|
| ①port | サービスの公開ポートを設定します。 |
| ②nodePort | ワーカーノードのポート(30000~32767)を指定します。 |
| ③targetPort | コンテナ内部で使用するポートを指定します。 |
セレクター(selector)の設定
サービスは、どのPodにアクセスを渡すかを指定する必要があります。そのためにselectorを使用します。selectorは、Podやデプロイメントで設定されたラベルに基づいてPodを識別し、管理するための機能です。
【作成手順】サービスの定義ファイル
サービスの定義ファイル「service.yml」を作成する手順について詳しく解説します。サービスはPodへのアクセスを管理するため、通信に関する設定を中心に記述します。ここでは手順を1つずつ詳細に説明していきます。

サービスの定義ファイルの作成手順
サービスの定義ファイルを作成する際に行う手順は下表の流れとなります。
| 手順 | 説明 |
|---|---|
| 1. 大項目を並べる | apiVersion, kind, metadata, specの項目を配置する |
| 2. メタデータを記述する | metadataにデプロイメント名やラベルを記述する |
| 3. スペックを記述する | specにレプリカ数、セレクター、テンプレート(Podの設定)を記述する |
作成するサービスとコンテナの情報
サービスの定義に必要な情報を以下にまとめます。
| 項目 | 値 |
|---|---|
| APIグループとバージョン | v1 |
| リソースの種類 | Service |
| サービスの名前 | apache-ser |
| セレクターの対象とするラベル | app: apache |
| サービスのタイプ (種類) | NodePort |
| サービスのポート (port) | 8099 |
| コンテナのポート (targetPort) | 80 |
| ノードのポート (nodePort) | 30080 |
| プロトコル | TCP |
サービスの定義ファイル名と置く場所
作成した「service.yml」ファイルを保存する場所も決めておく必要があります。
| 項目 | 値 |
|---|---|
| サービスの定義ファイル名 | service.yml |
| ファイル置く場所 | C:\Users\ユーザー名\Desktop\kubernetes\apache |
サービスの定義ファイルの作成
ここから、サービスを定義する「service.yml」ファイルを作成していきます。サービスの定義ファイルは、KubernetesにおいてPodへのアクセスを管理するための重要な設定です。サービスを作成することで、外部からPodへの通信を確立し、必要なリソースにアクセスできるようになります。
サービスの定義には、APIバージョンやリソースの種類、メタデータ、そしてポートやプロトコルの設定が含まれます。また、サービスの種類を指定することで、どのように外部や内部ネットワークからアクセスを受け付けるかを制御します。
1.【STEP1】「service.yml」ファイルを作成する
まず、VScodeを使って「service.yml」ファイルを作成します。
- PowerShellを起動します。
- 作業ディレクトリに移動します。
PS C:\Users\joeac> cd desktop\kubernetes
PS C:\Users\joeac\Desktop\kubernetes>・「apache」ディレクトリに移動して、VSCodeを使って「service.yml」ファイルを作成します。
PS C:\Users\joeac\Desktop\kubernetes> cd apache
PS C:\Users\joeac\Desktop\kubernetes\apache> code service.ymlVSCodeが起動します。

2.【STEP2】大項目を並べます。
ファイルの中に、以下の大項目を入力します。
apiVersion:
kind:
metadata:
spec:3.【STEP3】apiVersion、kindの設定を入力します。
apiVersionに「v1」、kindに「Service」と入力します。
以下のように編集します。
apiVersion: v1
kind: Service
metadata:
spec:4.【STEP4】メタデータの設定値を入力します。
次に、metadataの値として、サービスの名前(name)を設定します。名前は「apache-ser」とします。
以下のように編集します。
apiVersion: v1
kind: Service
metadata:
name: apache-ser
spec:5.【STEP5】specの設定値を入力します
最後に、specにtypeとports、selectorを設定します。typeは「NodePort」、portは「8099J、targetPortは「80」、protocolは「TCP」、nodePortは「30080」とします。selectorは、「app: apache(Podで設定したラベル」を指定します。
以下のように編集します。
apiVersion: v1
kind: Service
metadata:
name: apache-ser
spec:
type: NodePort
ports:
- port: 8099
targetPort: 80
protocol: TCP
nodePort: 30080
selector:
app: apache6.【STEP6】ファイルを保存します
設定内容を確認し、問題がなければ「service.yml」を保存します。スペースやコロンの有無に特に注意して確認してください。
まとめ
サービスは、KubernetesにおいてPodへのアクセスを管理する重要なリソースです。定義ファイルはシンプルですが、ポートやタイプの設定によって、アクセス方法や通信の方向を管理することが可能です。
