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

