首页 > 编程问答 >SQLCMD 密码中的 K8S 秘密用法始终为空

SQLCMD 密码中的 K8S 秘密用法始终为空

时间:2024-06-12 22:25:29浏览次数:23  
标签:sql-server kubernetes sqlconnection kubernetes-secrets

我试图使用 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 命令中密码的使用方式上。

以下是可能导致此问题的原因以及如何解决此问题的分步指南:

  1. 特殊字符的处理: 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

相关文章

  • 使用 KubeKey v3.1.1 离线部署原生 Kubernetes v1.28.8 实战
    今天,我将为大家实战演示,如何基于操作系统openEuler22.03LTSSP3,利用KubeKey制作Kubernetes离线安装包,并实战离线部署Kubernetesv1.28.8集群。实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)主机名IPCPU内存系统盘数据盘用途ksp-control-11......
  • 云原生Kubernetes系列项目实战-k8s集群+高可用负载均衡层+防火墙
    一、Kubernetes区域可采用Kubeadm方式进行安装:名称主机部署服务master192.168.91.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.91.11docker、kubeadm、kubelet、kubectl、flannelnode02192.168.91.20docker、kubeadm、kubelet、kubectl、flannel1.系统初......
  • 【K8s】专题五(1):Kubernetes 配置之 ConfigMap
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、主要特性三、资源清单(示例)四、常用操作一、基本介绍在Kubernetes中,ConfigMap是一种用于存储非敏感信息的资源对象,提供了向Pod......
  • 云原生周刊:Kubernetes 十周年 | 2024.6.11
    开源项目推荐KubernetesGoatKubernetesGoat是一个故意设计成有漏洞的Kubernetes集群环境,旨在通过交互式实践场地来学习并练习Kubernetes安全性。kube-state-metrics(KSM)kube-state-metrics是一个用于收集Kubernetes集群状态信息的开源项目,它能够提供各种有用的指......
  • Aws EC2,kubeadm方式安装kubernetes(k8s)
    版本docker版本:20.10.25k8s版本(kubeadm,kubelet和kubectl):1.20.10-0初始化#禁用SELinuxsudosetenforce0sudosed-i's/^SELINUX=enforcing$/SELINUX=permissive/'/etc/selinux/config#关闭防火墙sudosystemctlstopfirewalldsudosystemctldisablefirewal......
  • 避免 OOMKilled:在 Kubernetes 环境中优化 Java 进程的内存配置
    避免OOMKilled:在Kubernetes环境中优化Java进程的内存配置DevOps云学堂译 奇妙的Linux世界 2024-06-1009:53 重庆 听全文公众号关注 「奇妙的Linux世界」设为「星标」,每天带你玩转Linux! 管理KubernetesPod中运行的Java进程的内存使用情况比人们想象......
  • 使用Python进行容器编排【Docker Compose与Kubernetes的比较】
    ......
  • OPA Gatekeeper:Kubernetes的策略和管理
    目录一.系统环境二.前言三.OPAGatekeeper简介四.在kubernetes上安装OPAGatekeeper五.gatekeeper规则5.1使用gatekeeper禁止某些网站的镜像创建pod5.2使用gatekeeper禁止创建LoadBalancer类型的Services服务六.总结一.系统环境本文主要基于Kubernetes1.22.2和Linux操作系统Ub......
  • 超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时
    >作者:尹珉,KubeSphereAmbassado,rKubeSphereContributor,KubeSphere社区用户委员会杭州站站长。踏上Containerd技术之旅容器技术已经成为现代软件开发和部署的核心工具。通过容器,开发者可以创建轻量级、便携的运行环境,从而简化应用程序的开发、测试和部署流程。在容器技术......
  • kubernetes 集群开启审计日志
    原文链接:https://maoqide.live/posts/cloud/kubernetes-auditKubernetes审计关于Kubernetes审计的详细信息,可以查看官方文档:https://kubernetes.io/zh-cn/docs/tasks/debug-application-cluster/audit/简单来说,kube-apiserver能够记录所有请求到集群的请求和响应。根据你配......