【Kubernetes】YAMLファイルの書き方(service)　no.9

![名称未設定のデザイン (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e48e760d-56d5-709b-5c66-6a4744c06b8a.png)

こんにちは。まゆみです。

Kubernetesについての記事をシリーズで書いています。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/950672c4ec1dab42cc82)でdeploymentオブジェクトを作る時のyamlファイルの書き方を紹介しました。

ただ、deploymentオブジェクトだけでは、外部からアプリケーションにアクセスできません。

<font color="Red">外部からアクセスをしようとしたら、『service』オブジェクトも作る必要</font>があります。

今回の記事では、service オブジェクトを作る時のyamlファイルの書き方を紹介しようと思います

では早速はじめて行きますね。


#Kubernetesのドキュメント

Serviceオブジェクトを作るときのyamlファイルの書き方も、[Kubernetesのドキュメント](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/#-strong-service-apis-strong-)を参考にしながら書くと良いでしょう


![2021-07-23_13-50-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3733b496-c66f-4919-c572-0e7b73b0e34e.png)


そして基本的には、[前回の記事](https://qiita.com/Mayumi_Pythonista/items/950672c4ec1dab42cc82)で紹介したdeploymentオブジェクトのyamlファイルと似ています

#Serviceオブジェクトのyamlファイルの概要

Service オブジェクトを作るためのyamlファイルを作る時、最終完成形は以下のような感じになります

![2021-07-24_9-47-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5c01c427-7852-f738-da5e-dc65fc66b42c.png)
引用元：[Kubernetesドキュメント](https://kubernetes.io/ja/docs/concepts/services-networking/service/)

前回の記事で、deploymentオブジェクトのためのyamlファイルの書き方を書かせてもらいましたが、<font color="Red">前回の解説と似ているところは今回の記事では省略</font>させていただきます。

#kind
今回はServiceオブジェクトを作りたいので、

```
kind: Service
```

と書きます。

オブジェクト名の最初の文字を大文字ではじめてくださいね。(serviceではなく、Service)

#metadata

どのPodをServiceオブジェクトでマネージするのかの特定のために、キーバリューペアーを書きます。

前回の記事で扱ったdeployment・podのyamlファイルに書いたPodのlabels(キーバリューペア)と同じものをServiceのselectorに書くことで、

『このServiceがある特定のpodをマネージしているのだ』

ということが分かります

![2021-07-24_9-54-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e891e781-4064-4580-585c-b387739da1c6.png)

![2021-07-24_10-00-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9cba6577-2598-be53-0d68-047d9a27d18d.png)

#ports

specの項目のなかにインデントしてportsを書きます

portsと複数形になっていることから分かるように、複数のportを書くことができます

複数のportを書く場合は　- (ダッシュ)で、それぞれのportを区切ってください。

ではそのportsのなかに書く項目を下記に書いていきます

##protocol

ディフォルトでは　'TCP'になっていますので、

```
ports:
  - protocol: 'TCP'
```

と書きましょう

##port
他のpodがもし、このServiceオブジェクトでマネージされているpodとコミュニケーションを取りたい場合のポート番号を書きます

##targetPort
Containerに開けられたポート番号を書きます。

例えば、Nodeでアプリを作っているのなら下記の赤で囲んでいる部分に書かれている番号を書いてください。

![2021-07-24_10-16-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0d6308df-7595-fccf-0f1f-71e18aa32fd7.png)


#type

Imperative なアプローチを使ってServiceオブジェクトを作った時

```
kubectl expose deployment <deployment名> --port=<ポート番号> --type=<タイプ>
```

でdeploymentオブジェクトを外部からアクセスできる状態にしました。(忘れた方は[こちら](https://qiita.com/Mayumi_Pythonista/items/7203effbb8b7d3748696#kubectl-expose%E3%82%92%E4%BD%BF%E3%81%86)を参考にどうぞ)

上記の--type=に書いていたものをyamlファイルにも記載します。

```
type: LoadBalancer
```

Serviceオブジェクトのためのyamlファイルの最終的な物は下のスクショのようになります。

![2021-07-24_10-57-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/103ae68b-e6cb-5fa3-dc9a-d0987dbd30af.png)


YAMLファイルでは、インデントも重要な意味を持ちますので、インデントがされるべき場所でちゃんとされているかなどにも注意して書いてみてくださいね。


#kubectl applyでファイルの内容を適用する

yamlファイルが書き終わりましたら、コマンドラインに

```
kubectl apply -f=<ファイル名.yaml>
```
と打って、Service オブジェクトを作りましょう

Serviceオブジェクトができ、実際アプリにアクセスしてみたいって方は、その方法を[こちら](https://qiita.com/Mayumi_Pythonista/items/7203effbb8b7d3748696#kubectl-expose%E3%82%92%E4%BD%BF%E3%81%86)に書いています。


#まとめ
今回の記事はここで締めくくらせていただきます。

次回の記事では、Declarativeなアプローチによるイメージの更新方法について書いていこうと思います