はじめに
Podを外部に公開するだけであれば、Serviceだけでも可能です。しかし、IngressとServiceを組み合わせたほうがURLごとに接続するServiceを変更できるなど多機能であるため、本記事ではService+Ingressの構成について解説を行います。
以下は本記事の構成図です。
第1回で追加したPodに対してServiceを追加し、そのIngressとPodがSeriviceを通じて通信ができるようにします。Ingressは外部に公開されており、インターネットを通じて外部と通信できます。
対象読者
- Linuxの基本的なコマンドが使える方
- Dockerの使用経験がある方
- Kubernetesを使ったことがない技術者
検証環境
Kubernetes側の環境
- Google Container Engine 1.7.5
- Kubernetes 1.7.5
クライアントの環境
- macOS Sierra 10.12.6
- kubectl 1.7.3
PodとIngressを接続するためのService(NodePort)の作成
それでは、Serviceを作成していきましょう。Serviceを追加することで、Serviceで指定したPodがクラスタ内のPodやIngressと通信ができるようになります。
Serviceのkind(種類)はNodePortです。NodePortは各NodeのIPでポートを公開します。これにより、クラスタの外からServiceにアクセスできるようになります。
今回作成するServiceはselectorで、第1回目で作成したPodのlabelsを指定します。エディタを開き、リスト1をコピー&ペーストして「service-my-api.yaml」というファイル名で保存してください。
apiVersion: v1 kind: Service metadata: name: service-my-api spec: type: NodePort # typeにNodePortを指定する ports: - protocol: TCP port: 80 targetPort: 80 name: http selector: app: my-api # Deploymentと同じappを指定する version: v1 # Deploymentと同じversionを指定する
それでは、kubectl create
コマンドを使ってServiceを作成しましょう。
$ kubectl create -f service-my-api.yaml service "service-my-api" created
create
コマンドが正常終了したら、次はServiceが作られているかどうかをkubectl get
で確認します。
$ kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes xx.xx.xxx.x <none> 443/TCP 5h service-my-api xx.xx.xxx.xxx <nodes> 80:31708/TCP 36s
Serviceが正常に作られていたら、「service-my-api」という名前のServiceが確認できるはずです。
次に、kubectl describe
コマンドでSelectorが設定されているかを確認しましょう。describe
コマンドは指定したリソースの詳細を確認することができるコマンドです。
$ kubectl describe svc/service-my-api Name: service-my-api Namespace: default Labels: <none> Annotations: <none> Selector: app=my-api,version=v1 Type: NodePort IP: 10.51.251.245 Port: http 80/TCP NodePort: http 31708/TCP Endpoints: <none> Session Affinity: None Events: <none>
YAMLで定義した内容でServiceが作成されたことが確認ができたでしょうか。Selectorの項目にSelector: app=my-api,version=v1
と表示されているはずです。