【Kubernetes】Serviceを作成してローカルPCからアクセスしてみる
はじめに
KubernetesのServiceについてざっくり理解してから実際に動かして、ローカルPCからアクセスしてみたいと思います。
DeploymentとReplicaSet、Podについてはある程度理解している前提で解説しています。それぞれについては、下記で解説しています。
【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod
:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。
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
を作成します。
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にアクセスするためのオブジェクト