👌

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

2021/03/07に公開

はじめに

くーばねてすを倒すために今回は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アソシエーションに応じてネットワークをセットアップします。

まとめ

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

Discussion