在 Secret default/mysql-secret 中找不到密钥 MYSQL_KEY

在 Secret default/mysql-secret 中找不到密钥 MYSQL_KEY

我有以下用于创建mysql-secret部署mysqlpod 的文件。

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  mysql-password: MTExMTEx
  mysql-root-password: MTExMTEx
  mysql-user: YQ==

问题是,以前我可以使用此命令创建的密钥在集群mysql上部署:Kubernetes

kubectl create secret generic mysql-secret --from-literal MYSQL_KEY=11111

MYSQL_KEY可以将它传递给其他deployment文件,auth如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: auth
          env:
            - name: MYSQL_URI
              value: 'mysql://auth-mysql-srv:3306/users_auth'
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: MYSQL_KEY

但是现在我没有使用文件yaml来创建密钥的密钥,因此出现以下错误:

 - deployment/auth-mysql-depl is ready. [3/5 deployment(s) still pending]
 - deployment/mysql: container mysql in error: &ContainerStateWaiting{Reason:CreateContainerConfigError,Message:couldn't find key MYSQL_KEY in Secret default/mysql-secret,}
    - pod/mysql-78bbf5f6f4-vbpkz: container mysql in error: &ContainerStateWaiting{Reason:CreateContainerConfigError,Message:couldn't find key MYSQL_KEY in Secret default/mysql-secret,}

我如何key: MY_SQLsecret.yaml文件添加属性或找到一种方法将其从使用它的其他deployment文件中删除?auth

如果我只是key: MYSQL_KEY从 authdeployment文件中删除,我会收到此错误:

 - The Deployment "auth-depl" is invalid: spec.template.spec.containers[0].env[1].valueFrom.secretKeyRef.key: Required value

skaffold dev编辑:我尝试在使用命令运行之前创建机密kubectl apply -f mysql-secret.yaml,并且成功了。我的问题是,我该如何说skafooldkubectl apply -f在运行mysql-secret.yaml其他yaml文件之前先运行文件?

apiVersion: skaffold/v4beta1
kind: Config
build:
  artifacts:
  - image: auth
    context: auth-service
    sync:
      manual:
      - src: src/**/*.ts
        dest: .
    docker:
      dockerfile: Dockerfile
  - image: client
    context: client-service
    sync:
      manual:
      - src: lib/**/*.dart
        dest: .
    docker:
      dockerfile: Dockerfile
  local:
    push: false
manifests:
  rawYaml:
  - ./infra/k8s/*
deploy:
  kubectl: {}
  kubeContext: kind-kind

答案1

此错误的常见原因:

1)缺少 ConfigMap—ConfigMap 将配置数据存储为键值对。

解决 :识别缺失的 ConfigMap 并在命名空间中创建它,或者挂载另一个现有的 ConfigMap。

2)秘密失踪—Secret 用于存储凭证等敏感信息。

解决 :识别缺失的 Secret 并在命名空间中创建它,或者挂载另一个现有的 Secret。

尝试以下可能的解决方案:

解决方案 1:

原因是当我们创建 secret 时,它将整个文本视为一个字符串,就像 config.yaml 一样,它不以用户名或密码作为密钥。为了解决这个问题,我们需要通过 base64 获取解码的字符串

echo 'test' | base64  --->  dGVzdAo=

那么正确的 yaml 文件是:

apiVersion: v1kind: Secretmetadata:  name:  test-stg-secret
type: Opaque
data:
    username: dGVzdAo=
    password:  dGVzdAo=

请通过Henry Xie 的博客 & 相似的所以了解更多信息。

解决方案2: 您需要了解是否缺少 ConfigMap 或 Secret。运行kubectl describe pod <podname> -n <namespace>,您可能会看到失败的原因。

运行以下命令之一来查看所请求的 ConfigMap 或 Secret 是否存在于集群中:

<pre”>kubectl get configmap kubectl get secret

如果命令返回 null,则表示 ConfigMap 或 Secret 确实缺失。请按照以下说明创建由失败的容器挂载的缺失对象:创建 ConfigMap或者创建一个秘密

如果 pod 尚未启动,那么您无法执行 pod,在这种情况下运行kubectl get pods -o wide并检查 pod 被调度到哪个节点。

转到该节点并运行docker ps -a并获取容器 ID 所需容器,然后检查docker logs -f <container id>。注意:(您可以通过 ssh 进入节点。)

请通过修复 CreateContainerConfig 错误了解更多信息

解决方案 3:在容器进入运行状态之前,它会检查部署配置并验证成功部署 docker 容器所需的所有必要配置。在验证阶段,它会尝试使用 来查找secretKeyRefnamekey无法在 kubernetes 集群中找到导致 的那些机密CreateContainerConfigError

1)复现错误CreateContainerConfigError

2)如何检查容器日志以查找丢失的 Kubernetes Secret

3)创建并应用正确的 kubernetes secret

4)修复 kubernetes secret 后重新运行 kubernetes 部署

5)使用命令查看 POD 日志来调试 CreateContainerConfigError kubectl describe Pod

请通过解决 CreateContainerConfig 错误了解更多信息。

相关内容