Service
概要
Service は複数の同質な Pod をひとまとめにネットワーク上のサービスとして扱う抽象化である.Service discovery (ある機能を提供するPodを検出すること) をし,見つけた Pod を不変なクラスタ内アドレス下にまとめる.
Pod (と Podに割り振られたIPアドレス) は一時的なものであるため,ある機能を提供するネットワーク上のアドレスはいつでも変わりうる.Service は Pod の役割を表す Label ごとに Pod をまとめその前段に入ることで,クラスタ内にある機能を提供するアドレスを提供する.Service が提供するアドレスにくるトラフィックは,その傘下の Pod に (基本的には) round robinで負荷分散される. Service のクラスタ内ドメイン名は一般に <Service 名>.<Namespace 名>.svc.cluster.local となる.末尾部分 .svc.cluster.local はクラスタ全体の設定で変更することができる.
type: NodePort
Service をこの type にすると各 Node のエフェメラルポートからポート番号が選ばれ, Node のそのポートへのトラフィックはすべて Service に流されるようになる.このポート番号は各 Service につき Node をまたいで共通であり,任意のノードのポートにトラフィックを送ると Service に流されるようになる.このポート番号は各 type: LoadBalancer
Service をこの type にすると, NodePort 同様にエフェメラルポートが確保されたうえで,そのポートにトラフィックを流すロードバランサが作成される.ロードバランサが何であるかは Kubernetes 実行環境によって異なる.例えば, EKS 上だと Classic Load Balancer が用いられる.
ロードバランサのポート番号はサービスの (クラスタ内アドレスの) ポート番号と同じになる.
例
下記の, nginx の Pod を傘下に持つ Service を考える
code:yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
version: 1.15
ports:
- protocol: TCP
port: 80
targetPort: 80
この Service はラベルに app: nginx と version: 1.15 を持つ Pod をすべてまとめてクラスタ内のネットワーク上のサービスとして提供する.Label が正しく付与されているかは Pod (あるいは Pod を作成する Deployment) を作成した者の責任である. targetPort: 80 より各Podの80番ポートにトラフィックを流し,自身は port: 80 より Service のクラスタ内ドメイン名の 80 番ポートにてトラフィックを受け付ける. この Service は type が未指定なのでクラスタ外からの通信は受け付けない.この Service のクラスタ内ドメイン名は,default Namespace に Service と Pod があると仮定して, nginx.default.svc.cluster.local である. 参考