我有以下用于创建mysql-secret
部署mysql
pod 的文件。
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_SQL
向secret.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
,并且成功了。我的问题是,我该如何说skafoold
请kubectl 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 容器所需的所有必要配置。在验证阶段,它会尝试使用 来查找secretKeyRef
,name
但key
无法在 kubernetes 集群中找到导致 的那些机密CreateContainerConfigError
。
1)复现错误CreateContainerConfigError
2)如何检查容器日志以查找丢失的 Kubernetes Secret
3)创建并应用正确的 kubernetes secret
4)修复 kubernetes secret 后重新运行 kubernetes 部署
5)使用命令查看 POD 日志来调试 CreateContainerConfigError kubectl describe Pod
。
请通过解决 CreateContainerConfig 错误了解更多信息。