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を操作できるようにしたいと思います(クラスターの外部で実行されますが、コンピューター上でローカルに実行されます)。
ローカル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
問題はあなたが置いた種類のサービスにあるかもしれません。 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 。