Kubernetes の外部から MongoDB Database リソースへの接続
次の手順では、Kubernetes クラスターの外部から Kubernetes に配置された MongoDB リソースに接続する方法について説明します。
前提条件
互換性のある MongoDB バージョン
Kubernetes 外からデータベースにアクセスするには、MongoDB 4.2.3 以降を実行する必要があります。
Considerations
Readness Probe の上書きの設定
Kubernetes Operator によって配置された MongoDB カスタム リソースへの外部アクセスを必要とするカスタム サービスを作成し、Kubernetes で準備状況検証を使用する場合は、Kubernetes の publishNotReadyAddresses
設定をtrue
に設定します。
publishNotReadyAddresses
設定は、このサービスのエンドポイントを操作するエージェントが、サービスの ready 状態を無視する必要があることを示します。publishNotReadyAddresses
を true
に設定すると、サービスをホストしているポッド用に構成された準備状況の動作が上書きされます。
デフォルトでは、 publishNotReadyAddresses
設定はfalse
に設定されています。 この場合、MongoDB KubernetesOperator で カスタム リソースをホストするポッドがCloud Manager またはMongoDB Ops Manager への接続を失うと、これらのポッドに構成された準備状況は失敗します。ただし、 publishNotReadyAddresses
の設定をtrue
に設定すると、次の効果が生じます。
Kubernetes は、準備状況調査に失敗したサービスをシャットダウンしません。
Kubernetes はすべてのエンドポイントを 準備完了 と見なします これらのエンドポイントのサービスをホストしているポッドの検証が、準備ができていないことを示していても。
MongoDB のカスタム リソースは、読み取りおよび書込み操作で引き続き使用できます。
手順
次の手順では、 Kubernetes Operator に組み込まれている構成オプションを使用して、配置の外部接続を構成するプロセスについて説明します。
Kubernetes Operator が Kubernetes クラスターの外部から配置した MongoDB リソースにどのように接続するかは、リソースによって異なります。
Kubernetes クラスターの外部から Kubernetes Operator が配置した MongoDB スタンドアロン リソースに接続するには:
Kubernetes Operator を使用してスタンドアロン リソースを配置します。
スタンドアロン リソースを配置していない場合は、手順に従って、 がスタンドアロン リソースを配置します。
この手順では、次の例を使用します。
20 21 apiVersion: mongodb.com/v1 22 kind: MongoDB 23 metadata: 24 name: <my-standalone> 25 spec: 26 version: "4.2.2-ent" 27 opsManager: 28 configMapRef: 29 name: <configMap.metadata.name> 30 # Must match metadata.name in ConfigMap file 31 credentials: <mycredentials> 32 type: Standalone 33 ...
MongoDB ポッドの外部サービスを作成します。
外部リソースからスタンドアロン リソースに接続するには、 spec.externalAccessを構成します 設定:
externalAccess: {}
この設定は、Kubernetes Operator に外部 LoadBalancer を作成するように指示します スタンドアロン リソース内の MongoDB ポッドのサービス。外部サービスは、外部接続のエントリポイントを提供します。 値なしでこの設定を追加すると、次のデフォルト値を持つ外部サービスが作成されます。
フィールド | 値 | 説明 |
---|---|---|
Name | <pod-name>-svc-external | 外部サービスの名前。 この値は変更できません。 |
Type | LoadBalancer | 外部 LoadBalancer を作成します service |
Port | <Port Number> | mongod のポート。 |
publishNotReadyAddress | true | DNS レコード を指定する は、Ped が準備ができていない場合でも作成されます。どのデータベース ポッドでも false に設定しないでください。 |
オプションとして、サービスに値を追加したり、デフォルト値を上書きしたりする必要がある場合は、次を指定します。
クラウドプロバイダーに固有の注釈( )
spec.externalAccess.externalService.annotations
サービス仕様のオーバーライド(
spec.externalAccess.externalService.spec
。
たとえば、次の設定は外部サービスのデフォルト値を上書きし、スタンドアロン リソースを構成して NodePort サービス を作成します。 MongoDB ポッドを公開する:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
詳細については、 注釈 を参照してください および ServiceSpec (Kubernetes ドキュメント)。
外部サービスを確認します。
スタンドアロン リソースで次のコマンドを実行して、Kubernetes Operator が配置用の外部サービスを作成したことを確認します。
kubectl get services
このコマンドは、次の出力のようなサービスのリストを返します。 Kubernetes Operator は、クラスター内の各データベース<pod-name> ポッドに対して、"pod-name"-0-svc-external という名前の外部サービスを作成します。このサービスは、外部サービス仕様で指定した値とオーバーライドに従って構成されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-standalone>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
クラスター構成またはクラウドプロバイダーによっては、LoadBalancer サービスの IP アドレスは外部からアクセス可能な IP アドレスまたは FQDNになります。 IP アドレスまたはFQDNを使用して、外部ドメインからのトラフィックをルーティングできます。
重要
この手順では、外部接続を有効にする最も簡単な方法について説明します。 本番環境では他のユーティリティを使用できます。
Kubernetes クラスターの外部から Kubernetes Operator が配置した MongoDB レプリカセット リソースに接続するには、次の手順に従います。
Kubernetes Operator を使用してレプリカセットを配置します。
レプリカセットを配置していない場合は、手順に従ってレプリカセットを配置します。
設定の値を指定して、レプリカセットでspec.security.certsSecretPrefix
TLS を有効にする必要があります。レプリカセットでは、 に保存されているカスタム CA spec.security.tls.ca
証明書を使用する必要があります。
MongoDB ポッドの外部サービスを作成します。
外部リソースからレプリカセットに接続するには、 spec.externalAccessを構成します 設定:
externalAccess: {}
この設定は、Kubernetes Operator に外部 LoadBalancer を作成するように指示します サービスを使用して、レプリカセット内の MongoDB ポッドに接続します。外部サービスは、外部接続のエントリポイントを提供します。 値なしでこの設定を追加すると、次のデフォルト値を持つ外部サービスが作成されます。
フィールド | 値 | 説明 |
---|---|---|
Name | <pod-name>-svc-external | 外部サービスの名前。 この値は変更できません。 |
Type | LoadBalancer | 外部 LoadBalancer を作成します service |
Port | <Port Number> | mongod のポート。 |
publishNotReadyAddress | true | DNS レコード を指定する は、Ped が準備ができていない場合でも作成されます。どのデータベース ポッドでも false に設定しないでください。 |
オプションとして、サービスに値を追加したり、デフォルト値を上書きしたりする必要がある場合は、次を指定します。
クラウドプロバイダーに固有の注釈( )
spec.externalAccess.externalService.annotations
サービス仕様のオーバーライド(
spec.externalAccess.externalService.spec
。
たとえば、次の設定は外部サービスのデフォルト値を上書きし、 NodePort サービス を作成するようにレプリカセットを構成します。 MongoDB ポッドを公開する:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
詳細については、 注釈 を参照してください および ServiceSpec (Kubernetes ドキュメント)。
外部サービスを確認します。
レプリカセットで次のコマンドを実行して、Kubernetes Operator が配置用の外部サービスを作成したことを確認します。
kubectl get services
このコマンドは、次の出力のようなサービスのリストを返します。 Kubernetes Operator は、クラスター内の各データベース<pod-name> <pod-idx>ポッドに対して、[pod-name]-[pod-idx]-svc-external という名前の外部サービスを作成します。このサービスは、外部サービス仕様で指定した値とオーバーライドに従って構成されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-replica-set>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
クラスター構成またはクラウドプロバイダーによっては、LoadBalancer サービスの IP アドレスは外部からアクセス可能な IP アドレスまたはFQDNになります。 IP アドレスまたはFQDNを使用して、外部ドメインからのトラフィックをルーティングできます。
サンプルレプリカセットリソースをコピーします。
このYAMLファイルの設定を、必要なレプリカセット構成に合わせて変更します。
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-replica-set> 6 spec: 7 members: 3 8 version: "4.2.2-ent" 9 type: ReplicaSet 10 opsManager: 11 configMapRef: 12 name: <configMap.metadata.name> 13 credentials: <mycredentials> 14 persistent: true
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
コピーした例セクションを既存のレプリカセットリソースに貼り付けます。
希望のテキストエディタを開き、 オブジェクト を貼り付けます 指定 セクションのリソースspec
ファイルの末尾にあります。
強調表示された設定を希望する値に変更します。
キー | タイプ | 必要性 | 説明 | 例 |
---|---|---|---|---|
spec.connectivity | コレクション | 条件付き | Kubernetes 外でデータベースにアクセスする必要がある場合は、このパラメータと値を追加します。 この設定により、Kubernetes クラスター内と Kubernetes クラスターに対して異なるDNS設定を提供できます。 Kubernetes Operator は、レプリカセット ノードに スプリット ホライゾンDNSを使用します。 この機能により、Kubernetes クラスター内と Kubernetes 外部からの両方で通信が可能になります。 ホストごとに複数の外部マッピングを追加できます。 スプリットホライゾンの要件
| |
spec.security | string | 必須 | MongoDB 配置のTLS証明書を含むシークレット名の <prefix> を追加します。 | devDb |
レプリカセット リソースで外部ホスト名と外部サービス値を確認します。
spec.connectivity.replicaSetHorizons
設定の外部ホスト名が正しいことを確認します。
外部ホスト名は、Kubernetes ワーカー ノードのDNS名と一致する必要があります。 これらは、Kubernetes クラスター内の任意のノードになります。 ポッドが別のノードで実行される場合、Kubernetes ノードは内部ルーティングを使用します。
spec.connectivity.replicaSetHorizons
のポートを外部サービス値に設定します。
例
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
レプリカセットの配置を更新して再起動します。
任意の ディレクトリで、次の Kubernetes コマンドを呼び出して、レプリカセットを更新して再起動します。
kubectl apply -f <replica-set-conf>.yaml
レプリカセットへの接続をテストします。
開発環境では、レプリカセット内の各ホストに対して、次のコマンドを実行します。
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 --ssl \ --sslAllowInvalidCertificates
注意
本番環境では--sslAllowInvalidCertificates
フラグを使用しないでください。
本番環境では、レプリカセット内の各ホストに対して、クライアント ツールまたはアプリケーションに安全に接続するためのTLS証明書とCAを指定します。
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 \ --tls \ --tlsCertificateKeyFile server.pem \ --tlsCAFile ca-pem
接続が成功すると、次の内容が表示されます。
Enterprise <my-replica-set> [primary]
Kubernetes クラスターの外部から Kubernetes Operator が配置した MongoDB のシャーディングされたクラスター リソースに接続するには、次の手順に従います。
Kubernetes Operator を使用してシャーディングされたクラスターを配置します。
シャーディングされたクラスターを配置していない場合は、手順に従ってシャーディングします。
次の設定を構成して、シャーディングされたクラスターのTLSを有効にする必要があります。
キー | タイプ | 必要性 | 説明 | 例 |
---|---|---|---|---|
spec.security | string | 必須 | MongoDB 配置のTLS証明書を含むシークレット名の <prefix> を追加します。 | devDb |
spec.security.tls | コレクション | 任意 | この配置内の各ポッドへのTLS証明書に追加する必要があるすべてのドメインのリスト。 このパラメーターを設定すると、Kubernetes Operator が TLS 証明書に変換するすべての CSR に、形式 の SAN が含まれ <pod
name>.<additional cert domain> 。 | example.com |
ポッドの外部サービスを作成します。mongos
外部リソースからシャーディングされたクラスターに接続するには、 spec.externalAccessを設定します 設定:
externalAccess: {}
この設定は、Kubernetes Operator に外部 LoadBalancer を作成するように指示しますmongos
シャーディングされたクラスター内の ポッドのサービス外部サービスは、外部接続のエントリポイントを提供します。 値なしでこの設定を追加すると、次のデフォルト値を持つ外部サービスが作成されます。
フィールド | 値 | 説明 |
---|---|---|
Name | <pod-name>-svc-external | 外部サービスの名前。 この値は変更できません。 |
Type | LoadBalancer | 外部 LoadBalancer を作成します service |
Port | <Port Number> | mongod のポート。 |
publishNotReadyAddress | true | DNS レコード を指定する は、Ped が準備ができていない場合でも作成されます。どのデータベース ポッドでも false に設定しないでください。 |
オプションとして、サービスに値を追加したり、デフォルト値を上書きしたりする必要がある場合は、次を指定します。
クラウドプロバイダーに固有の注釈( )
spec.externalAccess.externalService.annotations
サービス仕様のオーバーライド(
spec.externalAccess.externalService.spec
。
たとえば、次の設定は外部サービスのデフォルト値を上書きし、シャーディングされたクラスターを構成して NodePort サービス を作成するようにします。mongos
これは ポッドを公開します。
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
Tip
詳細については、 注釈 を参照してください および ServiceSpec (Kubernetes ドキュメント)。
TLS 証明書にサブジェクト代替名を追加します。
各外部DNS名を証明書SANに追加します。
各 MongoDB ホストは次のSANを使用します。
<my-sharded-cluster>-<shard>-<pod-index>.<external-domain> <my-sharded-cluster>-config-<pod-index>.<external-domain> <my-sharded-cluster>-mongos-<pod-index>.<external-domain>
mongos
インスタンスは次のSANを使用します。
<my-sharded-cluster>-mongos-<pod-index>-svc-external.<external-domain>
次の例のようにspec.security.tls.additionalCertificateDomains
設定を構成します。 使用する各TLS証明書には、シャード、コンフィギュレーションサーバー、またはmongos
インスタンスに対応するSANが含まれている必要があります。 Kubernetes Operator が構成を検証します。
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-sharded-cluster> 6 spec: 7 version: "4.2.2-ent" 8 opsManager: 9 configMapRef: 10 name: <configMap.metadata.name> 11 # Must match metadata.name in ConfigMap file 12 shardCount: 2 13 mongodsPerShardCount: 3 14 mongosCount: 2 15 configServerCount: 3 16 credentials: my-secret 17 type: ShardedCluster 18 externalAccess: {} 19 security: 20 tls: 21 certsSecretPrefix: <prefix> 22 additionalCertificateDomains: 23 - "<external-domain>" 24 ...
外部サービスを確認します。
シャーディングされたクラスターで次のコマンドを実行して、Kubernetes Operator が配置用の外部サービスを作成したことを確認します。
kubectl get services
このコマンドは、次の出力のようなサービスのリストを返します。 Kubernetes Operator は、クラスター内の各mongos
インスタンスに対して、 <pod-name>-<pod-idx>-svc-external
という名前の外部サービスを作成します。 This service is configured according to the values and overrides you provide in the external service specification.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-sharded-cluster>-mongos-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s <my-sharded-cluster>-mongos-1-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
クラスター構成またはクラウドプロバイダーによっては、LoadBalancer サービスの IP アドレスは外部からアクセス可能な IP アドレスまたはFQDNになります。 IP アドレスまたはFQDNを使用して、外部ドメインからのトラフィックをルーティングできます。 この例には 2 つのmongos
インスタンスがあるため、Kubernetes Operator は 2 つの外部サービスを作成しています。
シャーディングされたクラスターへの接続をテストします。
Kubernetes クラスターの外部から配置に接続するには、MongoDB Shell( mongosh
)を使用し、外部ドメインを通じて公開したmongos
インスタンスのアドレスを指定します。
例
<my-sharded-cluster>-mongos-0-svc-external.<external-domain>
と<my-sharded-cluster>-mongos-1-svc-external.<external-domain>
addressCommand の外部 FQDN がある場合:MongoDB ://[my-sharded-cluster]>-mongos-<my-sharded-cluster> -svc-external.{external-domain>、[my-sharded-cluster] -mongos-0<external-domain> <my-sharded-cluster>1-svc-external.<external-domain> ,次のコマンドを使用して、Kubernetes クラスターの外部からこのシャーディングされたクラスターのインスタンスに接続できます。
mongosh ""