はじめに
KubernetesのServiceについてざっくり理解してから実際に動かして、ローカルPCからアクセスしてみたいと思います。
DeploymentとReplicaSet、Podについてはある程度理解している前提で解説しています。それぞれについては、下記で解説しています。

Serviceとは
Serviceとは、Podの集合であるアプリケーションに対してアクセスするためのエンドポイントを提供するオブジェクトです。つまり、ServiceにアクセスすることでKubernetes上で動くアプリケーションにアクセスできることになります。
ラベルセレクタでアクセスするPodを指定できます。
Serviceのタイプ
Serviceには以下の4つのタイプがあります。
タイプ | 概要 |
---|---|
ClusterIP | クラスタの内部IPとして公開 デフォルトのServiceタイプ |
NodePort | Nodeのポートで公開 クラスタ外からアクセス可能 |
LoadBalancer | クラウドプロバイダーのロードバランサーを使用して公開 |
ExternalName | クラスタ内から外部ホストのエイリアスを提供 |
Serviceを作成してみる
ここからはシンプルなServiceを実際に作成してみます。
ClusterIPのService
まずはClusterIPタイプのServiceを作成します。
はじめにPodを実行するためのDeploymentのマニフェストdeployment.yml
を作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: web-container
image: nginx
ports:
- containerPort: 80
次にServiceのマニフェストservice-clusterip.yml
を作成します。
apiVersion: v1
kind: Service
metadata:
name: myapp
labels:
app: myapp
spec:
ports:
- port: 9999
protocol: TCP
targetPort: 80
selector:
app: myapp
type: ClusterIP
作成したマニフェストを反映させます。
❯ kubectl apply -f deployment.yml
deployment.apps/myapp created
❯ kubectl apply -f service-clusterip.yml
service/myapp created
ServiceとDeploymentを確認してみます。
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp ClusterIP 10.100.187.3 <none> 9999/TCP 5s
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 3/3 3 3 61s
ClusterIPのServiceはクラスタ内部からしかアクセスできないため、ポートフォワードしてローカルPCから確認します。
❯ kubectl port-forward service/myapp 9999:9999
Forwarding from 127.0.0.1:9999 -> 80
Forwarding from [::1]:9999 -> 80
Handling connection for 9999
Handling connection for 9999
ポートファワードしている時に、http://localhost:9999
にブラウザからアクセスするとnginxの画面が確認できます。
作成したDeploymentとServiceは削除しておきます。
❯ kubectl delete -f deployment.yml
deployment.apps "myapp" deleted
❯ kubectl delete -f service-clusterip.yml
service "myapp" deleted
NodePortのService
続いて、NodePortのServiceを作成します。
ClusterIPのServiceを作成した時と同様に、Podを実行するためのDeploymentのマニフェストdeployment.yml
を作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: web-container
image: nginx
ports:
- containerPort: 80
次にServiceのマニフェストservice-nodeport.yml
を作成します。
apiVersion: v1
kind: Service
metadata:
name: myapp
labels:
app: myapp
spec:
ports:
- name: http
port: 80
selector:
app: myapp
type: NodePort
作成したマニフェストを反映させます。
❯ kubectl apply -f deployment.yml
deployment.apps/myapp created
❯ kubectl apply -f service-nodeport.yml
service/myapp created
ServiceとDeploymentを確認してみます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 3/3 3 3 12m
❯ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.100.72.46 <none> 80:31256/TCP 9s
PORT列をみると80:31256/TCP
と表示されているので、ノードの31256ポートからServiceにアクセスできます。
ローカルPCからhttp://localhost:31256
にブラウザからアクセスするとnginxの画面が確認できます。
まとめ
- ServiceはKubernetes上で動くアプリケーションであるPodにアクセスするためのオブジェクト