You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中Secret缺失MYSQL_KEY及Skaffold部署顺序问题

问题详情

我有一个用于创建MySQL Pod所需mysql-secret的YAML文件:

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

之前我通过命令kubectl create secret generic mysql-secret --from-literal MYSQL_KEY=11111创建的Secret包含MYSQL_KEY字段,auth服务的Deployment可以正常引用这个字段:

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创建的Secret没有MYSQL_KEY,导致部署时出现错误:

- 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,}

如果删除auth Deployment中的key: MYSQL_KEY字段,又会触发必填项错误:

- 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,这个方法可行。现在想知道怎么配置Skaffold,让它自动先执行kubectl apply -f mysql-secret.yaml,再部署其他YAML文件?当前我的Skaffold配置如下:

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:调整资源部署顺序

Skaffold会按照rawYaml列表里的顺序依次部署资源,默认通配符./infra/k8s/*会按文件名的字母顺序处理文件。你可以把mysql-secret.yaml的路径显式放在最前面,确保它被优先部署:

manifests:
  rawYaml:
  - ./infra/k8s/mysql-secret.yaml
  - ./infra/k8s/*

这样Skaffold会先创建mysql-secret,再部署其他所有资源,避免依赖缺失的问题。

方式2:使用部署前钩子

如果需要更灵活的控制(比如在部署前执行自定义命令),可以在Skaffold配置的deploy部分添加before钩子,指定在部署所有资源前先执行secret的创建命令:

deploy:
  kubectl: {}
  kubeContext: kind-kind
  hooks:
    before:
      - command: ["kubectl", "apply", "-f", "./infra/k8s/mysql-secret.yaml"]
        type: command

这个钩子会在Skaffold开始部署其他资源前,自动执行kubectl apply命令创建secret。

内容的提问来源于stack exchange,提问作者best_of_man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:45:36