【Kubernetes】Serviceを作成してローカルPCからアクセスしてみる

2021.10.18
2024.03.24
Kubernetes
Service

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

KubernetesのServiceについてざっくり理解してから実際に動かして、ローカルPCからアクセスしてみたいと思います。

DeploymentとReplicaSet、Podについてはある程度理解している前提で解説しています。それぞれについては、下記で解説しています。

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

Serviceとは

Serviceとは、Podの集合であるアプリケーションに対してアクセスするためのエンドポイントを提供するオブジェクトです。つまり、ServiceにアクセスすることでKubernetes上で動くアプリケーションにアクセスできることになります。

ラベルセレクタでアクセスするPodを指定できます。

Serviceのタイプ

Serviceには以下の4つのタイプがあります。

タイプ概要
ClusterIPクラスタの内部IPとして公開
デフォルトのServiceタイプ
NodePortNodeのポートで公開
クラスタ外からアクセス可能
LoadBalancerクラウドプロバイダーのロードバランサーを使用して公開
ExternalNameクラスタ内から外部ホストのエイリアスを提供

Serviceを作成してみる

ここからはシンプルなServiceを実際に作成してみます。

ClusterIPのService

まずはClusterIPタイプのServiceを作成します。

はじめにPodを実行するためのDeploymentのマニフェストdeployment.ymlを作成します。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  replicas: 3
9  selector:
10    matchLabels:
11      app: myapp
12  template:
13    metadata:
14      labels:
15        app: myapp
16    spec:
17      containers:
18      - name: web-container
19        image: nginx
20        ports:
21          - containerPort: 80

次にServiceのマニフェストservice-clusterip.ymlを作成します。

1apiVersion: v1
2kind: Service
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  ports:
9  - port: 9999
10    protocol: TCP
11    targetPort: 80
12  selector:
13    app: myapp
14  type: ClusterIP

作成したマニフェストを反映させます。

1❯ kubectl apply -f deployment.yml
2deployment.apps/myapp created
3
4❯ kubectl apply -f service-clusterip.yml
5service/myapp created

ServiceとDeploymentを確認してみます。

1❯ kubectl get svc
2NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
3myapp        ClusterIP   10.100.187.3   <none>        9999/TCP   5s
4
5❯ kubectl get deployment
6NAME    READY   UP-TO-DATE   AVAILABLE   AGE
7myapp   3/3     3            3           61s

ClusterIPのServiceはクラスタ内部からしかアクセスできないため、ポートフォワードしてローカルPCから確認します。

1❯ kubectl port-forward service/myapp 9999:9999
2Forwarding from 127.0.0.1:9999 -> 80
3Forwarding from [::1]:9999 -> 80
4Handling connection for 9999
5Handling connection for 9999

ポートファワードしている時に、http://localhost:9999にブラウザからアクセスするとnginxの画面が確認できます。

作成したDeploymentとServiceは削除しておきます。

1❯ kubectl delete -f deployment.yml
2deployment.apps "myapp" deleted
3
4❯ kubectl delete -f service-clusterip.yml
5service "myapp" deleted

NodePortのService

続いて、NodePortのServiceを作成します。

ClusterIPのServiceを作成した時と同様に、Podを実行するためのDeploymentのマニフェストdeployment.ymlを作成します。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  replicas: 3
9  selector:
10    matchLabels:
11      app: myapp
12  template:
13    metadata:
14      labels:
15        app: myapp
16    spec:
17      containers:
18      - name: web-container
19        image: nginx
20        ports:
21          - containerPort: 80

次にServiceのマニフェストservice-nodeport.ymlを作成します。

1apiVersion: v1
2kind: Service
3metadata:
4  name: myapp
5  labels:
6    app: myapp
7spec:
8  ports:
9  - name: http
10    port: 80
11  selector:
12    app: myapp
13  type: NodePort

作成したマニフェストを反映させます。

1❯ kubectl apply -f deployment.yml
2deployment.apps/myapp created
3
4❯ kubectl apply -f service-nodeport.yml
5service/myapp created

ServiceとDeploymentを確認してみます。

1❯ kubectl get deployment
2NAME    READY   UP-TO-DATE   AVAILABLE   AGE
3myapp   3/3     3            3           12m
4
5❯ kubectl get service
6NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
7myapp        NodePort    10.100.72.46   <none>        80:31256/TCP   9s

PORT列をみると80:31256/TCPと表示されているので、ノードの31256ポートからServiceにアクセスできます。

ローカルPCからhttp://localhost:31256にブラウザからアクセスするとnginxの画面が確認できます。

まとめ

  • ServiceはKubernetes上で動くアプリケーションであるPodにアクセスするためのオブジェクト

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee