如何从指定ConfigMap提取证书文件并应用于其他ConfigMap及Pod
如何从指定ConfigMap提取证书文件并应用于其他ConfigMap及Pod
别担心,我来一步步教你怎么操作,全程用kubectl就能搞定所有流程:
第一步:将目标ConfigMap中的证书导出到本地文件
你可以用kubectl的jsonpath或者jq工具来提取kubelet-serving-ca里的ca-bundle.crt内容,输出到本地文件:
方式一:用kubectl jsonpath(无需额外工具)
kubectl get configmap kubelet-serving-ca -n openshift-kube-apiserver -o jsonpath='{.data.ca-bundle\.crt}' > ca-bundle.crt
注意这里的\.是转义符号,用来处理证书文件名里的点,避免被jsonpath当成路径分隔符。
方式二:用jq工具(如果你的环境安装了jq)
kubectl get configmap kubelet-serving-ca -n openshift-kube-apiserver -o json | jq -r '.data["ca-bundle.crt"]' > ca-bundle.crt
执行完后,本地就会生成一个ca-bundle.crt文件,你可以用cat ca-bundle.crt检查内容是否正确。
第二步:将证书导入到目标ConfigMap
接下来把本地的证书文件导入到你需要的ConfigMap里,分两种情况:
情况1:创建新的ConfigMap
kubectl create configmap my-target-ca -n <你的目标命名空间> --from-file=ca-bundle.crt=./ca-bundle.crt
记得把<你的目标命名空间>替换成实际要使用的命名空间,比如你的应用所在的namespace。
情况2:更新已存在的ConfigMap
如果已经有一个要更新的ConfigMap,可以用dry-run生成yaml再应用:
kubectl create configmap my-target-ca -n <你的目标命名空间> --from-file=ca-bundle.crt=./ca-bundle.crt --dry-run=client -o yaml | kubectl apply -f -
这样就能覆盖原有ConfigMap里的对应证书内容。
第三步:让Pod挂载并使用这个证书文件
要让Pod能访问到这个证书,需要在Pod的部署配置里添加volume和volumeMounts配置,示例片段如下:
apiVersion: v1 kind: Pod metadata: name: my-app-pod namespace: <目标命名空间> spec: containers: - name: my-app-container image: your-app-image:tag # 挂载证书到Pod内的指定路径 volumeMounts: - name: ca-cert-volume mountPath: /path/in/pod/ca-bundle.crt # 替换成你Pod里需要的实际路径 subPath: ca-bundle.crt # 只挂载单个文件,避免覆盖整个目录 # 定义要挂载的ConfigMap卷 volumes: - name: ca-cert-volume configMap: name: my-target-ca # 对应刚才创建/更新的ConfigMap名称
配置完成后,重新部署Pod,就能在指定的/path/in/pod/ca-bundle.crt路径下访问到证书文件了。
额外小贴士
- 如果是在OpenShift环境中,默认的ServiceAccount通常有访问同namespace下ConfigMap的权限,要是遇到权限问题,可以检查一下Role/RoleBinding配置。
- 导出证书后可以先验证下内容,避免出现编码或截断问题。
备注:内容来源于stack exchange,提问作者Syirtblplmj
相关产品推荐
相关产品推荐

