Service
9594 ワード
Service
概念と特徴
クバーネディス群集中では,流動性の高いパードに不変の端点を提供することがサービスの役割である.
クバーネディス群集中では,流動性の高いパードに不変の端点を提供することがサービスの役割である.
ping
は飛べない.サービスの仕組み
クバーネディス静的podにはkube-proxyがある.kube-proxyの役割は、自分が浮遊するノードに入るトラフィックを遮断し、適切な位置でリダイレクトするエージェントです.しかし、これはユーザー空間エージェントモードであり、現在の基本モードはパフォーマンスの良いiptablesエージェントモードである.userspaceエージェントは、ネットワークトラフィックに関連するほとんどの作業がuserspaceのkube-proxyで動作し、ネットワークパケットをユーザーに渡すと、ユーザー空間のパケットがkernel spaceを介してエージェントされるため、コストが高くなります.これに対して、iptablesモードではkernel spaceというnetfilterというモジュールを使用してkube-proxyの作業を完了するため、コストがずっと低くなります.
では、kube-proxyがサービスを作成する際にどのように機能しているかを見てみましょう.
APIサーバ上でサービスが作成されると、仮想IPアドレスがすぐに割り当てられます.
APIサーバは、すべてのkube-proxyに新しいサービスの生成を通知します.
kube-proxyは、ノード上でiptablesを変更して、サービスIPアドレスのパケットをブロックし、適切なパケットに送信する.
エンドポイントオブジェクトはサービス関連(pod IP、ポート)ペアを監視しているため、podが変化するとエンドポイントも変化し、kube-proxyはそれに気づき、iptablesを再修正します.
ここでは、iptablesとnetfilterの概念が混同される可能性があります.実際、カーネル空間のnetfilterはルールに基づいてパケットを処理します.iptablesはuserspaceにあり、netfilterにルールを追加するためのインタフェースです.
原理的に見ると、サービスの特徴の中で、なぜサービスIPで
ping
を送信できないのか.最終的に、サービスIPは、ネットワークインタフェースに割り当てられず、(サービスIP、ポート)ペアからなるだけである.NodePort vs LoadBalancer vs Ingress
3つとも外部にサービスを暴露する方法です.しかし、明らかな違いがあり、用途も異なるので、理解したほうがいいです.
NodePort
すべてのノードで特定のポートを開き、外部からトラフィックを受信する方法.これにより、ユーザは、要求を
노드 IP:NodePort
アドレスに送信することができる.通常はon-premiseでサービスを暴露する際に多く使用される.apiVersion: v1
kind: Service
metadata:
name: nodeport
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30123
selector:
app: example
Load Balancer
これはNodePortの拡張バージョンで、gcpやawsなどのクラウドインフラストラクチャにのみ適用されます.基本的に、サービスはノードポートのように、各ノードには特定のポートが開いていますが、外部に露出している点はLoad Bangerが1つしかありません.したがって,ユーザがアクセスする場合,Load BanserのIPアドレスを用いて接続することができる.
しかし、Load Bankerは1つのサービスにしか適用できないため、複数のサービスを暴露するには、それに応じて複数のLoad Bankerを生成する必要があり、これにより多くのコストが発生する.
apiVersion: v1
kind: Service
metadata:
name: loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: example
Ingress
主に生産環境に露出する方法である.上のLoad Bangerとは違って、1つのIngressは複数のサービスを暴露することができます.欠点は使い方が複雑だということです.
まず、イングリスがサービスを暴露する方法を見てみましょう.Ingress要求はドメインとuriパス暴露サービスに基づいている.また、Ingressは常にIngressコントローラのように配置する必要があります.Ingressは複数のサービスを暴露する際のルールを定義するだけで,実際のトラフィックを処理するのはIngressコントローラである.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
service:
name: example-service
port:
number: 80
ユーザは、要求を
example.com
ドメインに送信する.DNSサーバは、
example.com
をIngressコントローラIP送信要求に変更する.Ingressコントローラにリクエストすると、タイトルにexampleがあります.comを読み込んで送信します.
Ingressコントローラは,要求を受けたデータに基づいて,Ingress→サービス→エンドポイントを介して,実際に要求を受信する必要があるPARD IPを取得する.
得られたシードIPでIngressコントローラはトラフィックを送信する.
今回は複数のサービスを暴露する場合であり,複数のサービスを暴露すると,異なるドメイン名やuriパスに基づいて暴露する.次の図は、ドメイン名に基づいて複数のサービスを暴露する例です.
uriパスに露出すると、以下のようにIngressを定義できます.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example
spec:
rules:
- host: example.com
http:
paths:
- path: /foo
backend:
service:
name: foo-example-service
port:
number: 80
- path: /bar
backend:
service:
name: bar-example-service
port:
number: 80
この場合、パスが同じ場合にprefixやpathTypeを設定するなど、異なる条件を設定することで、パスが同じ場合に割り当てる必要がなく、サービスを作成することができます.Reference
[足の翻訳]KubernetesNodePortVS LoadBarancer VS Ingress?いつ何を書けばいいですか。
Reference
この問題について(Service), 我々は、より多くの情報をここで見つけました
https://velog.io/@harryroh2003/Service
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(Service), 我々は、より多くの情報をここで見つけました https://velog.io/@harryroh2003/Serviceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol