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

はじめに

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

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

【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod
はじめにKubernetesでは覚えることがたくさんありますが、今回は基本的なKubernetesオブジェクトであるDeployment/ReplicaSet/Podを動かしながらざっくり解説したいと思います。DeploymentとRe...

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を作成します。

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にアクセスするためのオブジェクト

参考

タイトルとURLをコピーしました