Exposing Services in Kubernetes
Kubernetesでサービスを公開する方法には、内部エンドポイントと外部エンドポイントの両方がアクセスできるようにするためのさまざまな方法があります。このKubernetesの構成は非常に重要であり、管理者は攻撃者がアクセスすべきでないサービスにアクセス権を与える可能性があります。
自動列挙
公開された方法を列挙する前に、K8sが公開されたものをすべて見つけることができることを知っておくために、名前空間、サービス、イングレスをリストアップできれば、次のコマンドで公開されたすべてを見つけることができます:
ClusterIP
ClusterIPサービスはデフォルトのKubernetes サービスです。これは、クラスター内にある他のアプリがアクセスできるサービスを提供します。外部アクセスはありません。
ただし、これはKubernetes Proxyを使用してアクセスできます:
Now, you can navigate through the Kubernetes API to access services using this scheme:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
For example you could use the following URL:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
to access this service:
この方法を実行するには、kubectl
を認証済みユーザーとして実行する必要があります。
すべての ClusterIP をリストします:
NodePort
NodePortを利用すると、すべてのノード(仮想マシンを表す)に指定されたポートが利用可能になります。この特定のポートに向けられたトラフィックは、その後サービスにシステマティックにルーティングされます。一般的に、この方法は欠点があるため推奨されていません。
すべてのNodePortをリストアップします:
NodePort仕様の例:
LoadBalancer
サービスをクラウドプロバイダのロードバランサーを使用して外部に公開します。GKEでは、これによりNetwork Load Balancerが起動され、サービスにすべてのトラフィックを転送する単一のIPアドレスが提供されます。AWSでは、ロードバランサーが起動されます。
公開されたサービスごとにロードバランサーを支払う必要があり、これは高額になる可能性があります。
すべてのロードバランサーをリストアップします:
外部IP
外部IPは、ロードバランサータイプのサービスによって公開され、一般的には外部クラウドプロバイダーのロードバランサーが使用されている場合に使用されます。
これらを見つけるには、EXTERNAL-IP
フィールドに値があるロードバランサーを確認してください。
クラスターに入るトラフィックは、外部IP(宛先IPとして)、サービスポートにルーティングされ、サービスのエンドポイントの1つに到達します。externalIPs
はKubernetesによって管理されず、クラスター管理者の責任です。
サービスの仕様では、externalIPs
をServiceTypes
のいずれかと共に指定できます。以下の例では、"my-service
"は"80.11.12.10:80
"(externalIP:port
)でクライアントからアクセスできます。
ExternalName
ドキュメントから: ExternalNameタイプのサービスは、通常のセレクター(my-service
やcassandra
など)ではなく、サービスをDNS名にマップします。これらのサービスは、spec.externalName
パラメーターで指定します。
たとえば、次のサービス定義は、prod
ネームスペース内のmy-service
サービスをmy.database.example.com
にマップします:
ホストmy-service.prod.svc.cluster.local
を検索すると、クラスタDNSサービスが値my.database.example.com
を持つCNAME
レコードを返します。my-service
へのアクセスは他のサービスと同様に機能しますが、重要な違いはリダイレクトがプロキシングや転送ではなくDNSレベルで発生することです。
すべてのExternalNamesをリストアップします:
イングレス
上記の例とは異なり、Ingressはサービスの一種ではありません。代わりに、複数のサービスの前に配置され、"スマートルーター"またはクラスターへの入り口として機能します。
Ingressではさまざまなことができ、異なる機能を持つ多くの種類のIngressコントローラーがあります。
デフォルトのGKE Ingressコントローラーは、HTTP(S)ロードバランサーを起動します。これにより、パスベースおよびサブドメインベースのルーティングをバックエンドサービスに対して行うことができます。たとえば、foo.yourdomain.comのすべてをfooサービスに送り、yourdomain.com/bar/パスの下のすべてをbarサービスに送ることができます。
GKE上のIngressオブジェクトのYAMLは、L7 HTTPロードバランサーを使用した場合、次のようになります:
すべてのイングレスをリストアップします:
この場合、それぞれの情報を1つずつ取得して、よりよく読む方が良いです。
参考
Last updated