kubernetesのサービスのマニフェストの書き方

3 min read読了の目安(約3100字

はじめに

くーばねてすを倒すために今回はkubernetesのサービスのマニフェストの書き方をちょっとまとめた!(^^)!

概要

■サービスのマニフェストの書き方

をまとめた(^_-)-☆

■サービスのマニフェストの書き方

デプロイメントマニュフェストで作成されるポッドに対してサービスマニュフェストでポッドに対するアクセス方法を設定する。

Serviceリソース
Kubernetesにおいて、ServiceはPodの論理的なセットや、そのPodのセットにアクセスするためのポリシーを定義します(このパターンはよくマイクロサービスと呼ばることがあります)。 ServiceによってターゲットとされたPodのセットは、たいてい セレクター (セレクターなしのServiceを利用したい場合は下記を参照してください)によって定義されます。
例えば、3つのレプリカが稼働しているステートレスな画像処理用のバックエンドを考えます。これらのレプリカは代替可能です。— フロントエンドはバックエンドが何であろうと気にしません。バックエンドのセットを構成する実際のPodのセットが変更された際、フロントエンドクライアントはその変更を気にしたり、バックエンドのPodのセットの情報を記録しておく必要はありません。
Serviceによる抽象化は、クライアントからバックエンドのPodの管理する責務を分離することを可能にします。

web-deployment.yml
##デプロイメント                           
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:              # デプロイメントの設定内容
  replicas: 3
  selector:           # デプロイメントポッドの設定内容
    matchLabels:
      app: web
  template:           #ここからポッドのテンプレート
    metadata:
      labels:
        app: web               #ポッドのラベル
    spec:
      containers:
      - image: nginx:1.16
        name: nginx

サービスはポッドに対しクライアントがアクセスするためのオブジェクトになるので、サービスマニュフェストのselector( matchLabels:/ app: web)に対応するポッドの設定する。ポッドのラベル設定はmetadata/labelsに設定する。

つまり、↑デプロイメントと↓サービスは繋がっているので設定するラベルを間違えないでねってこと(>_<)

service.yml
#サービス
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:     #リクエストをラベルと一致するポッドへ送る。
    app: web  #app: webにリクエストが送られる。
  ports:
  - protocol: TCP
    port: 80

serviceで主に設定される設定内容

設定項目 意味
type serviceの公開方法.ClusterIP、NodePort、LoadBalancer、ExternalNameがある。指定しないとデフォルトでClusterIPになる
ports serviceで公開されるポート番号
selector リクエストをラベルと一致するポッドへ送る
sessionAffinty セッションアフィニティーを有効にするかを指定する。値にClusterIPを設定することでリクエストの転送先を指定することができる
ClusterIP IPアドレスを設定することができる。省略すると代表IPアドレスだ自動的に設定される。Noneでヘッドレスな動作をする。

サービスのポートの設定項目

ポート設定項目 意味
port 必須項目。serviceで公開するポート番号
name portが一つの場合は省略できる。複数の場合は必須になる
protocol 省略時にはTCPが使用される
NodePort 省略時にはシステムが自動的に獲得する。NodePortやLoadBalancerの場合、各Nodeでportを公開する。なのでport番号が被らないようにする
TargetPort ServiceはportからtargetPort(ポッドの公開port)へのマッピングを行う。デフォルトでは利便性のためにtargetPortフィールドはportフィールドと同じ値で設定される

https://kubernetes.io/ja/docs/concepts/services-networking/service/

サポートされているプロトコル
TCP
ユーザーはどの種類のServiceにおいてもTCPを利用できます。これはデフォルトのネットワークプロトコルです。
UDP
ユーザーは多くのServiceにおいてUDPを利用できます。 type=LoadBalancerのServiceにおいては、UDPのサポートはこの機能を提供しているクラウドプロバイダーに依存しています。
HTTP
もしクラウドプロバイダーがサポートしている場合、ServiceのEndpointsに転送される外部のHTTP/HTTPSでのリバースプロキシーをセットアップするために、LoadBalancerモードでServiceを作成可能です。
PROXYプロトコル
もしクラウドプロバイダーがサポートしている場合(例: AWS)、Kubernetesクラスターの外部のロードバランサーを設定するためにLoadBalancerモードでServiceを利用できます。これはPROXY protocolがついた接続を転送します。
SCTP
FEATURE STATE: Kubernetes v1.12 [alpha]
KubernetesはService、Endpoints、NetworkPolicyとPodの定義においてα版の機能としてprotocolフィールドの値でSCTPをサポートしています。この機能を有効にするために、クラスター管理者はAPI ServerにおいてSCTPSupportというフィーチャーゲートを有効にする必要があります。例えば、--feature-gates=SCTPSupport=true,…といったように設定します。
そのフィーチャーゲートが有効になった時、ユーザーはService、Endpoints、NetworkPolicyのprotocolフィールドと、PodのSCTPフィールドを設定できます。 Kubernetesは、TCP接続と同様に、SCTPアソシエーションに応じてネットワークをセットアップします。

まとめ

ざっくりとした内容がちょっとわかった(^^)/