我试图使用 K8S secret 密码连接到 SQL 服务器,但无论我使用什么语法或方法,密码总是空的。如果我硬编码密码,则一切正常。
我还可以使用此命令在 POD 中打印密码,它还会返回存储在密码中的密码,因此 POD 可以实际访问密码。
kubectl exec -it podname -- printenv MSSQL_SA_PASSWORD
我试图运行这个小的健康检查。
start-sql.sh:|
#!/bin/bash
# 在后台启动 SQL 服务器
/opt/mssql/bin/sqlservr &;
echo "正在使用的密码是:$MSSQL_SA_PASSWORD";
echo "等待 SQL Server 启动...";
for i in {1..120}; do
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -Q "SELECT 1";
if [ $? -eq 0 ]; then
echo "SQL Server is up and running.";
断开
否则
echo -n ".";
睡眠 1
fi
完成
apiVersion: apps/v1.
apiVersion: apps/v1
类型:StatefulSet
元数据:
name: ${LOWERASSET}
labels:
app:${ASSET}
spec:
复制:1
服务名称:${LOWERASSET}
selector:
matchLabels:
应用程序:${ASSET}
模板:
元数据:
labels:
app:${ASSET}
spec:
securityContext:
fsGroup:10001
initContainers:
- 名称: init-sql
图像: ${IMAGE}
资源:
requests:
CPU: "200m";
内存: "2Gi";
限制:
cpu: "500m";
内存:"4Gi";
命令:命令:["/bin/bash", "/mnt/init/start-sql.sh"]
env:
- name: MSSQL_PID
值:开发人员
- name: ACCEPT_EULA
value: "Y";
- 名称: MSSQL_ENABLE_HADR
值: "1";
- 名称: MSSQL_AGENT_ENABLED
值:"1";
- name: MSSQL_SA_PASSWORD
valueFrom:
secretKeyRef:
名称: sql-server
key: pwd
volumeMounts:
- 名称: init-script
mountPath:/mnt/init
- 名称: ${LOWERASSET}
mountPath:/var/opt/mssql
容器:
- 名称: sqlserver
图像:${IMAGE}
资源:
requests:
CPU: "200m";
内存: "2Gi";
限制:
cpu: "500m";
内存:"4Gi";
端口:
- 容器端口:1433
名称: tcpsql
env:
- name: MSSQL_PID
值:开发人员
- name: ACCEPT_EULA
value: "Y";
- 名称: MSSQL_ENABLE_HADR
值: "1";
- 名称: MSSQL_AGENT_ENABLED
值:"1";
- name: MSSQL_SA_PASSWORD
valueFrom:
secretKeyRef:
名称: sql-server
key: pwd
volumeMounts:
- 名称: ${LOWERASSET}
mountPath:/var/opt/mssql
卷:
- name: init-script
configMap:
name: sql-init-script
volumeClaimTemplates:
- 元数据:
名称: ${LOWERASSET}
labels:
app:${ASSET}
备份:"${BACKUP}";
规格:
存储类别名称:加密-标准
accessModes:
- ReadWriteOnce
资源:
请求:
存储:8Gi
---
类型:服务
apiVersion: v1
元数据:
名称: ${LOWERASSET}
labels:
app:${ASSET}
规格
类型:集群IP
选择器
应用程序:${ASSET}
ports:
- 名称: tcpsql
协议: TCPTCP
端口1433
在 sqlcmd 中使用秘密的正确方法是什么?
看起来你在从 Kubernetes 密文中提取和使用 SQL Server 密码方面遇到了一些问题。好消息是你对问题的诊断是正确的——pod
可以
访问密码,问题出在
sqlcmd
命令中密码的使用方式上。
以下是可能导致此问题的原因以及如何解决此问题的分步指南:
-
特殊字符的处理:
Kubernetes 密文(特别是当它们使用默认的 base64 编码时)可以包含 shell 可能会解释为特殊字符的字符。当你将密码回显到 shell 或尝试直接在
sqlcmd
命令中使用它时,就会发生这种情况。
解决方案:
将密码传递给
sqlcmd
的最可靠方法是使用
-v
标志并将命令本身放在单引号中。这可以防止 shell 解释任何特殊字符。
bash
sqlcmd -S localhost -U sa -P "`printenv MSSQL_SA_PASSWORD`" -v password="$MSSQL_SA_PASSWORD" -Q 'SELECT 1'
2.
错误检查和调试:
调试此类问题至关重要。以下是一些可以帮助查明问题根源的其他步骤:
-
检查 sqlcmd 输出:
仔细检查
sqlcmd
命令的输出以获取任何错误消息。这可以提供有关身份验证失败原因的宝贵见解。 -
启用 sqlcmd 日志记录:
可以通过在
sqlcmd
命令中添加-l
标志来启用详细日志记录。这将创建一个包含有关连接尝试信息(包括发送的密码)的日志文件。 -
使用其他客户端进行测试: 尝试使用其他 SQL Server 客户端(例如 Azure Data Studio 或 SQL Server Management Studio)连接到的数据库,并使用从密钥中获取的密码。这可以帮助确定问题是否特定于
sqlcmd
。 -
最佳实践:
-
避免在脚本中使用密码: 虽然已经确定了问题,但请记住,在脚本中对密码进行硬编码通常是不好的做法。考虑使用 Kubernetes 密文或专用密钥管理解决方案等更安全的替代方案。
- 使用环境变量: 如的示例所示,使用环境变量将密码传递给脚本是一种很好的做法。这使可以在不更改代码的情况下轻松管理和旋转密钥。
通过实施这些更改并遵循这些调试步骤,应该能够解决问题并使用存储在 Kubernetes 密文中的密码成功连接到 SQL Server 实例。
标签:sql-server,kubernetes,sqlconnection,kubernetes-secrets From: 78602583