我正在尝试在我的本地 Docker Desktop 实例上运行 SQL Server,当以 Kubernetes 模式运行时,我收到了一个奇怪的错误。我的 k8s.yaml 文件有错误吗?
如果我用 docker-compose up
和这个 yaml 启动它,它工作正常:
version: '3'
services:
db:
image: "mcr.microsoft.com/mssql/server:2019-latest"
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=C@mpl3xEn0#gh!
ports:
- "1433:1433"
network_mode: bridge
然后我使用 sqlcmd -U sa -P C@mpl3xEn0#gh 测试连接! -S localhost,1433
连接正常。
如果我按照 https://learn.microsoft.com/en-us/sql/linux/tutorial-sql-server-containers-kubernetes 中的说明使用 kubectl apply -f k8s.yaml
启动它我收到连接错误:
# based loosely on https://learn.microsoft.com/en-us/sql/linux/tutorial-sql-server-containers-kubernetes#create-the-deployment
apiVersion: v1
kind: Pod
metadata:
name: db
spec:
containers:
- name: db
image: mcr.microsoft.com/mssql/server:2019-latest
ports:
- containerPort: 1433
env:
- name: ACCEPT_EULA
value: 'Y'
- name: SA_PASSWORD
value: C@mpl3xEn0#gh!
resources: {}
---
apiVersion: v1
kind: Service
metadata:
name: db
spec:
type: NodePort
selector:
app: db
ports:
- protocol: TCP
port: 1433
targetPort: 1433
然后我尝试使用 sqlcmd -U sa -P C@mpl3xEn0#gh 从我的本地机器连接! -S localhost,31043
(从 kubectl get svc/db
交换 NodePort),我得到错误:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)
我从 Azure Data Studio 和 SSMS 得到同样的错误。
如果我 kubectl exec ...
进入容器并运行 /opt/mssql-tools/bin/sqlcmd -U sa -P C@mpl3xEn0#gh! -S localhost,1433
连接正常。
导致 SQL Server 在 Kubernetes 中运行时不接受连接的 k8s.yaml 文件中的错误在哪里?
我试过设置 encrypt=false;trustServerCertificate=true;
结果没有改变。
最佳答案
错别字又惹我生气了。这是缺少的 yaml:
...
metadata:
name: db
labels: # <--
app: db # <--
spec:
...
我忘记了 labels:
部分。因此,该服务小心地将流量转发到没有进行 TLS 握手的任何内容,并向我提供了错误的错误。
关于sql-server - kubernetes : an error occurred during the pre-login handshake 上的 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64917058/