web-dev-qa-db-ja.com

Dockerデスクトップを使用してkubernetesクラスターを外部SQL Serverデータベースに接続するにはどうすればよいですか?

Kubernetesクラスターを、Kubernetesクラスターの外部のDockerイメージで実行されている外部SQL Serverデータベースに接続する方法を知る必要があります。

現在、クラスターに実行中の2つのポッドがあり、それぞれにasp.netコアアプリケーションから作成された異なるイメージが含まれています。 SQL Serverデータベースをホストする完全に別の(Kubernetesの外部にありますが、私のマシンのlocalhost、1433でローカルに実行されている)Dockerイメージがあります。そのデータベースにアクセスして操作できるようにするには、Kubernetesポッドのアプリケーションが必要です。 YAMLファイルを作成してさまざまなポートを構成しようとしましたが、これを機能させる方法や、設定後に実際に機能するかどうかをテストする方法がわかりません。クラスター内のイメージからDBへの接続をルーティングできるサービスを作成するための正確な手順/コマンドが必要です。

  • Docker SQL Serverの作成(高度なpowershell/dockerデスクトップ):

    docker pull mcr.Microsoft.com/mssql/server:2017-latest
    
    docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/Host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.Microsoft.com/mssql/server:2017-latest
    
  • definition.yaml

    #Pods in the cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container1
         image: username/image1
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container2
         image: username/image2
    
    ---
    #Service created in an attempt to contact external SQL Server DB
    apiVersion: v1
    kind: Service
    metadata:
     name: ext-sql-service
    spec:
     ports:
     - port: 1433
       targetPort: 1433
    type: ClusterIP
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
     name: ext-sql-service
    subsets:
     - addresses:
         - ip: (Docker IP for DB Instance)
       ports:
         - port: 1433
    

理想的には、kubernetesクラスター内のアプリケーションが、既に設定したSQL Serverを操作できるようにしたいと思います(クラスターの外部で実行されますが、コンピューター上でローカルに実行されます)。

3
C1pher6710

ローカルDockerから実行する場合、接続文字列はローカルマシンではありません。あなたのマシンでたまたま実行されているのは、ローカルのドッカーの「世界」です。

Host.docker.internal:1433

上記は、ローカルマシンと通信するdockerコンテナーです。明らかに、ポートは公開方法によって異なる場合があります。

…….

実行中のコンテナーに、Dockerワールドの内部で実行されているsql-serverと通信させる場合、その接続文字列は次のようになります。

サーバー名:

my-mssql-service-deployment-name。$ _ CUSTOMNAMESPACENAME.svc.cluster.local

$ _CUSTOMNAMESPACENAMEはおそらく「デフォルト」ですが、別の名前空間を実行している可能性があります。

my-mssql-service-deployment-nameはあなたのデプロイメントの名前です(ここでスタブします)

ここにはポート番号がないことに注意してください。

これはここに文書化されています:

https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

1
granadaCoder

問題はあなたが置いた種類のサービスにあるかもしれません。 ClusterIPを使用すると、クラスター内のポッド間で接続できます。外部サービスに接続するには、サービスの種類の定義をNodePortに変更するだけです。

サービス定義を変更してみてください:

#Service created in an attempt to contact external SQL Server DB
apiVersion: v1
kind: Service
metadata:
 name: ext-sql-service
spec:
 type: NodePort
 ports:
 - port: 1433
   targetPort: 1433

そしてコマンドを実行します:

$ kubectl apply -f your_service_definition_file_name.yaml 

デプロイメントが構成されている適切な名前空間でこのコマンドを実行することを忘れないでください。

悪い習慣は、環境変数をコンテナにオーバーレイすることです。そして、「docker run」を使用して、その環境変数[〜#〜] value [〜#〜]をコンテナーに渡します。

もちろん、Dockerコマンドを実行するコンテキストでは

$ docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/Host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.Microsoft.com/mssql/server:2017-latest

Db-passwordを表示することは安全ではありません。 Kubernetesシークレットを使用します。

詳細については、こちらをご覧ください kubernetes-secret

0
MaggieO