がじぇ

お金と家電とプログラミングのブログ

KubernetesのServiceについて

こんにちわ

がじぇったー (@hackmylife7) | Twitter


です。


KubernetesServiceについて学んでいきます。



f:id:gadgeterkun:20190720223856j:plain

TL;DR(要約)

Serviceとは何か?


ServiceはKubernetesクラスタ上で外部からリクエストを受け付けるために定義するルールであり、Podにアクセするためのポリシーそのものである。公式ドキュメントでは以下のように記載されている

Kubernetesでは、サービスとは、Podの論理セットとそれらにアクセスするためのポリシーを定義する抽象概念です(このパターンはマイクロサービスと呼ばれることもあります)

実態は各Node上で動いているkube-proxyがPodに向けて定められたルールにしたがってトラフィックを転送している。

そしてそのルールは下記4点である。

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName


何故Serviceを使うのか?


Podは必ずしも永続性が高いものではない。

Podが死んだらクラスタ内で割り当てられるIPが変わってしまうため、もしPodのIPアドレスを直接叩いているような構成(そんなものはないと思いますが)だったらトラフィックが受けられなくなる。

そのため、Serviceによって、適切にロードバランシングを行う必要性がある

Serviceの種類

ClusterIP

※公式ドキュメントより引用

https://d33wubrfki0l68.cloudfront.net/e351b830334b8622a700a8da6568cb081c464a9b/13020/images/docs/services-userspace-overview.svg

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376


マニフェストファイルの例

f:id:gadgeterkun:20190720235537p:plain

NodePort

  • 外部からアクセスできるよう、Portをオープンしてくれる
  • ClousterIPで解放しているIPアドレスとPortはあくまでもクラスタ内部で公開されるPort。NodePortで指定するPortは外部に公開されるPort
  • defaultのPortは30000-32767の範囲から割り当てられるが、固定することもできる

※ Think IT様の記事より引用
https://thinkit.co.jp/sites/default/files/article_node/1373809.jpg
KubernetesのDiscovery&LBリソース(その1) | Think IT(シンクイット)

マニフェストファイルの例
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    protocol: TCP
    name: https
  selector:
    run: my-nginx

LoadBalancer


クラスタ外からトラフィックを受ける場合に用いる。クラウド環境でK8sを運用する場合、AWSでいうALB,GCPでいうGLBCにその機能を頼ることになる。


一般的なロードバランサをイメージするとわかりやすい。


プロダクション環境で用いる場合は、クラスタ外にLBをたて、クラスタ内にはService:NordPortをつくりトラフィックを分散し、耐障害性を高める


マニフェストファイルの例
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
  clusterIP: 10.0.171.239
  loadBalancerIP: 78.11.24.19
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 146.148.47.155


汚くて申し訳ないが図にするとこんなイメージ。
LBで分散してクラスタ内でも分散するので耐障害性が高まっていることがわかる


f:id:gadgeterkun:20190721002407p:plain


ExternalName

ExternalIP Serviceは特定のK8sIPアドレス:Portで受信したトラフィックをコンテナに転送する形で、外部疎通性を確率するService

外部から直接コンテナにアクセスしたい場合等に使う。

例えば、一旦コンテナをとめて、外部の同じようなサービスに転送したい場合等、外部にリクエストを転送することができる。




どのServiceを使うか、という選択基準


サービスを外部に公開するかが選択基準になる。

外部に公開する場合はNode Portを用いる。
※ LoadBalancer(AWSGCPのLBと一緒に使う)

公開しない場合は基本的にClusterIPを用いる


参考(Kubernetesの最強参考書)

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)


Kubernetesの他の記事へは下記の一覧から飛べるようにしているので参照ください。

gadgeterkun.hatenablog.com