正如我发表的评论中所说:
事实上,您的Deployment 以Status: CreateContainerConfigError 开头就失败了。您的Deployment 是在Secret 之前从ServiceBinding 创建的。它仅在 ServiceBinding 的 Secret 可用时重新创建时起作用。
我想举例说明为什么Deployment 没有失败。
发生了什么(按顺序简化):
-
Deployment -> 创建并产生了一个 Pod
-
Pod -> pod 失败,状态为:CreateContainerConfigError 缺少 Secret
-
ServiceBinding -> 在后台创建 Secret
-
Pod 获取所需的Secret 并开始
前面提到的InstallOrder 将留下ServiceInstace 和ServiceBinding 作为最后一个评论line 147。
示例
假设:
- 有一个工作的 Kubernetes 集群
- Helm3 已安装并可以使用
以下指南:
templates/ 目录中有一个 Helm 图表,其中包含以下文件:
ServiceInstance
ServiceBinding
Deployment
文件:
ServiceInstance.yaml:
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
name: example-instance
spec:
clusterServiceClassExternalName: redis
clusterServicePlanExternalName: 5-0-4
ServiceBinding.yaml:
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
name: example-binding
spec:
instanceRef:
name: example-instance
Deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ubuntu
spec:
selector:
matchLabels:
app: ubuntu
replicas: 1
template:
metadata:
labels:
app: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu
command:
- sleep
- "infinity"
# part below responsible for getting secret as env variable
env:
- name: DATA
valueFrom:
secretKeyRef:
name: example-binding
key: host
应用上述资源来检查正在发生的事情可以通过两种方式完成:
- 第一种方法是使用
timestamp from $ kubectl get RESOURCE -o yaml
- 第二种方法是使用
$ kubectl get RESOURCE --watch-only=true
第一种方法
如前所述,Deployment 中的Pod 无法启动,因为当Pod 尝试生成时,Secret 不可用。在Secret 可用后,Pod 启动。
Pod 的状态如下:
Pending
ContainerCreating
CreateContainerConfigError
Running
这是一个时间戳为Pod和Secret的表格:
| Pod | Secret |
|-------------------------------------------|-------------------------------------------|
| creationTimestamp: "2020-08-23T19:54:47Z" | - |
| - | creationTimestamp: "2020-08-23T19:54:55Z" |
| startedAt: "2020-08-23T19:55:08Z" | - |
您可以通过调用以下命令获取此时间戳:
$ kubectl get pod pod_name -n namespace -o yaml
$ kubectl get secret secret_name -n namespace -o yaml
您还可以通过以下方式获取更多信息:
$ kubectl get event -n namespace
$ kubectl describe pod pod_name -n namespace
第二种方法
此方法需要在运行 Helm 图表之前进行准备。打开另一个终端窗口(对于这种特殊情况 2)并运行:
$ kubectl get pod -n namespace --watch-only | while read line ; do echo -e "$(gdate +"%H:%M:%S:%N")\t $line" ; done
$ kubectl get secret -n namespace --watch-only | while read line ; do echo -e "$(gdate +"%H:%M:%S:%N")\t $line" ; done
然后应用您的 Helm 图表。
免责声明!
上面的命令将监视资源的变化,并用操作系统的时间戳显示它们。请记住,此命令仅用于示例目的。
Pod 的输出:
21:54:47:534823000 NAME READY STATUS RESTARTS AGE
21:54:47:542107000 ubuntu-65976bb789-l48wz 0/1 Pending 0 0s
21:54:47:553799000 ubuntu-65976bb789-l48wz 0/1 Pending 0 0s
21:54:47:655593000 ubuntu-65976bb789-l48wz 0/1 ContainerCreating 0 0s
-> 21:54:52:001347000 ubuntu-65976bb789-l48wz 0/1 CreateContainerConfigError 0 4s
21:55:09:205265000 ubuntu-65976bb789-l48wz 1/1 Running 0 22s
Secret 的输出:
21:54:47:385714000 NAME TYPE DATA AGE
21:54:47:393145000 sh.helm.release.v1.example.v1 helm.sh/release.v1 1 0s
21:54:47:719864000 sh.helm.release.v1.example.v1 helm.sh/release.v1 1 0s
21:54:51:182609000 understood-squid-redis Opaque 1 0s
21:54:52:001031000 understood-squid-redis Opaque 1 0s
-> 21:54:55:686461000 example-binding Opaque 6 0s
其他资源: