web-dev-qa-db-ja.com

TLSを使用したKubernetesサービスの保護

内部にあり、クラスターIPのサービスによってクラスター上の他のアプリケーションにのみ公開されているアプリケーションがあります。他のサービスがDNS(serviceName-namespace.svc.cluster.local)経由でこのアプリケーションにアクセスしています。このアプリケーションは機密データを処理するため、すべての通信はクラスター内にありますが、TLSを使用してこのアプリケーションへの通信を保護したいと考えています。

私の質問は-サービスでTLSを有効にするにはどうすればよいですか?何か既に存在していますか、それともアプリケーションコードで処理する必要がありますか?また、.svc.cluster.localの証明書に署名できるCAをクラスターで使用できますか?

明確にするために、私はこの目的のためにイングレスを使用できることを知っています。唯一の問題は、このサービスを内部でのみ維持することです。そのため、クラスター内のサービスのみがアクセスできます。

ありがとう、オメル

11

Kubernetes APIを使用して、クラスターで実行されているすべてのポッドから信頼される証明書を生成できることがわかりました。このオプションは、他のオプションよりも簡単な場合があります。証明書の生成と使用の完全なフローを含むドキュメント here を見つけることができます。

1

下の@voncコメントに続いて、私は解決策を持っていると思います:

  • このサービスの有効なパブリックドメインを購入します(例:something.mycompany.com)。
  • CoreDNSを使用してオーバーライドルールを追加すると、サービスが外部に公開されないため、something.mycompany.comへのすべてのリクエストがsomething-namesapce.svc.cluster.localに送信されます(これは、私のユースケースの通常のAレコードでも実行できます)。
  • Nginxなどを使用して、something.mycompany.comの証明書でTLSを処理します。

これはかなり複雑に聞こえますが、うまくいくかもしれません。どう思いますか?

3

チュートリアル「 Ingress、TLS、およびLetsEncrypt を使用したSecure Kubernetesサービス」が当てはまるかどうかを確認します。

Ingressは、さまざまなIngress Controllerを使用することにより、さまざまな実装によってサポートされます。これらの中で最も人気があるのは Nginx Ingress Controller ですが、 TraefikRancherHAProxy など。それぞれコントローラーは基本的な構成をサポートする必要がありますが、注釈を介して他の機能(例:書き換えルール、認証モード)を公開することもできます。

ドメイン名を指定し、TLSを有効にします。 LetsEncrypt は無料のTLS認証局であり、 kube-lego を使用しますコントローラでは、Ingress定義に数行追加するだけで、パブリックドメイン名のLetsEncrypt証明書を自動的に要求および更新できます。

これが正しく機能するためには、パブリックドメイン名が必要であり、Nginxサービスの外部IPを指すAレコードが必要です。

ただし、クラスタドメイン内に限定するため(svc.cluster.local)、 CoreDNS が必要になる場合があります。

0
VonC